【问题标题】:Compress image size using Java使用 Java 压缩图像大小
【发布时间】:2020-04-27 06:38:40
【问题描述】:

我想使用 Java 压缩(减小)图像大小。我们可以上传 jpg/jpeg/png 格式的图片。图片的一般格式是PNG。所以,图片上传到服务器后,我们需要压缩(减小文件大小)并将其转换为PNG。

我有下一个压缩图像的代码:

    BufferedImage bufferedImage = ImageIO.read(inputStream);
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();

    switch (imageType) {
        case PNG:
        case JPG:
            // need Java 9+ for PNG writer support
            ImageWriter writer = ImageIO.getImageWritersByFormatName(imageType.getExtension()).next();
            ImageOutputStream ios = ImageIO.createImageOutputStream(outputStream);
            writer.setOutput(ios);

            ImageWriteParam param = writer.getDefaultWriteParam();
            if (param.canWriteCompressed()) {
                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                param.setCompressionQuality(0.3f);
            }

            writer.write(null, new IIOImage(bufferedImage, null, null), param);
            writer.dispose();
            return new ByteArrayInputStream(outputStream.toByteArray());
        default:
            log.warn("Image type unknown");
            return null;
    }

问题是 - 处理图像后,我得到了结果 - 文件大小增加而不是减少。原始图像的尺寸小于压缩后的尺寸。 有关如何解决此问题的任何建议?

【问题讨论】:

  • 你在处理什么样的图像? PNG 可能不是每种图像(例如照片)的最佳选择。
  • 服务器上的@Michael 所有图像都保存在 PNG 中。但用户可以上传 jpg/jpeg 和 png。它是用户个人资料图片、用户帖子图片、相册等图片。
  • 压缩需要无损吗?如果是这样,也许您可​​以使用 WebP 而不是 PNG?

标签: java image-processing image-compression


【解决方案1】:

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

它适用于 .jpeg 和 .png。

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

【讨论】:

  • 在许多情况下,使用第三方 API 处理此类流程是一种糟糕的方式。您无法管理对数据的处理方式。更好的方法是在纯 java lib 中。没有?
【解决方案2】:

不幸的是,有损 JPEG 压缩比无损 PNG 压缩要好得多。您可以限制图像的宽度和高度并按比例缩放。

所以我会切换到 JPEG 并限制大小。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-29
    • 2013-09-03
    • 1970-01-01
    • 2016-11-17
    • 2016-05-22
    • 2020-04-01
    • 1970-01-01
    相关资源
    最近更新 更多