【问题标题】:How can I compress images using java?如何使用java压缩图像?
【发布时间】:2022-03-19 16:13:38
【问题描述】:

从 pagespeed 我只得到图像链接和可能的字节和百分比优化,例如, 压缩和调整https://example.com/…ts/xyz.jpg?036861 的大小可以节省 212KiB(减少 51%)。 压缩 https://example.com/…xyz.png?303584508 可以节省 4.4KiB(减少 21%)。

例如,我有大小为 300kb 的图像,对于这个图像,页面速度显示 100kb 和 30% 的缩减。

这仅适用于一张图片,但我确信我会有很多图片用于压缩。 那么如何通过将字节或百分比作为参数传递或使用java中的任何其他计算来压缩图像 (通过使用 API 或图像处理工具)这样,我可以得到谷歌建议的压缩版本的图像。

提前致谢。

【问题讨论】:

    标签: java image image-processing image-compression google-pagespeed


    【解决方案1】:

    您可以使用Java ImageIO 包对多种图像格式进行压缩,这里是一个示例

    import java.awt.image.BufferedImage;
    import java.io.*;
    import java.util.Iterator;
    import javax.imageio.*;
    import javax.imageio.stream.*;
    
    public class Compresssion {
    
      public static void main(String[] args) throws IOException {
    
        File input = new File("original_image.jpg");
        BufferedImage image = ImageIO.read(input);
    
        File compressedImageFile = new File("compressed_image.jpg");
        OutputStream os = new FileOutputStream(compressedImageFile);
    
        Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
        ImageWriter writer = (ImageWriter) writers.next();
    
        ImageOutputStream ios = ImageIO.createImageOutputStream(os);
        writer.setOutput(ios);
    
        ImageWriteParam param = writer.getDefaultWriteParam();
    
        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(0.05f);  // Change the quality value you prefer
        writer.write(null, new IIOImage(image, null, null), param);
    
        os.close();
        ios.close();
        writer.dispose();
      }
    }
    

    你可以找到更多关于它的细节here

    还有一些类似的第三方工具

    编辑:如果您想在您的应用程序中使用 Google PageSpeed,它可以作为 Apache 或 Nginx 的网络服务器模块使用,您可以在此处找到如何为您的网站配置它

    https://developers.google.com/speed/pagespeed/module/

    但如果您想在您的应用程序中集成PageSpeed C++ 库,您可以在此处找到它的构建说明。

    https://developers.google.com/speed/pagespeed/psol

    这里还有一个 Java 客户端

    https://developers.google.com/api-client-library/java/apis/pagespeedonline/v1

    【讨论】:

    • 使用 ImageWriteParam 我得到了图像的压缩版本,但无论谷歌页面速度建议如何,我都没有得到所需的压缩。所以,基本上我想要压缩版本的图像,无论谷歌页面速度是什么。
    • 这个答案有很多有趣的信息。谢谢:)
    • 调整大小怎么样?调整大小是减小文件大小的主要方式。
    • 这适用于所写的 jpg/jpeg 图像。如果图像是 png 图像,即使您使用 get image writer for png 以下代码也会引发异常
    【解决方案2】:

    有颜色压缩(“压缩质量”)和分辨率压缩(“调整大小”)。 Fujy 的答案涉及压缩质量,但这不是主要节省的来源:主要节省来自将尺寸缩小到更小的尺寸。例如。使用 fujy 的答案,我使用最大压缩质量得到了一张 4mb 到 207K 的照片,它看起来很糟糕,但我使用合理的质量但更小的尺寸将它降低到了 12K。

    所以上面的代码应该用于“压缩质量”,但这是我调整大小的建议:

    https://github.com/rkalla/imgscalr/blob/master/src/main/java/org/imgscalr/Scalr.java

    我希望调整大小是标准 Java 库的一部分,但似乎不是,(或者标准方法存在图像质量问题?)。但是利雅得的图书馆真的很小——只有一个班级。我只是将这个类复制到我的项目中,因为我从未学习过如何使用 Maven,而且它很好用。

    【讨论】:

    • 你给的代码看不懂,能不能再给个代码...
    • @Johndahat 从上面的 URL 复制粘贴 Scalr 类。然后,您可以使用它,例如BufferedImage img = Scalr.resize(ImageIO.read(src), 500);,其中srcFileURLInputStream
    【解决方案3】:

    作为这个问题的解决方案,我可以推荐 TinyPNG 的 API。
    您可以使用它来压缩和调整图像大小。

    文档: tinypng.com/developers/reference/java

    【讨论】:

    • 不幸的是,它只有 Web API,这会给处理带来一些网络延迟。他们是否有任何客户端库可以在不需要 API 的情况下进行客户端压缩?
    【解决方案4】:

    一个线性Java解决方案:缩略图。

    Maven 依赖:

    <!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
    <dependency>
        <groupId>net.coobird</groupId>
        <artifactId>thumbnailator</artifactId>
        <version>0.4.17</version>
    </dependency>
    

    一个班轮:

    Thumbnails.of(inputImagePathString).scale(scalingFactorFloat).outputQuality(qualityFactorFloat).toFile(outputImagePathString);
    

    【讨论】:

      猜你喜欢
      • 2011-02-12
      • 2018-04-20
      • 2020-04-27
      • 1970-01-01
      • 2021-10-25
      • 2018-09-10
      • 2019-08-06
      • 2018-08-31
      • 1970-01-01
      相关资源
      最近更新 更多