用Java创建缩略图

时间:2011-03-28 06:40:03

标签: java resize thumbnails

我想为一组图片创建缩略图。为此,我使用以下代码。

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堆空间错误”。这是代码的问题吗?我该如何解决这个问题。提前致谢。 如果您有任何其他调整代码,请给我。

5 个答案:

答案 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)