With BufferedImages, when creating a WritableRaste

2019-08-08 15:23发布

I'm learning to use BufferedImages in java, and am trying to create an animation where each frame of the animation is the result of mathematically fiddling around with pixel data. I'm just playing around really. Originally I was using an indexed ColorModel, but I've changed it (to take advantage of more colors) to a direct ColorModel. But now an error crops up saying -

Raster sun.awt.image.SunWritableRaster@29c204 is incompatible with ColorModel DirectColorModel: rmask=ff0000 gmask=ff00 bmask=ff amask=ff000000

The code I was using to create the BufferedImage and WriteableRaster is here:

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条回答
乱世女痞
2楼-- · 2019-08-08 15:44

The easiest way to make sure you have a WritableRaster that is compatible with your ColorModel is to first choose the color model, then create a raster from it like this:

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

However, this might not be practical, for example in situations like yours where you create a DataBuffer from an existing array. In that case, I would actually recommend looking at the source code of the constructors of java.awt.image.BufferedImage and the createCompatibleWritableRaster methods of the different ColorModel implementations (that's the way I taught myself how to do it :-). It shows the most common combinations of rasters and color models that work well together.

Your line:

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

...seem to be creating a raster with MultiPixelPackedSampleModel and 1 bit per pixel... Both of these are probably incompatible with the RGB color model. What you want is probably want is:

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

PS: You shouldn't need to to do the image.setRGB on the last line of your code, as the image is using your data array as its backing buffer already.

查看更多
登录 后发表回答