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