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);

... と 1 ビット/ピクセルでラスターを作成しているようですMultiPixelPackedSampleModel... これらは両方とも、おそらく 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 に答える