estoy tratando de dejar que las imágenes de carga de usuarios de su disco duro, y presentarlas visualmente en la interfaz gráfica de usuario como una lista de miniaturas (JPanels con iconos añaden a un JList). Actualmente estoy usando ImageIO.read() para obtener un BufferedImage y el uso de getScaledInstance para cada imagen (oído que no se suponía que el uso sin embargo).Cargando imágenes grandes como miniaturas sin problemas de memoria en Java?
Funciona razonablemente bien con pequeñas imágenes, pero la carga de más de cuatro fotografías (5000x3000 o algo así) y me sale "java.lang.OutOfMemoryError: espacio de almacenamiento dinámico de Java". La referencia a la BufferedImage tamaño completo no se guarda, por lo que pensé que el recolector de basura sería disponer de él y sólo mantener la imagen escalada (que no debiera tener tanta memoria), pero no lo parece. Pisé getRuntime(). Gc() y System.gc() también, sin ningún efecto.
¿Alguna buena forma de cargar imágenes escaladas desde un archivo, sin ejecutar errores de memoria? Obviamente, muchos softwares logran hacer esto mismo, aunque tal vez no en Java. Las bibliotecas externas están bien.
código actual:
BufferedImage unscaledImage = ImageIO.read(imageFile);
int unscaledHeight = unscaledImage.getHeight();
int unscaledWidth = unscaledImage.getWidth();
int imageRatio = unscaledHeight/unscaledWidth;
if (imageRatio >= 1) {
return new ImageIcon(unscaledImage.getScaledInstance(width,-1,Image.SCALE_FAST));
} else {
return new ImageIcon(unscaledImage.getScaledInstance(-1,height,Image.SCALE_FAST));
}
excelente. Funciona muy bien usando ImageReadParam.getSourceSubSampling (wratio, hratio, 0, 0) a escala que antes de conseguir el BufferedImage con ImageReader.read (0, ImageReadParam). –
@ SWEn0thing. Genial, tendré que recordarlo para saber cómo obtener una miniatura. –
Necesitaba agregar llamar lo siguiente también.ImageReadParam params = reader.getDefaultReadParam(); reader.setInput (iis, true, true); params.setSourceSubsampling (ancho, alto, 0, 0); –