Foro sobre Java SE > imagen de fondo y reescalada
Sin echarle un vistazo al código que estás usando, es muy improbable que se puedan hacer recomendaciones.
El panel:
panel = new JPanel() {
public Dimension getPreferredSize() {
return tamImagenActual;
}
protected void paintComponent(Graphics g) {
g.drawImage(imagenActual, 0, 0, tamImagenActual.width, tamImagenActual.height, this);
setOpaque(false);
}
};
el metodo que reescala la imagen:
private void resizeImage(int incr)
{
factorZoomImagen += Math.signum(-incr) * 0.1;
int nuevoancho = (int) (tamImagenOriginal.getWidth() * factorZoomImagen);
int nuevoalto = (int) (tamImagenOriginal.getHeight() * factorZoomImagen);
if (nuevoancho == 0 || nuevoalto == 0) {
return;
}
imagenActual = imagenOriginal.getScaledInstance(nuevoancho, nuevoalto, Image.SCALE_FAST);
tamImagenActual.setSize(nuevoancho, nuevoalto);
viewport.setViewSize(tamImagenActual);
}
El viewport se definio como:
viewport = scrollp.getViewport();
y scrollp = new JScrollPane(panel)
Hola
Tengo un JPanel, el cual hace de mapa, es una imagen que leo de disco, y la pongo en el panel en el método paint(Grahipcs g)
Al mismo tiempo, sobre la imagen se puede hacer zoom, ampliandolo. Esto lo hago con el método getScaledInstance(int width, int height, int hints) de la clase Image.
El problema es que ese método va creando imágenes, y cuando estas nuevas imágenes son muy grandes, empieza a faltar memoria, al mismo tiempo que el reescalado es más lento y se produce un parpadeo en la visualización.
El reescalado lo hago con el "hint" SCALE_FAST.
Por otra parte ese escalado lo podría hacer de forma "manual" y consumiría menos memoria (solo la de la imagen original), pero me temo que sería bastante más lento, ya que para cada paint tendría que calcular el pixel respecto del original.
¿Alguna idea para consumir menos memoria y repintar más rápido?
Gracias.