如何使用java压缩图像?

如何使用java压缩图像?,java,image,image-processing,image-compression,google-pagespeed,Java,Image,Image Processing,Image Compression,Google Pagespeed,从pagespeed中,我得到的只有图像链接和可能的优化,以字节和百分比表示,比如, 压缩和调整大小可以节省212KiB(减少51%)。 压缩可以节省4.4KB(减少21%) 例如,我有一个大小为300kb的图像,对于这个图像,pagespeed显示100kb,减少了30% 这只是一个图像,但我相信我会有很多图像压缩。 那个么,如何通过将字节或百分比作为参数传递或使用java中的任何其他计算来压缩图像呢 (通过使用API或图像处理工具)这样,我就可以得到谷歌建议的图像压缩版本 提前感谢。您可以使

从pagespeed中,我得到的只有图像链接和可能的优化,以字节和百分比表示,比如, 压缩和调整大小可以节省212KiB(减少51%)。 压缩可以节省4.4KB(减少21%)

例如,我有一个大小为300kb的图像,对于这个图像,pagespeed显示100kb,减少了30%

这只是一个图像,但我相信我会有很多图像压缩。 那个么,如何通过将字节或百分比作为参数传递或使用java中的任何其他计算来压缩图像呢 (通过使用API或图像处理工具)这样,我就可以得到谷歌建议的图像压缩版本

提前感谢。

您可以使用Java软件包对许多图像格式进行压缩,下面是一个示例

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();
  }
}
导入java.awt.image.buffereImage;
导入java.io.*;
导入java.util.Iterator;
导入javax.imageio.*;
导入javax.imageio.stream.*;
公共类压缩{
公共静态void main(字符串[]args)引发IOException{
文件输入=新文件(“original_image.jpg”);
BuffereImage image=ImageIO.read(输入);
File compressedImageFile=新文件(“compressed_image.jpg”);
OutputStream os=新文件OutputStream(compressedImageFile);
迭代器编写器=ImageIO.getImageWritersByFormatName(“jpg”);
ImageWriter writer=(ImageWriter)writers.next();
ImageOutputStream ios=ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam参数=writer.getDefaultWriteParam();
参数setCompressionMode(ImageWriteParam.MODE_显式);
param.setCompressionQuality(0.05f);//更改您喜欢的质量值
writer.write(null,新IIOImage(image,null,null),param);
os.close();
ios.close();
writer.dispose();
}
}
你可以找到更多的细节

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

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

<>但是如果你想在你的应用程序中集成 PageSpeed < /Cord>C++库,你可以在这里找到它的编译说明。

这里还有一个Java客户机


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

因此,上述代码应用于“压缩质量”,但我建议调整大小:


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

作为这个问题的解决方案,我可以推荐TinyPNG的API。
您可以使用它来压缩和调整图像大小


文档:

使用ImageWriteParam,我得到了图像的压缩版本,但无论谷歌页面速度如何,我都没有得到所需的压缩。所以,基本上我想要的是压缩版的图片,不管谷歌的页面速度如何。关于这个答案,有很多有趣的信息。谢谢:)调整大小怎么样?调整大小是减少文件大小的主要方法。不幸的是,它只有web API,这会给处理带来一些网络延迟。他们有没有任何客户端库可以在不需要API的情况下压缩客户端?你给出的代码很难理解,你能不能再给出一个代码。。。