【问题标题】:Resize Image files调整图像文件大小
【发布时间】:2011-08-20 09:55:00
【问题描述】:

我的数码相机拍摄了很多图像,分辨率为 3000 * 4000,占用大量硬盘空间,我使用 Photoshop 打开每个图像并重新调整其大小,使其具有小分辨率,但这需要很多时间和精力

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

【问题讨论】:

  • Photoshop 有批处理操作:digital-photography-school.com/how-to-batch-resize-in-photoshop。如果你还想用Java DIY,看看BufferedImage
  • 您确定要使用 Java 吗?像ImageMagick 这样的东西可能更适合这项任务。即使你必须通过 Cygwin。
  • 如果有任何其他简单的解决方案,我会很乐意这样做:D
  • 如果你在 Windows 上,有这个Image Resizer powertoy。这有助于一次性转换所有图像。
  • 我试过在Photoshop中使用嵌入式图像处理器,但没找到,我用的是Photoshop 8,请问你是哪个版本的Photoshop

标签: java image


【解决方案1】:

这是我在 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);

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

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

【讨论】:

    【解决方案2】:

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

    无论哪种方式,从目录中获取图像文件列表都很简单,正确调整它们的大小可能需要更多的工作,因为你会从谷歌搜索最佳实践中注意到,大约 9实际调整文件大小的不同方法。

    我写了imgscalr 来解决这个确切的问题;它是一个非常简单的 API(单个类,一堆静态方法),并且在 webapps 和其他使用它的工具中得到了很好的采用。

    调整大小的步骤(大致)如下所示:

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

    有多种“调整大小”方法可以调用Scalr class,它们都遵循图像的原始比例。因此,如果您仅使用 targetWidth(例如 1024 像素)进行缩放,则会为您计算高度,以确保图像看起来仍然完全正确。

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

    您还可以使用多种不同的质量设置和 FIT-TO 缩放模式,但该库旨在始终“做正确的事”,因此使用起来非常简单。

    您可以挖掘源代码,它都是 Apache 2 许可的。您可以看到,它实现了 Java2D 团队在 Java 中缩放图像的最佳实践,并在其自身之后进行了迂腐的清理,因此不会泄漏内存。

    希望对您有所帮助。

    【讨论】:

      【解决方案3】:

      您不需要 Java 来执行此操作。这是浪费时间和资源。如果你有 Photoshop,你可以通过录制动作来做到这一点:batch resize using actions

      【讨论】:

      • 是的,如果您正在分发应用程序,这将不起作用。我不会让我的用户花费数百美元来使用 Photoshop 的批处理功能。
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2020-01-27
          • 2016-02-16
          • 1970-01-01
          • 1970-01-01
          • 2014-10-29
          • 1970-01-01
          相关资源
          最近更新 更多