从BufferedImage读取像素 - 错误的颜色值

时间:2013-03-14 20:36:07

标签: java bufferedimage raster

当宇宙飞船被摧毁时,我会创建包含宇宙飞船图像像素的列表。像素是我的Pixel类的对象。创建列表后,它会添加到主列表中,对其执行各种操作。这就是我的代码的样子:

//Code which creates an array
List<Pixel> pixels = new LinkedList<>();
BufferedImage buff = (BufferedImage)image;
for (int px = 0; px < buff.getWidth(); px++) {
    for (int py = 0; py < buff.getHeight(); py++) {
        int rgb = buff.getRGB(px, py);
        int red = (rgb & 0x00ff0000) >> 16;
        int green = (rgb & 0x0000ff00) >> 8;
        int blue = rgb & 0x000000ff;
        int alpha = (rgb >> 24) & 0xff;
        if (alpha == 255) {
            pixels.add(new Pixel(px, py, red, green, blue));
        }
    }
}
//Pixel class constructor
Pixel(float x, float y, int red, int green, int blue) {
    super(x, y);
    BufferedImage buff = new BufferedImage(1, 1, BufferedImage.TYPE_INT_ARGB);
    WritableRaster raster = buff.getRaster();
    //LOOKS EVERYTHING IS OKAY SINCE THIS LINE SO THE ERROR MUST BE SOMEWHERE IN THOSE 2 LINES
    raster.setPixel(0, 0, new int[]{red, blue, green, 255});
    image = buff;
}

简短说明:图像是Image类型的私有字段。它用于repaint()方法,该方法使用drawImage()方法绘制像素。关于我的问题:Eveything工作几乎没问题。像素正在创造正确的位置,但都是紫罗兰色。它们有不同的色调(更明亮和更暗),但都是紫色,而不是与图像的颜色相同的颜色!为什么会这样?为何紫罗兰?有人可以帮助我解决这种奇怪的行为吗?

1 个答案:

答案 0 :(得分:1)

这可能是setPixel方法中绿色和蓝色值的混合。颜色通常以RGB顺序给出,这是您从BufferedImage解压缩它们的方式。

而不是

raster.setPixel(0, 0, new int[]{red, blue, green, 255});

raster.setPixel(0, 0, new int[]{red, green, blue, 255});

如果这不起作用,您可能需要修改数组中的不同变量顺序,直到它看起来正确。