如何使用java压缩图像?

时间:2017-06-15 10:45:10

标签: 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​​或图像处理工具)所以,我可以获得谷歌建议的压缩版图像。

提前致谢。

3 个答案:

答案 0 :(得分:13)

您可以使用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

答案 1 :(得分:3)

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

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

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

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

答案 2 :(得分:1)

作为解决此问题的方法,我建议使用TinyPNG的API。
您可以将其用于压缩和调整图像大小。

文档 tinypng.com/developers/reference/java