java - 使用Java压缩图像大小

标签 java image-processing image-compression

我想使用 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;
    }

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

最佳答案

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

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

关于java - 使用Java压缩图像大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59667669/

相关文章:

java - Drools针对不同用户的规则

wpf - WPF图像,如何消除模糊?

c++ - openCV中高斯的拉普拉斯算子,如何找到零交叉点?

java - 使用 spring-boot 应用程序自动压缩/优化图像

javascript - 即使质量为 100,Cordova 相机 getPicture 也是无损压缩

java - 调用 getTime 更改日历值

java - Spring @ConfigurationProperties 绑定(bind)在测试中失败

java - 为什么我无法将背景图像设置到从相关 fragment 类声明到 fragment xml 配置中的 ImageView 中?

image-processing - 如何增加从图像生成的颜色之间的对比度?

java - 如何在Android中将捕获的图像压缩到特定大小?