Arn*_*rny 7 java png jpeg alpha colors
我在使用Alpha将PNG转换为JPEG时遇到了一些麻烦.
这是图像: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;
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
并通过ImageIO将其存储为JPEG.
知道如何保留色彩空间以保持原始色彩的颜色吗?
UPDATE
调整大小时由ImageMagick引起问题.似乎ImageMagick确实将颜色空间更改为TYPE_CUSTOM,Java无法处理.
当前解决方案
在我开始通过ImageMagick调整图像大小之前删除alpha.
还没有找到将色彩空间从"CUSTOM"转换回"ARGB"的解决方案.所以这只是这个问题的"解决方法".
您实际上并没有删除 alpha 值。当您执行该方法中所做的操作时,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);
Run Code Online (Sandbox Code Playgroud)
如果这不起作用,请阅读此相关问题:Change the alpha value of a BufferedImage?