我正在学习在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);
}
答案 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
数组作为其后备缓冲区。