使用BufferedImages,在创建WritableRaster时,如何确保它与特定的ColorModel兼容?

时间:2013-09-25 08:03:13

标签: animation pixel bufferedimage

我正在学习在java中使用BufferedImages,我正在尝试创建一个动画,其中动画的每一帧都是数学上摆弄像素数据的结果。我只是在玩耍。最初我使用的是索引的ColorModel,但我已经将它(以利用更多颜色)更改为直接ColorModel。但现在出现了一个错误 -

Raster sun.awt.image.SunWritableRaster@29c204与ColorModel DirectColorModel不兼容:rmask = ff0000 gmask = ff00 bmask = ff amask = ff000000

我用来创建BufferedImage和WriteableRaster的代码在这里:

public void initialize(){
    int width = getSize().width;
    int height = getSize().height;
    data = new int [width * height];

    DataBuffer db = new DataBufferInt(data,height * width);
    WritableRaster wr = Raster.createPackedRaster(db,width,height,1,null);
    image = new BufferedImage(ColorModel.getRGBdefault(),wr,false,null);
    image.setRGB(0, 0, width, height, data, 0, width);
}

1 个答案:

答案 0 :(得分:1)

确保您拥有与WritableRaster兼容的ColorModel的最简单方法是首先选择颜色模型,然后从中创建一个栅格:

ColorModel colorModel = ColorModel.getRGBdefault(); // Or any other color model
WritableRaster raster = colorModel.createCompatibleWritableRaster(width, height);

但是,这可能不太实际,例如在您从现有阵列创建DataBuffer的情况下。在这种情况下,我实际上建议查看java.awt.image.BufferedImage的构造函数的源代码和不同createCompatibleWritableRaster实现的ColorModel方法(这就是我教自己如何做的方式) :-)。它显示了最常见的栅格和颜色模型组合,它们可以很好地协同工作。

你的专栏:

Raster.createPackedRaster(db,width,height,1,null);

...似乎正在创建一个MultiPixelPackedSampleModel和每像素1位的栅格......这两者都可能与RGB颜色模型不兼容。你想要的可能是:

int[] masks = new int[]{0xff0000, 0xff00, 0xff}; // Add 0xff000000 if you want alpha
Raster.createPackedRaster(db, width, height, width, masks, null); 

PS:您不需要在代码的最后一行执行image.setRGB,因为图像已经使用data数组作为其后备缓冲区。