4

そこには多くのピクチャーボックスの質問があるようですが、ピクチャーボックスの内容を単にファイルからロードされたのではないビットマップに変更することを扱っているものは見つかりませんでした。

私のアプリケーションはバイトの配列を取り、それらからビットマップを生成します。中間の処理ステップとしてファイルに書き込むことは本当に避けたいです。

これはバイトの配列であり、2バイトの単語ではないため、グレースケールパレットを使用してインデックス付きビットマップを作成する必要がありました。

次に、インデックス付きのビットマップを通常のビットマップ(24ビットRGB)に変換しました。

これは私にとってエラーを引き起こしているコードです:

pictureBox1.Image = (System.Drawing.Image)bmp2;

フォームを表示すると(画像ボックスが描画しようとします)、スレッドは「System.Drawing.Image.get_RawFormat()のパラメーターが無効です」というメッセージを表示して実行を停止します。

私は何が間違っているのですか?ピクチャーボックス用の安全なビットマップを作成するにはどうすればよいですか?

これが「bmp2」を作成するものです。

//creating the bitmap from the array
System.Drawing.Bitmap bmp1 = new System.Drawing.Bitmap(100, 100, 100, System.Drawing.Imaging.PixelFormat.Format8bppIndexed, MyIntPtr);

//creating a proper indexed palette
System.Drawing.Imaging.ColorPalette GrayPalette = bmp1.Palette;
for (int i = 0; i < GrayPalette.Entries.Length; i++)
{
    GrayPalette.Entries[i] = Color.FromArgb(i, i, i);
}
bmp1.Palette = GrayPalette;

//creating a non-indexed, 24bppRGB bitmap for picturebox compatibility
System.Drawing.Bitmap bmp2 = new Bitmap(bmp1.Width, bmp1.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
Graphics gr = Graphics.FromImage(bmp2);
gr.DrawImage(bmp1, 0, 0);
gr.Dispose();

bmp1.Save(@ "testfile.bmp")を使用すると、異常がないように見える完全に許容できるビットマップが得られます。

ビットマップをpicturebox.Imageとして使用できないのはなぜですか?新しいビットマップをロードする前に変更する必要があるピクチャーボックスの追加パラメーターはありますか?

4

1 に答える 1

4

さて、私は自分がやっていたことに問題があることに気づきました。

何が悪かったのか説明しようと思いますが、非教祖としてどれだけ正確かはわかりません。

どうやらpictureBoxに画像を設定しても、メモリはどこにもコピーされません。後で私のアプリケーション(私が示したコードスニペットから離れたいくつかの関数)で、変数「bmp1」を破棄していました。

bmp1に関連付けられたメモリが、関数が渡すすべての場所で同じメモリであることに気づかなかったため、bmp1を破棄すると、「System.Drawing.Image.get_RawFormat()の無効なパラメータ」というエラーが発生しました。これは、pictureBoxが再描画されるたびに、その「Image」プロパティを使用して描画するためだと思います。「Image」プロパティに関連付けられたメモリを破棄していたため、picturebox_Paintイベントが正しく機能することを期待していました。

作成したビットマップを破棄しないことで、メモリリークが発生しないことを願っています。

于 2010-02-03T12:59:38.627 に答える