使用缓冲图像,在创建可写光栅时,如何确保它与特定的颜色模型兼容



我正在学习在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数组作为其支持缓冲区。

最新更新