如何使用JAVA将alpha转换为JPEG保存颜色
我在将Alpha的PNG转换为Wiki的过程中遇到了一些麻烦。
这是图像:http://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Radio_SRF_3.svg/500px-Radio_SRF_3.svg.png
原版的:
转换后的JPEG文件颜色错误。 现在它比黑暗更灰。
这是我如何进行转换:
删除alpha:
public static BufferedImage imageFillAlphaWithColor(BufferedImage image, Color fillColor) {
if (image.getColorModel().getTransparency() == Transparency.OPAQUE) return image;
int w = image.getWidth();
int h = image.getHeight();
BufferedImage newImage = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
Graphics2D g = newImage.createGraphics();
g.drawImage(image, 0, 0, fillColor, null);
g.dispose();
return newImage;
}
Jpeg压缩:
public static byte[] compressedJpegImage(BufferedImage image, float quality) {
byte jpegImage[] = null;
try {
// Find a jpeg writer
ImageWriter writer = null;
Iterator<ImageWriter> iter = ImageIO.getImageWritersByFormatName("jpg");
if (iter.hasNext()) {
writer = (ImageWriter) iter.next();
}
// Prepare output
ByteArrayOutputStream os = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
// Set the compression quality
ImageWriteParam iwparam = writer.getDefaultWriteParam();
iwparam.setProgressiveMode(ImageWriteParam.MODE_DEFAULT);
iwparam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwparam.setCompressionQuality(quality);
// Write the image
writer.write(null, new IIOImage(image, null, null), iwparam);
// Cleanup
ios.flush();
writer.dispose();
ios.close();
jpegImage = os.toByteArray();
} catch (IOException e) {
e.printStackTrace();
}
return jpegImage;
}
并通过ImageIO将其存储为JPEG。
任何想法如何保留色彩空间,以保持原来的颜色?
UPDATE
调整大小时,问题是由ImageMagick引起的。 看起来像ImageMagick确实将颜色空间更改为TYPE_CUSTOM,而Java无法处理它。
当前解决方案
在我开始通过ImageMagick调整图像大小之前删除Alpha。
仍然没有找到将色彩空间从“CUSTOM”转换回“ARGB”的解决方案。 所以这只是这个问题的一个“解决方法”。
你实际上并没有去除alpha值。 当你在imageFillAlphaWithColor
方法中做了你所做的事情时,Java会将alpha值imageFillAlphaWithColor
。
我建议使用AlphaComposite
类来实际删除alpha。
以下是关于如何组合图形的Oracle教程:http://docs.oracle.com/javase/tutorial/2d/advanced/compositing.html
无法轻松测试,我认为您需要做的是:
Graphics2D g = newImage.createGraphics();
g.setComposite(AlphaComposite.Src);
g.drawImage(image, 0, 0, fillColor, null);
如果这不起作用,请阅读以下相关问题:更改BufferedImage的Alpha值?
那这个呢?
public static void main(String[] args) throws Exception {
Color fillColor = Color.BLUE; // just to verify
BufferedImage bi = ImageIO.read(new File("c:temptGjhw.png"));
BufferedImage bi2 = new BufferedImage(bi.getWidth(), bi.getHeight(),
BufferedImage.TYPE_3BYTE_BGR);
bi2.getGraphics().drawImage(bi, 0, 0, fillColor, null);
// you can do a more complex saving to tune the compression parameters
ImageIO.write(bi2,"JPG",new File("c:temptGjhw2.jpg"));
}
太亮的结果似乎是由于从线性色彩空间(gamma = 1)到sRGB(gamma = 1 / 2.2)的转换。 原件不包含任何伽马信息,因此ImageMagick可以自由选择其默认值。 ImageMagick的最新版本以不同的方式处理灰度图像,其中一些假设为线性,其他假设为sRGB。 在命令行中,您可以使用“-gamma 1”选项来获取所有版本的较暗结果。 你需要在Java中做同样的事情。
链接地址: http://www.djcxy.com/p/20447.html上一篇: How to convert PNG with alpha to JPEG conserving colors using JAVA