bufferedImage.getRGB(x, y) 不产生 alpha
我有一个BufferedImage,我想从某个像素(包括alpha值)获取颜色。像素使用 和 坐标进行标识。i
image
x
y
以下是我尝试过的方法:
Color c = new Color(i.getRGB(x, y));
由于某种原因,新的颜色对象包含正确的 RGB,但 Alpha 会丢失。
我做错了什么?
提前致谢
我有一个BufferedImage,我想从某个像素(包括alpha值)获取颜色。像素使用 和 坐标进行标识。i
image
x
y
以下是我尝试过的方法:
Color c = new Color(i.getRGB(x, y));
由于某种原因,新的颜色对象包含正确的 RGB,但 Alpha 会丢失。
我做错了什么?
提前致谢
您使用的单参数构造函数会丢弃 alpha 信息。请改用双参数版本,并传入 :Color
true
hasalpha
Color c = new Color(i.getRGB(x, y), true);
相关的 Javadoc:
Color(int rgb)
使用指定的组合 RGB 值创建不透明的 sRGB 颜色,该值由位 16-23 中的红色分量、位 8-15 中的绿色分量和位 0-7 中的蓝色分量组成。
Color(int rgba, boolean hasalpha)
使用指定的组合 RGBA 值创建 sRGB 颜色,该值由位 24-31 中的 alpha 分量、位 16-23 中的红色分量、位 8-15 中的绿色分量和位 0-7 中的蓝色分量组成。
阿尔法不会丢失。
必须使用(int,boolean)构造函数(获取像素信息并指定它是否具有带有布尔值的 alpha 值)或采用 4 个值(红色、绿色、蓝色和 Alpha)的构造函数。
来自 JavaDoc 的 (int,int,int,int) 构造函数信息
若要缩短代码,始终可以替换以下所有代码,这些代码告诉颜色构造函数像素信息确实包含 Alpha 值。Color color = new Color(i.getRGB(x, y), true);
来自 JavaDoc 的(int,boolean) 构造函数信息
请注意,有时在检索 alpha 时,以下方式可能会返回 -1,在这种情况下,这意味着它会循环回 255,因此您必须执行 256-1 才能获得实际的 alpha 值。此代码段演示如何加载图像并在特定坐标(在本例中为 0,0)上获取该图像的颜色。下面的示例可以演示如何检索每个颜色值(包括 alpha),并将其重新构造为新颜色。
import java.awt.Color;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.MalformedURLException;
import java.net.URL;
import javax.imageio.ImageIO;
public class main {
public static void main(String [] args){
BufferedImage image = null;
try {
image = ImageIO.read(new URL("image.png"));
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
int pixel = image.getRGB(0, 0);
int alpha = (pixel >> 24) & 0xff;
int red = (pixel >> 16) & 0xff;
int green = (pixel >> 8) & 0xff;
int blue = (pixel >> 0) & 0xff;
Color color1 = new Color(red, green, blue, alpha);
//Or use
Color color2 = new Color(image .getRGB(0, 0), true);
}
}
BufferedImages getRGB(int,int) JavaDoc,正如你所看到的::
Returns an integer pixel in the default RGB color model (TYPE_INT_ARGB) and default sRGB colorspace. Color conversion takes place if this default model does not match the image ColorModel. There are only 8-bits of precision for each color component in the returned data when using this method.
这意味着 Alpha 值也会被检索。