如何使用java压缩图像?

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

例如,我有大小为300kb的图像,对于此图像,pagespeed显示100kb和30%的减少。

这仅适用于一个图像,但我相信我会有很多图像用于压缩。所以我如何通过传递字节或百分比作为参数或使用Java中的任何其他计算(通过使用API或图像处理工具)来压缩图像,以便我可以按照Google的建议获得图像的压缩版本。

提前致谢。


答案 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();
  }
}

您可以在此处找到有关它的更多详细信息

还有一些像这样的第三方工具

编辑:如果你想在你的应用程序中使用谷歌,它可以作为Apache或Nginx的Web服务器模块,你可以在这里找到如何为你的网站配置它PageSpeed

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

但是,如果要将C++库集成到应用程序中,可以在此处找到它的生成说明。PageSpeed

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

它在这里还有一个Java客户端。

https://github.com/googleapis/google-api-java-client-services/tree/main/clients/google-api-services-pagespeedonline/v5


答案 2

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

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

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

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


推荐