バイト配列からビットマップを作成するのに問題がある理由を理解しようとしています。次のように、バイト配列からのビットマップの作成に関する既存の投稿を注意深く調べた後、これを投稿します。
私のコードは、デジタル画像8bppIndexedでフィルターを実行し、byte []バッファーにピクセル値を書き込んで、8BppIndexedビットマップで(グレーレベルを管理するための処理後に)再度変換することを目的としています。
私の入力画像は、特定のPerlコードを使用して作成された些細な画像です。
もちろん、フィルターを実行した後、フィルターが境界を管理する方法のために、出力画像は最初と最後の行と最初と最後の列を失ったので、元の256x256画像から254x254画像を取得します。
問題に集中し続けるために、実際に実行された操作が明白になるように、フィルターの実行を担当するコードにコメントしました。
ComputedPixel = InputImage.GetPixel(myColumn, myRow).R;
私は知っています、私はロックとロック解除を使うべきです、しかし私は一つずつ頭痛を好む。とにかく、このコードは一種のアイデンティティ変換である必要があり、最後に私は以下を使用します:
private unsafe void FillOutputImage()
{
OutputImage = new Bitmap (OutputImageCols, OutputImageRows, PixelFormat .Format8bppIndexed);
ColorPalette ncp = OutputImage.Palette;
for (int i = 0; i < 256; i++)
ncp.Entries[i] = Color .FromArgb(255, i, i, i);
OutputImage.Palette = ncp;
Rectangle area = new Rectangle(0, 0, OutputImageCols, OutputImageRows);
var data = OutputImage.LockBits(area, ImageLockMode.WriteOnly, OutputImage.PixelFormat);
Marshal.Copy(byteBuffer, 0, data.Scan0, byteBuffer.Length);
OutputImage.UnlockBits(data);
}
私が得る出力画像は次のとおりです。
行ごとにピクセルが失われていることは明らかですが、理由がわかりません。
- 私はすべてのパラメータを注意深く制御しました:
OutputImageCols
、OutputImageRows
そしてbyte[] byteBuffer
テストの方法として既知の値を書くことさえ長さと内容。 - このコードは、StackOverflowや他の場所に投稿されている他のコードとほぼ同じです。
誰かが問題がどこにあるかを特定するのを手伝ってくれるかもしれませんか?