用Java生成缩略图

时间:2015-06-09 11:43:43

标签: java thumbnails aspect-ratio

我想知道是否可以在不使用任何第三方库的情况下为Java中的图像生成具有适当宽高比的缩略图。如果没有,那么请建议一个快速有效的开源库来生成具有适当宽高比的缩略图。

正确的宽高比我的意思是如果图像非常大,可以说1900 X 1080,那么缩略图不应该只是原始图像的调整大小版本(因此导致压缩的外观或不正确的图像),而是应该适当裁剪和调整大小,使视图清晰。

注意:缩略图的大小对于任何大小的图像都是恒定的。

3 个答案:

答案 0 :(得分:1)

不需要第三方库(但可能比ImageMagick慢):

import java.awt.*;
import java.awt.image.*;
import javax.imageio.*;
import java.nio.file.*;

public class J {

    public static BufferedImage createThumb(BufferedImage in, int w, int h) {
        // scale w, h to keep aspect constant
        double outputAspect = 1.0*w/h;
        double inputAspect = 1.0*in.getWidth()/in.getHeight();
        if (outputAspect < inputAspect) {
            // width is limiting factor; adjust height to keep aspect
            h = (int)(w/inputAspect);
        } else {
            // height is limiting factor; adjust width to keep aspect
            w = (int)(h*inputAspect);
        }
        BufferedImage bi = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        Graphics2D g2 = bi.createGraphics();
        g2.setRenderingHint(
            RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        g2.drawImage(in, 0, 0, w, h, null);
        g2.dispose();
        return bi;
    }

    public static void main(String args[]) throws Exception {
        for (String in : args) {
            BufferedImage bi = createThumb(
                ImageIO.read(Files.newInputStream(Paths.get(in))),
                128, 128);
            String ext = in.substring(in.lastIndexOf(".")+1);
            String out = in.replaceFirst(".([a-z]+)$", "_thumb." + ext);
            System.err.println(in + " --> " + out);
            ImageIO.write(bi, ext, Files.newOutputStream(Paths.get(out)));
        }
    }
}

main方法需要作为参数的图像路径数组。它将尝试以与查找原件相同的格式创建缩略图;您可以通过替换extext = "png"分配的行来更改此设置(例如)。

答案 1 :(得分:0)

我喜欢im4javaImage Magick的包装。

im4java只为ImageMagick命令生成命令行,并将生成的行传递给选定的IM命令(使用java.lang.ProcessBuilder.start() - 方法),这意味着精心设计和内存消耗被委派到服务器内的另一个问题,我喜欢这个。

我正在使用并在许多项目中使用它,我发现它非常可靠,快速和完整。

答案 2 :(得分:0)

尝试imgscalr:

image = Scalr.resize(image, size);

https://github.com/rkalla/imgscalr