2

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

举一个例子,我有300kb大小的图像,对于这个图像,pagespeed显示100kb &减少30%。

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

在此先感谢。

回答

5

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

也有一些第三方工具,如更多细节这些

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

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

但是,如果您想将PageSpeed C++库集成到您的应用程序中,您可以在这里找到它的构建指令。

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

它也有在这里

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

+0

使用ImageWriteParam我得到了图像的压缩版本,但我不需要压缩任何谷歌网页速度建议。 所以,基本上我想图像的压缩版本无论谷歌网页速度暗示。 –

+0

@DarshitPatel我已经更新了我的答案,请检查它 – fujy

+0

关于此答案的很多有趣的信息。谢谢:) –

0

Java客户端有色彩压缩( “压缩质量”),并有分辨率压缩( “调整”)。富查的答案涉及压缩质量,但这不是主要节省的来源:主要节省来自调整缩小到更小的尺寸。例如。我用fujy的回答获得了使用最高压缩质量的207M的4mb照片,它看起来很糟糕,但我用合理的质量把它降低到了12K,但尺寸更小。

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

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

祝调整是标准的Java库的一部分,但现在看来,这不是(或者标准方法存在图像质量问题?)。但是利雅德的图书馆非常小 - 只有一个班级。我只是将这个类复制到我的项目中,因为我从来没有学会如何使用Maven,并且它工作得很好。