2

私は画像を操作しようとしていますが、ビットマップと画像に関してはかなり新しいので、質問とコードについてはほとんど説明していません。Bgr24ピクセルデータを保持するようにバイト配列を初期化して、BitmapSourceオブジェクトに渡すことができるようにします。しかし、私のピクセル配列は「私が思う」正しいサイズではありません。

コードの最後の行は、実際には私の問題です。パラメーター「pixels」は、「System.ArgumentExceptionが未処理でした。値が期待される範囲内にありません。」というエラーをスローします。

これらの変数を初期化します

int imageSize = 100;
double dpi = 96;
int width = 128;
int height = 128;
byte[] pixels = new byte[width * height * 3];

//Create my image....

for (int i = 0; i < imageSize; i++) 
{
     for (int j = 0; j < imageSize; j++) 
            {
              int ct = myImage[i, j];

              pixels[i * imageSize * 3 + j + 0] = (byte)((ct % 16) * 14);
              pixels[i * imageSize * 3 + j + 1] = (byte)((ct % 32) * 7);
              pixels[i * imageSize * 3 + j + 2] = (byte)((ct % 128) * 2);

            }
}//end for

        //Create the bitmap
        BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width);

ピクセル配列を正しく設定していないことを理解しています。何かご意見は?

4

2 に答える 2

4

「値が期待される範囲内にありません」は、HRESULT.CheckWIC関数(WPFイメージング機能の基盤となるネイティブAPI)が返されるときにスローされるArgumentExceptionのメッセージですWINCODEC_ERR_INVALIDPARAMETER

この場合、問題は、最後のパラメータがBitmapSource.Createビットマップの「ストライド」(幅ではない)でなければならないことです。ビットマップの「ストライド」は、ビットマップの各行を格納するために必要な(整数の)バイト数です。このMSDNマガジンの記事によると、ストライドを計算するための一般式はですstride = (width * bitsPerPixel + 7) / 8;。24bppビットマップの場合、これはに単純化されwidth * 3ます。

例外を防ぐには、正しいストライド値を渡します。

BitmapSource bmpSource = BitmapSource.Create(width, height, dpi, dpi, PixelFormats.Bgr24, null, pixels, width * 3);
于 2010-12-10T08:26:31.780 に答える
1

これは、ビットマップを操作するときに使用するコードです...

private const int cRedOffset = 0;
private const int cGreenOffset = 1;
private const int cBlueOffset = 2;
private const int cAlphaOffset = 3;

var width = bmp.Width;
var height = bmp.Height;
var data = bmp.LockBits(Rectangle.FromLTRB(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
var stride = data.Stride;
var pixels = new byte[height * stride];

Marshal.Copy(data.Scan0, pixels, 0, height * stride);

for (var row = 0; row < height; row++)
{
    for (var col = 0; col < width; col++)
    {
        var pixel = (row * stride) + (col * 4);
        var red = pixels[pixel + cRedOffset];
        var green = pixels[pixel + cGreenOffset];
        var blue = pixels[pixel + cBlueOffset];
        var alpha = pixels[pixel + cAlphaOffset];
    }
}
于 2010-12-10T07:10:57.020 に答える