首页 文章

如何使用java压缩图像?

提问于
浏览
5

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

提前致谢 .

2 回答

  • 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

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

    EDIT: 如果您想在您的应用程序中使用Google PageSpeed ,它可用作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

  • 10

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

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

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

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

相关问题