-1

単純なバイト配列を 8 ビットのインデックス付きビットマップにコピーしようとしています。多くのフォーラムで無数の回答済みの質問に示されているのとまったく同じコードを使用しても、まだ間違った結果が得られます。画像ファイルに書き込もうとしているデータは 360 バイトで、18x20 バイトの線形配列として設定されています。つまり、最初の 18 バイト (0-17) は画像の一番上の行に属し、次の 18 バイト (18-35) は 2 番目の行に属します。 Excel で手動で解析します (セルの背景色を設定して視覚化することもできます)。ただし、C# のコードを使用してこれを抽出しようとすると、間違った形式の画像が表示されます。これがコードです...

public Bitmap CopyByteDataToBitmap(byte[] byteData) {
    Bitmap bmp = new Bitmap(18, 20, PixelFormat.Format8bppIndexed);
    BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, bmp.Width, bmp.Height), ImageLockMode.WriteOnly, bmp.PixelFormat);
    Marshal.Copy(byteData, 0, bmpData.Scan0, byteData.Length);
    bmp.UnlockBits(bmpData);

    return bmp;
}

結果は次のとおりです。最初の行は正しく書かれています。ただし、2 行目以降は 2 バイトのオフセットがあります。つまり、イメージの 2 行目の最初のバイトは、バイト #18 (0 から始まる) ではなく、バイト #20 になります。また、LockBits 呼び出しの直後にブレークポイントを設定すると、幅が明確に 18 に設定されているにもかかわらず、bmpData の「ストライド」プロパティが 20 に等しいことがわかります。図 18 では、LockBits の後、返されたビットマップには影響しません。なぜこうなった?助けてください、ありがとう。

4

1 に答える 1