如何将带 Alpha 的 Type_Byte_Binary BufferedImage 转换为 TYPE_4BYTE_ABGR
How to convert a Type_Byte_Binary BufferedImage with Alpha to an TYPE_4BYTE_ABGR
我正在使用代码
BufferedImage imgIn = ImageIO.read(is);
BufferedImage image;
if (imgIn.getType() != BufferedImage.TYPE_BYTE_INDEXED) {
image = new BufferedImage(imgIn.getWidth(), imgIn.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
ColorConvertOp cco = new ColorConvertOp(imgIn.getColorModel()
.getColorSpace(), image.getColorModel().getColorSpace(), null);
cco.filter(imgIn, image);
} else {
image = imgIn;
}
当我拉入位深度为 4 的图像时,它使 imgIn 成为 Type_Byte_Binary。当它转换为 Type_4Byte_ABGR 时,任何具有部分透明度的东西都会改变颜色并失去所有 alpha。全透明像素和全不透明像素保持不变。
有什么办法可以防止部分透明像素发生变化吗?
谢谢。
很可能 ColorConvertOp
不是您想要的,因为图像都是 RGB (sRGB) 颜色 space(IndexColorModel
不支持其他颜色 spaces)。
相反,只需将 TYPE_BYTE_INDEXED
或 TYPE_BYTE_BINARY
绘制到 TYPE_4BYTE_ABGR
图像上,任何透明度都应保留。
BufferedImage image = new BufferedImage(imgIn.getWidth(), imgIn.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Grphics2D g = image.createGraphics();
try {
g.drawImage(imgIn, 0, 0, null);
}
finally {
g.dispose();
}
我正在使用代码
BufferedImage imgIn = ImageIO.read(is);
BufferedImage image;
if (imgIn.getType() != BufferedImage.TYPE_BYTE_INDEXED) {
image = new BufferedImage(imgIn.getWidth(), imgIn.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
ColorConvertOp cco = new ColorConvertOp(imgIn.getColorModel()
.getColorSpace(), image.getColorModel().getColorSpace(), null);
cco.filter(imgIn, image);
} else {
image = imgIn;
}
当我拉入位深度为 4 的图像时,它使 imgIn 成为 Type_Byte_Binary。当它转换为 Type_4Byte_ABGR 时,任何具有部分透明度的东西都会改变颜色并失去所有 alpha。全透明像素和全不透明像素保持不变。
有什么办法可以防止部分透明像素发生变化吗?
谢谢。
很可能 ColorConvertOp
不是您想要的,因为图像都是 RGB (sRGB) 颜色 space(IndexColorModel
不支持其他颜色 spaces)。
相反,只需将 TYPE_BYTE_INDEXED
或 TYPE_BYTE_BINARY
绘制到 TYPE_4BYTE_ABGR
图像上,任何透明度都应保留。
BufferedImage image = new BufferedImage(imgIn.getWidth(), imgIn.getHeight(), BufferedImage.TYPE_4BYTE_ABGR);
Grphics2D g = image.createGraphics();
try {
g.drawImage(imgIn, 0, 0, null);
}
finally {
g.dispose();
}