7

.CopyPixels() を実行している {Indexed8} 形式の 2208 x 3000 TransformedBitmap オブジェクトがあります。私は使用しています

(int)((formattedBitmap.PixelWidth * formattedBitmap.Format.BitsPerPixel + 7) / 8)

(「formattedBitmap」がピクセルをコピーしようとしている画像の名前であると仮定します)メソッド呼び出しの「ストライド」値と長さが2208のバイト配列。コードの他の場所でこのような作業を行っています (画像の形式は {Gray8} です。ただし、前述の画像でこれと同じことを実行しようとすると、「範囲外の引数」が継続的に取得されます)。 「パラメータ値を '6624000' 未満にすることはできません。\r\nパラメータ名: バッファ」という例外。

これに関する私の質問は次のとおりです。まったく同じコードがある場所では機能し、別の場所では機能しないように見えるのはなぜですか? 平たく言えば、「ストライド」とは一体何なのでしょうか? そして、このエラーを発生させずに (ビットをコピーするという) 目的の効果を得るにはどうすればよいでしょうか? 私は何を間違っていますか?

これに対する任意の助けは非常に高く評価されます. どうもありがとう!

4

1 に答える 1

9

私はこれを理解しました(うわー...これをいじるのに1時間近く何かを費やしたなんて信じられません!)。問題は、バイト配列のサイズが同じでなければならないことでした

sourceImage.PixelHeight * stride

どこ

int stride = (int)((sourceImage.PixelWidth * sourceImage.Format.BitsPerPixel + 7) / 8);

コードの他の場所で機能した理由は、画像全体のピクセルをコピーするのではなく (問題が発生した場所で実行しようとしているため)、1 行のピクセルのみをコピーしていたためです。 ..つまり、基本的には 2008 x 1 の領域であるため、宛先バイト配列のサイズは正確に 2208 であり、正常に動作します。今後の参考のために、多かれ少なかれ、このようなものを常に使用する必要があります。

int width = source.PixelWidth;
int height = source.PixelHeight;
int stride = width * ((source.Format.BitsPerPixel + 7) / 8);

byte[] bits = new byte[height * stride];

source.CopyPixels(bits, stride, 0);

乾杯!

于 2010-09-14T19:16:48.070 に答える