我需要调整PNG、JPEG和GIF文件的大小。如何使用Java完成这个任务?
顺便提一下,我刚刚发布了一个名为imgscalr的Java简单图片缩放库(Apache 2许可证,托管在GitHub上),可以在Maven central上获得。
该库实现了几种不同的图像缩放方法(包括Chris Campbell的增量方法和一些小的增强功能),如果您要求它,它将为您选择最优的方法,或者为您提供最快或最好看的方法。
使用非常简单,只需要一堆静态方法。最简单的用法是:
BufferedImage scaledImage = Scalr.resize(myImage, 200);
new ImageScaler(img).resizeTo(...).rotate(...).cropTo(...).toOutputBuffer()
。不过我也喜欢你的方式,觉得更简单易懂。 - Amir Raminfar加载完图片后,您可以尝试:
BufferedImage createResizedCopy(Image originalImage,
int scaledWidth, int scaledHeight,
boolean preserveAlpha)
{
System.out.println("resizing...");
int imageType = preserveAlpha ? BufferedImage.TYPE_INT_RGB : BufferedImage.TYPE_INT_ARGB;
BufferedImage scaledBI = new BufferedImage(scaledWidth, scaledHeight, imageType);
Graphics2D g = scaledBI.createGraphics();
if (preserveAlpha) {
g.setComposite(AlphaComposite.Src);
}
g.drawImage(originalImage, 0, 0, scaledWidth, scaledHeight, null);
g.dispose();
return scaledBI;
}
Thumbnailator是一个开源的Java图片缩放库,具有流畅的接口,并在MIT许可证下发布。
我编写该库是因为在Java中制作高质量的缩略图可能会令人惊讶地困难,而且生成的代码可能会相当混乱。使用Thumbnailator,可以使用简单的流畅API表达相当复杂的任务。
一个简单示例
对于一个简单的示例,可以通过一条语句将图像取出并调整大小为100 x 100(保留原始图像的纵横比),并保存到文件中:
Thumbnails.of("path/to/image")
.size(100, 100)
.toFile("path/to/thumbnail");
一个高级示例
使用Thumbnailator的流畅接口可以简化复杂的调整大小任务。
假设我们想要执行以下操作:
0.85
,thumbnail.
前缀的使用Thumbnailator,我们可以通过以下方式完成上述操作:
Thumbnails.of(new File("path/to/directory").listFiles())
.size(100, 100)
.outputFormat("JPEG")
.outputQuality(0.85)
.toFiles(Rename.PREFIX_DOT_THUMBNAIL);
关于图片质量和速度的说明
该库还使用了在Filthy Rich Clients一书中由Chet Haase和Romain Guy强调的渐进双线性缩放方法,以生成高质量的缩略图,同时确保可接受的运行时性能。
Thumbnails.of(..).size(80,80).crop(Positions.CENTER).toFile( ... )
。这将首先将宽度或高度调整为80,然后从中心进行裁剪。 - Wim Deblauwe你不需要使用库来做这件事,Java本身就可以实现。
Chris Campbell在图像缩放方面有一篇非常出色而详细的文章 - 请参见此文章。
Chet Haase和Romain Guy在他们的书Filthy Rich Clients中也有一篇详细且非常有用的关于图像缩放的文章。
Java API没有提供标准的图像缩放和降低图像质量的功能。
因此,我尝试使用JavaCV中的cvResize,但它似乎会引起问题。
我找到了一个很好的图像缩放库:只需在您的pom.xml中添加"java-image-scaling"的依赖即可。
<dependency>
<groupId>com.mortennobel</groupId>
<artifactId>java-image-scaling</artifactId>
<version>0.8.6</version>
</dependency>
ResampleOp resamOp = new ResampleOp(50, 40);
BufferedImage modifiedImage = resamOp.filter(originalBufferedImage, null);
只需使用Burkhard的答案,但在创建图形后添加此行:
g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);