繁体   English   中英

如何使用 java 压缩图像?

[英]How can I compress images using java?

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

提前致谢。

您可以使用 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();
  }
}

您可以在此处找到有关它的更多详细信息

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

编辑:如果您想在您的应用程序中使用 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

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

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

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

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

一个班轮 java 解决方案:thumbnailator。

Maven 依赖:

<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
    <groupId>net.coobird</groupId>
    <artifactId>thumbnailator</artifactId>
    <version>0.4.17</version>
</dependency>

一个班轮:

Thumbnails.of(inputImagePathString).scale(scalingFactorFloat).outputQuality(qualityFactorFloat).toFile(outputImagePathString);

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

文档: tinypng.com/developers/reference/java

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM