2009-07-28 3 views
0

ビットマップの作成と保存に取り組んでいます。ビットマップ内のピクセルを適切な値に設定するループがあります。しかし、コード内の注目された点でIndexOutOfRange例外を持つ、短い期間のimeの後にクラッシュします。Y座標がループ内の範囲外です

//data is an array of bytes of size (image width * image height) * 2; 
    Bitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb); 
    for (int i = 0; i < data.Length; i += 2) 
    { 
     int luminance = ((int)data[i] << 8) | (int)data[i + 1]; 
     Color c = Color.FromArgb(luminance,luminance,luminance,luminance); 

     int x = i/2; 
     int y = x/width; 
     x %= width; 
     b.SetPixel(x, y, c);//crashes here when Y is at 513, should only go to 512 
    } 
    b.Save(Path.GetFileNameWithoutExtension(fileName) + ".bmp"); 

なぜこれが起こるのかについて私は困惑しています。なぜこれが起こり、どのように修正できますか?

(安全でないコードを改言している人には注意してください:私は作業中のプログラムの後に速いものを書くつもりです)私が始めたら3つの質問を必ず書きます!))

+2

//data is an array of bytes of size (image width * image height) * 2; 

を交換することをお勧めしますが、ループに入る直前にdata.Length、幅と高さをプリントアウトするための行を追加して、あなたを編集してくださいそれらの値で質問する。私は彼らがあなたが期待するものではないと思う。 –

+0

ところで、 "i + 1"は不要です。私は常に偶数になるので、2で割る前に1を加えても結果は変わりません。 –

+0

まだsetPixel? 「安全でないコード」を見てください。より速いコード/プログラムの場合; –

答えて

0

あなたのdataが実際に何であるかを知らなければ何が間違っているのかを知ることは難しいです。私はそれがビットマップのような行に編成されている可能性がありますが、ビットマップ形式のデータでは、行の長さが4バイトの倍数であることが必要です(最後に未使用パディングあり、BMP file format参照)。この場合、値yが予想よりも大きくなることがあります。そのような埋め込みを考慮する必要があるかもしれません。

1

Lengthが奇数の場合、ある時点でi + 1 == Lengthが成立します。

for (int i = 0; i < data.Length; i += 2) 
{ 
    int luminance = ((int)data[i] << 8) | (int)data[i + 1]; 

    int x = (i + 1)/2; 
} 

私は

System.Diagnostics.Debug.Assert(data.Length == width * height * 2); 
System.Diagnostics.Debug.Assert((data.Length % 2) == 0); 
+0

コードの最初の行のコメントは 'data.Length'が偶数であることを示します。しかし、これは確認されていないことが正しいです。 –

+0

しかし、それでも配列の長さが幅*高* 8に近いことがテストによって示されています。それは見知らぬ人と見知らぬ人を取得します。 – RCIX

+0

8バイト/ピクセル+ヘッダーのような感じです。 –

関連する問題