Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 压缩图像时,将正确的值设置为setCompressionQuality()_Java - Fatal编程技术网

Java 压缩图像时,将正确的值设置为setCompressionQuality()

Java 压缩图像时,将正确的值设置为setCompressionQuality(),java,Java,我试图压缩一个png图像(6.8MB)来缩小它的大小,但我面临的问题是,我正在失去它的大部分羽毛。即使我评论这些行 param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); param.setCompressionQuality(0.9f); 我得到的图像与截图中的一样,但大小为(812 KB)。通过这些线条,我得到了一个大小为(1.24MB)的png图像,但在这两种情况下,我得到的图像与屏幕截图中的图像一

我试图压缩一个png图像(6.8MB)来缩小它的大小,但我面临的问题是,我正在失去它的大部分羽毛。即使我评论这些行

        param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        param.setCompressionQuality(0.9f);
我得到的图像与截图中的一样,但大小为(812 KB)。通过这些线条,我得到了一个大小为(1.24MB)的png图像,但在这两种情况下,我得到的图像与屏幕截图中的图像一样,没有任何不同 羽毛状(也有黑色背景)。如何压缩质量更好的图像?我还认为我可以通过将浮点值设置在0-1之间来配置质量vlaue,如下setCompressionQuality(0.9f)

封装图像压缩;
导入java.awt.image.buffereImage;
导入java.io.File;
导入java.io.FileOutputStream;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.util.Iterator;
导入javax.imageio.IIOImage;
导入javax.imageio.imageio;
导入javax.imageio.ImageWriteParam;
导入javax.imageio.ImageWriter;
导入javax.imageio.stream.ImageOutputStream;
公共类图像压缩程序{
公共静态void main(字符串[]args){
BuffereImage img=null;
试一试{
文件输入=新文件(“草莓.png”);
BuffereImage image=ImageIO.read(输入);
File compressedImageFile=新文件(“草莓_compressed.png”);
OutputStream os=新文件OutputStream(compressedImageFile);
迭代器编写器=ImageIO.getImageWritersByFormatName(“jpg”);
ImageWriter writer=writers.next();
ImageOutputStream ios=ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam参数=writer.getDefaultWriteParam();
//检查canWriteCompressed是否为true
if(param.canWriteCompressed()){
参数setCompressionMode(ImageWriteParam.MODE_显式);
参数设置压缩质量(0.9f);
}
//支票到期
writer.write(null,新IIOImage(image,null,null),param);
}捕获(IOE异常){
e、 printStackTrace();
}
}
}
屏幕截图

我必须在这个方法getImageWritersByFormatName(“png”)中设置png;然后图像看起来相同,但大小更大-->其大小为11.2MB。

为什么要使用
jpg
获取
ImageWriter
?因为如果您更改为
ImageIO.getImageWritersByFormatName(“png”)
,然后尝试获取可用的压缩类型(即
param.getCompressionTypes()
),您将获得
java.lang.UnsupportedOperationException:不支持压缩
package ImageCompressor;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;


public class ImageComprossor {

    public static void main(String[] args) {
        BufferedImage img = null;
        try {

            File input = new File("strawberry.png");
            BufferedImage image = ImageIO.read(input);

            File compressedImageFile = new File("strawberry_compressed.png");
            OutputStream os = new FileOutputStream(compressedImageFile);

            Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
            ImageWriter writer = writers.next();

            ImageOutputStream ios = ImageIO.createImageOutputStream(os);
            writer.setOutput(ios);

            ImageWriteParam param = writer.getDefaultWriteParam();
            // Check if canWriteCompressed is true
            if (param.canWriteCompressed()) {
                param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
                param.setCompressionQuality(0.9f);
            }
            // End of check
            writer.write(null, new IIOImage(image, null, null), param);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

}