Uno de mis proyectos que acabo de muestrear la imagen, ya que se está leyendo desde un ImageStream sobre la marcha. El muestreo descendente reduce las dimensiones de la imagen a un ancho requerido de & de altura sin requerir costosos cálculos de cambio de tamaño o modificación de la imagen en el disco.
Como hago un down-sample de la imagen a un tamaño más pequeño, también reduce significativamente la potencia de procesamiento y la RAM requeridas para mostrarla. Para una optimización adicional, también renderizo la imagen en búfer en mosaicos ... Pero eso está un poco fuera del alcance de esta discusión. Pruebe lo siguiente:
public static BufferedImage subsampleImage(
ImageInputStream inputStream,
int x,
int y,
IIOReadProgressListener progressListener) throws IOException {
BufferedImage resampledImage = null;
Iterator<ImageReader> readers = ImageIO.getImageReaders(inputStream);
if(!readers.hasNext()) {
throw new IOException("No reader available for supplied image stream.");
}
ImageReader reader = readers.next();
ImageReadParam imageReaderParams = reader.getDefaultReadParam();
reader.setInput(inputStream);
Dimension d1 = new Dimension(reader.getWidth(0), reader.getHeight(0));
Dimension d2 = new Dimension(x, y);
int subsampling = (int)scaleSubsamplingMaintainAspectRatio(d1, d2);
imageReaderParams.setSourceSubsampling(subsampling, subsampling, 0, 0);
reader.addIIOReadProgressListener(progressListener);
resampledImage = reader.read(0, imageReaderParams);
reader.removeAllIIOReadProgressListeners();
return resampledImage;
}
public static long scaleSubsamplingMaintainAspectRatio(Dimension d1, Dimension d2) {
long subsampling = 1;
if(d1.getWidth() > d2.getWidth()) {
subsampling = Math.round(d1.getWidth()/d2.getWidth());
} else if(d1.getHeight() > d2.getHeight()) {
subsampling = Math.round(d1.getHeight()/d2.getHeight());
}
return subsampling;
}
Para obtener el ImageInputStream de un archivo, utilice:
ImageIO.createImageInputStream(new File("C:\\image.jpeg"));
Como se puede ver, esta aplicación respeta la relación de aspecto original de las imágenes también. Opcionalmente, puede registrar un IIOReadProgressListener para que pueda realizar un seguimiento de la cantidad de imágenes que se han leído hasta el momento. Esto es útil para mostrar una barra de progreso si la imagen se lee en una red, por ejemplo ... No es necesario, solo puede especificar nulo.
¿Por qué es esto de particular relevancia para su situación? Nunca lee la imagen completa en la memoria, tanto como lo necesita para que se pueda mostrar con la resolución deseada. Funciona muy bien para imágenes enormes, incluso aquellas que son 10 de MB en disco.
piruleta: Lo siento, pero * a) * no está respondiendo (de ahí el -1) y * b) * Su comentario * que es "irrelevante" * es ALTAMENTE ** ** engañosa (lástima No puedo dar -2). El problema de la OP es, obviamente, que la compresión JPEG es ** ** muy eficiente en algún tipo de imagen y, por tanto, que está sorprendido de ver la diferencia sin comprimir comprimido JPEG/(A) RGB Tamaño. No estás ayudando de ninguna manera. – SyntaxT3rr0r
Es irrelevante qué tan grande es el archivo fuente. Al igual que cuando se intenta leer un archivo TXT de 1GB que se ha comprimido, es irrelevante el tamaño del archivo zip. El tamaño del archivo de un disco __ no tiene nada que ver con la cantidad de memoria que se necesita para mostrar la imagen descomprimida. –
la respuesta es no, cambiar el tamaño de la imagen a ser menores dimensiones –