【发布时间】:2011-07-16 00:51:52
【问题描述】:
当我尝试压缩 jpg 图像时,大多数情况下它都能正常工作,但是一些 jpg 图像在压缩后变成绿色。这是我的代码
public void compressImage(String filename, String fileExtension) {
BufferedImage img = null;
try {
File file = new File(filename);
img = ImageIO.read(file);
if (fileExtension.toLowerCase().equals(".png") || fileExtension.toLowerCase().equals(".gif")) {
//Since there might be transparent pixel, if I dont do this,
//the image will be all black.
for (int x = 0; x < img.getWidth(); x++) {
for (int y = 0; y < img.getHeight(); y++) {
int rgb = img.getRGB(x, y);
int alpha = (rgb >> 24) & 0xff;
if (alpha != 255) {
img.setRGB(x, y, -1); //set white
}
}
}
}
Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
//Then, choose the first image writer available
ImageWriter writer = (ImageWriter) iter.next();
//instantiate an ImageWriteParam object with default compression options
ImageWriteParam iwp = writer.getDefaultWriteParam();
//Set the compression quality
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(0.8f);
//delete the file. If I dont the file size will stay the same
file.delete();
ImageOutputStream output = ImageIO.createImageOutputStream(new File(filename));
writer.setOutput(output);
IIOImage image = new IIOImage(img, null, null);
writer.write(null, image, iwp);
writer.dispose();
} catch (IOException ioe) {
logger.log(Level.SEVERE, ioe.getMessage());
}
}
【问题讨论】:
-
出于好奇,您为什么要将
ServletContext传递给此方法?它从未使用过。 -
@Matt:好点,它来自我的旧代码。我传入
ServletContext试图找出file path,但后来我决定改为传入file path -
我只是在测试图像(顶部)上运行了代码,并没有影响着色。 Here's the result。它肯定是经过压缩的(246 KB vs 453 KB)。
-
顺便说一句,你应该通用声明迭代器:
Iterator<ImageWriter> iter = ImageIO.get...,然后你不需要强制转换,你可以这样写:ImageWriter writer = iter.next(); -
我也刚刚在 OS X 10.6 上的 JRE 6 上运行了代码 - 也没有问题。会不会是this problem?我在 exif 标签中看到的唯一区别是原始图像的 JFIF 版本是 1.1,而处理后的图像的版本是 1.2。
标签: java compression jpeg javax.imageio image-compression