调整图像文件的大小

我有很多图像,我的数码相机拍摄的分辨率非常高,分辨率为3000 * 4000,需要大量的硬盘空间,我用Photoshop打开每张图片并重新调整尺寸,但分辨率很小,但需要很多时间和精力

我认为我可以编写简单的程序打开图像文件夹并读取每个文件并获得它的宽度和高度,如果它非常高,则更改它并用小图像覆盖图像。

您不需要Java来执行此操作。 这是浪费时间和资源。 如果您有photoshop,则可以使用录制操作执行此操作: 使用操作批量resize

这里是我在Java-EE项目中使用的一些代码(应该在正常的应用程序中工作:

int rw = the width I needed; BufferedImage image = ImageIO.read(new File(filename)); ResampleOp resampleOp = new ResampleOp(rw,(rw * image.getHeight()) / image.getWidth() ); resampleOp.setFilter(ResampleFilters.getLanczos3Filter()); image = resampleOp.filter(image, null); File tmpFile = new File(tmpName); ImageIO.write(image, "jpg", tmpFile); 

重采样filter来自java-image-scaling库。 如果您不喜欢Lanczos3,它还包含BSpline和Bicubicfilter等。 如果图像不在sRGB色彩空间中,Java会默默地将色彩空间转换为sRGB(这无疑是我需要的)。

Java也会丢失所有EXIF数据,因为它确实提供了一些(非常难以使用)的方法来检索它。 对于颜色正确的渲染,您可能希望至少为文件添加sRGB标志。 为此,请看这里 。

对于其他一些人所说的没有特别需要Java的+1,但是我想你一定知道这个并且可能会问,因为你要么想写这样的实用程序还是认为它会很有趣?

无论哪种方式,从dir获取图像文件列表是直截了当的, 正确调整它们的大小可以花费更多的腿部工作,因为您将从Googling中注意到最佳实践并看到实际调整文件大小的9种不同方法。

我写了imgscalr来解决这个问题; 它是一个简单的死亡API(单一类,一堆静态方法),并且在webapps和其他利用它的工具中有很好的应用。

resize的步骤看起来像这样(大致):

  1. 获取文件列表
  2. BufferedImage image = ImageIO.read(files [i]);
  3. image = Scalr.resize(图像,宽度);
  4. ImageIO.write(图像);

在Scalr类上调用了大量的“resize”方法,并且所有方法都尊重图像的原始比例。 因此,如果仅使用targetWidth(比如1024像素)进行缩放,则将为您计算高度,以确保图像看起来仍然完全正确。

如果您使用宽度和高度进行缩放,但它们会违反图像的比例并使其看起来“拉伸”,那么根据图像的方向(纵向或横向),一个尺寸将用作锚点,另一个尺寸将用作锚定尺寸将透明地重新计算。

您可以使用多种不同的质量设置和FIT-TO缩放模式,但该库的设计始终是“做正确的事”,因此使用它非常容易。

您可以通过源码挖掘,它是所有Apache 2许可的。 您可以看到它实现了Java2D团队在Java中扩展图像的最佳实践,并且在自身之后进行了迂回清理,因此没有内存泄露。

希望有所帮助。

AffineTransformOp提供了选择插值类型的额外灵活性,如下所示。

您可以使用名为Sizester桌面图像大小调整应用程序单独或批量resize。 我们的网站(www.sizester.com)上有一个完整的15天免费试用版。