如何使用java压缩图像?

Dar*_*tel 8 java image image-processing image-compression google-pagespeed

从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​​或图像处理工具)来压缩图像,这样,我可以获得谷歌建议的压缩版图像.

提前致谢.

fuj*_*ujy 14

您可以使用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();
  }
}
Run Code Online (Sandbox Code Playgroud)

你可以在这里找到更多相关细节

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

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

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


Tim*_*per 6

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

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

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

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