2

バイト配列からビットマップを作成するのに問題がある理由を理解しようとしています。次のように、バイト配列からのビットマップの作成に関する既存の投稿を注意深く調べた後、これを投稿します。

私のコードは、デジタル画像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);         
}

私が得る出力画像は次のとおりです。

出力画像

行ごとにピクセルが失われていることは明らかですが、理由がわかりません。

  1. 私はすべてのパラメータを注意深く制御しました:OutputImageColsOutputImageRows そしてbyte[] byteBufferテストの方法として既知の値を書くことさえ長さと内容。
  2. このコードは、StackOverflowや他の場所に投稿されている他のコードとほぼ同じです。

誰かが問題がどこにあるかを特定するのを手伝ってくれるかもしれませんか?

4

1 に答える 1

0

答えは適切に私のものではありません。本当の答えは、解決策をトリガーするヒントを私に与えてくれたHans Passantから来ています(ありがとう、Hans)。誰かが興味を持った場合に備えて、簡単な詳細を提供するだけで答えを閉じます:バッファで作業してから、Marshal.Copyを使用してコピーする代わりに、別のバッファでの4バイトのアライメントの問題を処理し、厳密に必要なメモリよりもメモリを使用するために、LockBitsを使用して、操作用にすでに設定されているデータ構造を使用して、画像データを直接操作しました。これは、ハンスに編集された私の質問で私が考えていた代替案でした。残念ながら、私の質問が明確に述べられていないことを認識しています。とにかく、今はすべて正常に動作します。

于 2012-09-13T10:58:44.930 に答える