我想为一组图片创建缩略图。为此,我使用以下代码。
public void run() {
try{
BufferedImage originalImage = ImageIO.read(new File(url));
int type = originalImage.getType() == 0? BufferedImage.TYPE_INT_ARGB : originalImage.getType();
IMG_HEIGHT = (originalImage.getHeight()*600)/originalImage.getWidth();
BufferedImage resizeImageJpg = resizeImage(originalImage, type);
ImageIO.write(resizeImageJpg, "jpg", new File(thumb));
originalImage.flush();
resizeImageJpg.flush();
System.gc();
}catch(IOException e){
System.out.println(e.getMessage());
System.out.println("Not Created:"+url);
}
}
private static BufferedImage resizeImage(BufferedImage originalImage, int type){
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
g.dispose();
System.gc();
return resizedImage;
}
此代码工作正常并创建缩略图。但问题是,在大量图像的情况下,我得到“java堆空间错误”。这是代码的问题吗?我该如何解决这个问题。提前致谢。 如果您有任何其他调整代码,请给我。
答案 0 :(得分:3)
试试这个Image Scaling Library,它对我来说很好。
http://www.thebuzzmedia.com/software/imgscalr-java-image-scaling-library/
答案 1 :(得分:1)
我没有看到你在哪里设置IMG_WIDTH,可能是因为它留下了巨大的价值。您应该更喜欢将目标宽度amd height作为参数,设置高度可以防止多线程使用并使其难以阅读。我怀疑目标图像的高度实际上是对象状态的一部分。
另外,你确定正确设置图像高度,高度与高度和宽度之间的比例有关,窄图像会给你一个非常高的图像和拉伸图像,假设目标图像的宽度是保持不变。
最后一件事,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;
}
答案 2 :(得分:0)
您如何启动此流程?此代码似乎确实正在清理图像。
唯一的选择是通过添加-Xmx 512m(例如将堆大小增加到512 MB)作为VM命令行选项之一来增加堆大小。
答案 3 :(得分:0)
在Java中创建缩略图需要适当的工具:ImageMagick。
从Java调用它,享受结果。它总是会比使用库提供的Java所做的更好,更安全,更快。
答案 4 :(得分:0)