4

8bpp のピクセルを編集しようとしています。この PixelFormat にはインデックスが付けられているため、カラー テーブルを使用してピクセル値をマッピングしていることを認識しています。ビットマップを 24bpp に変換して編集することもできますが、8bpp 編集の方がはるかに高速です (13ms 対 3ms)。ただし、8bpp ビットマップにアクセスするときに各値を変更すると、PixelFormat が 8bpp のままであっても、いくつかのランダムな RGB カラーが発生します。

私は現在c#で開発しており、アルゴリズムは次のとおりです。

(C#)

1- 元のビットマップを 8bpp でロード

2- 元と同じサイズの 8bpp で空の一時ビットマップを作成します。

両方のビットマップの 3-LockBits と、P/Invoke を使用して、各 BitmapData オブジェクトの Scan0 を渡す C++ メソッドを呼び出します。(ビットマップのピクセルを反復処理するときにパフォーマンスが向上するため、C++ メソッドを使用しました)

(C++)

4- いくつかのパラメーターに従って int[256] パレットを作成し、元のピクセル値をパレットに渡すことによって一時ビットマップ バイトを編集します。

(C#)

5-アンロックビット。

私の質問は、奇妙な RGB カラーを使用せずにピクセル値を編集する方法、または 8bpp ビットマップのカラー テーブルを編集する方法です。

4

3 に答える 3

11

C++ の世界に移動したり、P/Invoke を使用したりする必要はまったくありません。C# はポインターとアンセーフ コードを完全にサポートしています。これがあなたの問題を引き起こしていると推測する危険さえあります。

色はデフォルトのパレットから来ている可能性があります。パレットの変更がまったく遅くないことがわかるでしょう。これは、グレースケール パレットを作成するために行うことです。

image = new Bitmap( _size.Width, _size.Height, PixelFormat.Format8bppIndexed);
ColorPalette pal = image.Palette;
for(int i=0;i<=255;i++) {
    // create greyscale color table
    pal.Entries[i] = Color.FromArgb(i, i, i);
}
image.Palette = pal; // you need to re-set this property to force the new ColorPalette
于 2010-04-18T22:01:27.910 に答える
0

System.Drawing.Image代わりにロードしてみましたか?このクラスを使用すると、カラー パレットにアクセスできます。パレットが設定されたら、System.Drawing.Imageとしてラップすることができます。System.Drawing.Bitmap

System.Drawing.BitMap.SetPixel()インデックス付きのカラー画像でどのように機能するかわかりません。パレット内の最も近い色にマップしようとしている可能性があります。

于 2010-04-07T15:14:19.807 に答える