2009-07-28 6 views
0

バイト配列からコードでSystem.Drawing.Bitmapを構築していますが、.BMPファイルとして正しく保存されるように設定する必要のあるプロパティや設定が不明です。私は(それが16ビットlittle'endian値を含むバイト配列から読み取り、グレイスケール画素に変換です)ビットマップデータを設定するコードとして私のコンストラクタとしてBitmap b = new Bitmap(width, height, PixelFormat.Format32bppArgb);コードからビットマップを作成する。どのようなステップが必要ですか?

for (int i = 1; i < data.Length; i += 2;) 
    { 
     Color c = new Color(); 
     c.A = data[i]; 
     c.R = data[i]; 
     c.G = data[i]; 
     c.B = data[i]; 
     int x = (i + 1)/2; 
     int y = x/width; 
     x %= width; 
     b.SetPixel(x, y, c); 
    } 

を有します。このビットマップを保存可能にするには、他に何をする必要がありますか?

答えて

1

イメージデータを設定した直後にビットマップを保存することはできません。

Bitmapクラスのインスタンスは、ちょうどSave(string filename)メソッドを呼び出すことにより、.BMPファイルとして保存することができますsee this link for more information.

+0

私は現時点でスピードではなく作業コードを使用しています。これは最高の答えのように見える、ありがとう! – RCIX

0

i=1から始まるが、ところで、悪い動きのように見える - 0すべきですか?)

あなたは(b.Save("foo.bmp");)、それを保存しようとするとどうなりますか?

また、これが大きな画像の場合は、LockBitsを見たいかもしれません。関連する投稿はhereです(1次元配列ではなく長方形の配列を使用していますが)。

+0

詳細については、Wikipedia article on Grayscaleを参照してください、私は持っていない2.を追加します私はテストすることができますが、私はそれに取り組んでいます。 – RCIX

1

、ループ内で使用SetPixel方法が全く遅いことに注意してください。

他の回答で述べたように、ピクセルをループで一度に1つずつ設定するのは少し遅いです。

また、あなたがColor構造体のプロパティを設定することはできません、あなたは次のようにそれを作成する必要があります。

Color c = Color.FromArgb(data[i], data[i + 1], data[i + 2], data[i + 3]); 

(わからない、あなたのデータに何である[]配列)

+0

私はそれ以来、データをint値に変換する別の方法を開発しました。 – RCIX

0

グレースケールを計算するための計算式は、通常は使用されていません。確かに、それはかなりうまくいくでしょうが、あなたはおそらくスタンダードにしたがっています。 目はいくつかの色(緑)を受け入れやすいので、通常は別の計量を使用します。私はこのような色を設定します。

c.R = 0.3 * data[i]; 
c.G = 0.59 * data[i]; 
c.B = 0.11 * data[i]; 
c.A = 1; 

は、私は1から開始理由ですので、私は色に変換し、各16ビット値の上位バイトをスローするように助言された

関連する問題