gpt4 book ai didi

java - 如何使用 JAVA 将带有 alpha 的 PNG 转换为保留颜色的 JPEG

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:32:26 25 4
gpt4 key购买 nike

我在将带有 Alpha 的 PNG 从 Wiki 转换为 JPEG 时遇到了一些问题。

这是图像:http://upload.wikimedia.org/wikipedia/commons/thumb/e/ee/Radio_SRF_3.svg/500px-Radio_SRF_3.svg.png

原文: enter image description here

转换后的 JPEG 文件颜色错误。它比现在更灰暗。 image result

这是我进行转换的方式:

删除阿尔法:

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。

知道如何保留颜色空间以保持颜色与原始颜色一样吗?

更新

问题是由 ImageMagick 在调整大小时引起的。似乎 ImageMagick 确实将颜色空间更改为 TYPE_CUSTOM 而 Java 无法处理。

当前解决方案:

在我开始通过 ImageMagick 调整图像大小时删除 alpha。

仍然没有找到将颜色空间从“CUSTOM”转换回“ARGB”的解决方案。因此,这只是此问题的“解决方法”。

最佳答案

您实际上并没有删除 alpha 值。当您执行您在 imageFillAlphaWithColor 方法中执行的操作时,Java 会将颜色值除以 alpha。

我建议使用 AlphaComposite class实际删除 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);

如果这不起作用,请阅读此相关问题:Change the alpha value of a BufferedImage?

关于java - 如何使用 JAVA 将带有 alpha 的 PNG 转换为保留颜色的 JPEG,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23654987/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com