1

我正在学习在 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);
}
4

1 回答 1

1

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

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

但是,这可能不切实际,例如在您DataBuffer从现有数组创建一个的情况下。在这种情况下,我实际上建议查看构造函数的源代码java.awt.image.BufferedImagecreateCompatibleWritableRaster不同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数组作为其后备缓冲区。

于 2013-09-26T15:31:35.633 回答