我正在学习在java中使用BufferedImages,并尝试创建一个动画,其中动画的每一帧都是数学上摆弄像素数据的结果。我只是在玩玩。最初我使用的是索引的ColorModel,但是我已将其(以利用更多颜色)更改为直接ColorModel。但现在突然出现一个错误说——
光栅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);
}
确保拥有与ColorModel
兼容的WritableRaster
的最简单方法是首先选择颜色模型,然后从中创建光栅,如下所示:
ColorModel colorModel = ColorModel.getRGBdefault(); // Or any other color model
WritableRaster raster = colorModel.createCompatibleWritableRaster(width, height);
但是,这可能不切实际,例如,在从现有数组创建DataBuffer
的情况下。在这种情况下,我实际上建议查看java.awt.image.BufferedImage
构造函数的源代码以及不同ColorModel
实现的createCompatibleWritableRaster
方法(这是我教自己如何做到这一点的方式:-)。它显示了栅格和颜色模型的最常见组合,这些组合可以很好地协同工作。
您的生产线:
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
数组作为其支持缓冲区。