Я не вижу, где вы устанавливаете IMG_WIDTH, может быть, это останется огромным значением.Вы должны предпочесть указывать целевую ширину и высоту в качестве параметров, так как способ установки высоты предотвращает многопоточное использование и делает его очень трудным для чтения.И я сомневаюсь, что высота целевого изображения действительно является частью состояния объекта.
Кроме того, вы уверены, что правильно устанавливаете высоту изображения, высота связана с соотношением между высотой и шириной, узкое изображение даст вам очень высокое изображение и растянутое изображение с учетом ширины целиизображение должно оставаться постоянным.
Последнее, http://www.jhlabs.com/ip/filters/index.html имеет некоторый полезный код для обработки изображения (включая изменение размера), я использовал их несколько раз.
Предполагая, что ваши изображения большие, вы можете захотеть взглянуть на JAI и использовать либо встроенные миниатюры, либо субдискретизацию, чтобы уменьшить необходимую память.
public static BufferedImage getThumb(ImageReader reader, int size) throws IOException {
BufferedImage img;
try {
if (reader.getNumThumbnails(0) > 0) {
img = reader.readThumbnail(0, 0);
} else {
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceSubsampling(4, 4, 0, 0);
img = reader.read(0); //read(0, param);
}
throw new Exception();
} catch (Throwable t) {
img = null;
}
return img != null ? resizeImage(img, size) : null;
}
public static BufferedImage getThumb(File file, double scale) throws IOException {
BufferedImage img = null;
try {
Class<?> c = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.JAI");
Class<?> ic = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.Interpolation");
Class<?> sc = ImageUtil.class.getClassLoader().loadClass("javax.media.jai.operator.ScaleDescriptor");
Method jaiCreate = c.getMethod("create", String.class, Object.class);
Method getInstance = findMethod(ic, "getInstance");
Method sdCreate = findMethod(sc, "create");
if (c != null) {
Object image = jaiCreate.invoke(null, "fileload", file.getAbsolutePath());
Object[] params = { image, (float) scale, (float) scale,
0.0f, 0.0f, getInstance.invoke(null, 2), null };
Object sd = sdCreate.invoke(null, params);
Method m = sd.getClass().getMethod("getAsBufferedImage");
img = (BufferedImage) m.invoke(sd);
}
} catch (Throwable tt) {
System.out.println("Could not read image using JAI, maybe JAI is not installed.");
System.out.println(tt);
}
return img;
}