我想知道是否可以在不使用任何第三方库的情况下为Java中的图像生成具有适当宽高比的缩略图。如果没有,那么请建议一个快速有效的开源库来生成具有适当宽高比的缩略图。
正确的宽高比我的意思是如果图像非常大,可以说1900 X 1080
,那么缩略图不应该只是原始图像的调整大小版本(因此导致压缩的外观或不正确的图像),而是应该适当裁剪和调整大小,使视图清晰。
注意:缩略图的大小对于任何大小的图像都是恒定的。
答案 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方法需要作为参数的图像路径数组。它将尝试以与查找原件相同的格式创建缩略图;您可以通过替换ext
与ext = "png"
分配的行来更改此设置(例如)。
答案 1 :(得分:0)
我喜欢im4java,Image Magick的包装。
im4java只为ImageMagick命令生成命令行,并将生成的行传递给选定的IM命令(使用java.lang.ProcessBuilder.start() - 方法),这意味着精心设计和内存消耗被委派到服务器内的另一个问题,我喜欢这个。
我正在使用并在许多项目中使用它,我发现它非常可靠,快速和完整。
答案 2 :(得分:0)