如何在具有透明度的Java BufferedImage中读取像素颜色

11

我正在按照以下方式读取BufferedImage中的像素颜色:

.....
InputStream is = new BufferedInputStream(conn.getInputStream());
BufferedImage image = ImageIO.read(is);

int color = image.getRGB(x, y);

int  red = (colour & 0x00ff0000) >> 16;
int  green = (colour & 0x0000ff00) >> 8;
int  blue = colour & 0x000000ff;

现在这个代码可以正常工作,但对于带透明度的png图片会出问题。如果x,y坐标指向一个没有颜色的透明像素,我仍然读到一个颜色,通常是图像其他地方使用的相同颜色。

如何检测像素实际上是透明而不是有颜色的呢?

谢谢

1个回答

17
int alpha = (colour>>24) & 0xff;

结果也是一个值,范围从0(完全透明)到255(完全不透明)。


请记住,如果 alpha 为 0(透明),那么颜色值实际上并不重要。这可能是某些编辑器中的优化步骤,当 alpha 为 0 时不必设置颜色值。 - basszero
1
谢谢 - 我很惊讶 BufferedImage 类没有一个方法 "int getTransparency(int x, int y);"。 - greenimpala
每张图片都包含透明度值吗? - Jürgen K.
1
@JürgenK。在被Java API加载后,每个图像都应该有一个透明度值。如果图像是从不支持透明度的文件格式(例如JPEG)中加载的,则每个像素的透明度值将被设置为0xff(100%不透明)。 - jarnbjo
谢谢你的回答。我本来希望能够使用透明度计算雾气图片中的某种模糊程度,但看来这是错误的选择。 - Jürgen K.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接