18

WriteableBitmap.WritePixelsメソッドに必要なバッファサイズを計算するにはどうすればよいですか?

私は4つのパラメーターを使用してオーバーロードを使用しています。最初はInt32Rect、次は色のRGBA番号を含むバイト配列、3番目はストライド(書き込み可能なビットマップの幅にピクセルあたりのビット数を掛けたもの)です。 8)で、最後はバッファ(Intellisenseではオフセットと呼ばれます)です。

以下のコードでは、バッファサイズが十分なランタイムエラーではありません。

byte[] colourData = { 0, 0, 0, 0 };

var xCoordinate = 1;
var yCoordinate = 1;

var width = 2;
var height = 2;

var rect = new Int32Rect(xCoordinate, yCoordinate, width, height);

var writeableBitmap = new WriteableBitmap(MyImage.Source as BitmapSource);

var stride = width*writeableBitmap.Format.BitsPerPixel/8;

writeableBitmap.WritePixels(rect, colourData, stride,0);

上記のコードで必要なバッファー値を計算するために使用する必要がある式は何ですか?

4

6 に答える 6

15

ストライド値は、書き込み長方形の「ピクセルライン」あたりのバイト数として計算されます。

var stride = (rect.Width * bitmap.Format.BitsPerPixel + 7) / 8;

必要なバッファサイズは、1行あたりのバイト数に行数を掛けたものです。

var bufferSize = rect.Height * stride;

2x2の書き込み長方形と32ビット/ピクセル形式がある場合、たとえばPixelFormats.Pbgra32stride8、bufferSizeは16になります。

于 2012-12-19T13:55:28.273 に答える
3

ストライドは、単に入力バッファのバイト単位の幅です。これはストライドと呼ばれます。これは、画像の各行の後ろに余分なメモリがあり、画像の幅を使用して画像の各行を読み取ることができない場合があるためです。

したがって、あなたの例では、これは2です。ビットマップのピクセルあたりのビット数で何も計算する必要はありません。WritePixelsメソッドはこのすべての情報を知っています。入力データがどのように構造化されているかについての情報を提供する必要があります。

ただし、他の回答で述べたように、ビットマップも2x2の場合、例は機能しません。その場合、開始座標は0,0になります。

編集:

あなたの例をよく見ると、間違いがわかります。colourDataが入力であると言います。ただし、これはピクセルごとの入力です。したがって、2x2のrectを変更する場合は、次のinputdataが必要です。

byte[] colourData = { 0, 0, 0, 0, 0, 0, 0, 0,
                      0, 0, 0, 0, 0, 0, 0, 0 };

そして、ピクセルあたりのバイト数はビットマップのバイト数に等しいので、各行の幅の4倍(2)で、合計8になります。

于 2012-12-20T10:11:53.083 に答える
3

内でチェックを実行するMicrosoftの反映されたコードは次のとおりですCopyPixels

        int num = ((sourceRect.Width * this.Format.BitsPerPixel) + 7) / 8;
        if (stride < num)
        {
            throw new ArgumentOutOfRangeException("stride", MS.Internal.PresentationCore.SR.Get("ParameterCannotBeLessThan", new object[] { num }));
        }
        int num2 = (stride * (sourceRect.Height - 1)) + num;
        if (bufferSize < num2)
        {
            throw new ArgumentOutOfRangeException("buffer", MS.Internal.PresentationCore.SR.Get("ParameterCannotBeLessThan", new object[] { num2 }));
        }
于 2014-03-20T13:44:03.563 に答える
3

ユーザーClemensがバッファサイズに関する質問に回答しましたが、質問者は、バッファサイズがすでに正しいと計算したことに気づかず、問題は別の場所にありました。

詳細はコメントで説明されていますが、包括的なスニペットが1つ欠けています(.WritePixels(.CopyPixelsなし)の完全な使用例もあります)。ここにあります(私は同様の質問をスキャンしましたが、これは最高の場所でした):

var dpiX = 96;

var writeableBitmap = new WriteableBitmap(width, height, dpiX, dpiX, PixelFormats.Bgra32, null); // Pixelformat of Bgra32 results always in 4 bytes per pixel
int bytesPerPixel = (writeableBitmap.Format.BitsPerPixel + 7) / 8; // general formula
int stride = bytesPerPixel * width; // general formula valid for all PixelFormats

byte[] pixelByteArrayOfColors = new byte[stride * height]; // General calculation of buffer size

// The numbers in the array are indices to the used BitmapPalette, 
//     since we initialized it with null in the writeableBitmap init, they refer directly to RGBA, but only in this case.
// Choose a light green color for whole bitmap (for not easy to find commented MSDN example with random colors, see https://msdn.microsoft.com/en-us/library/system.windows.media.imaging.writeablebitmap(VS.85).aspx
for (int pixel = 0; pixel < pixelByteArrayOfColors.Length; pixel += bytesPerPixel)
{
    pixelByteArrayOfColors[pixel] = 0;        // blue (depends normally on BitmapPalette)
    pixelByteArrayOfColors[pixel + 1] = 255;  // green (depends normally on BitmapPalette)
    pixelByteArrayOfColors[pixel + 2] = 0;    // red (depends normally on BitmapPalette)
    pixelByteArrayOfColors[pixel + 3] = 50;   // alpha (depends normally on BitmapPalette)
}

writeableBitmap.WritePixels(new Int32Rect(0, 0, width, height), pixelByteArrayOfColors, stride, 0);
于 2018-01-22T19:09:32.343 に答える
1

私はこれで働いています。60z fs

   this.playerOpacityMaskImage.WritePixels(
                new Int32Rect(0, 0, this.depthWidth, this.depthHeight),
                this.greenScreenPixelData,
                this.depthWidth * ((this.playerOpacityMaskImage.Format.BitsPerPixel + 7) / 8),
                0);
于 2013-09-13T06:36:41.763 に答える
-1

よくわかりませんが、24ビットRGBで動作するようにしてください

  {
     //your code
       var stride = width * 3;
       WriteableBitmap bmp = new WriteableBitmap(width, height, 96, 96, PixelFormats.Bgr24, null);
       bmp.WritePixels(new System.Windows.Int32Rect(0, 0, width , height),byte[],stride,0));

   }
于 2012-12-19T13:56:38.913 に答える