2011-03-27 15 views
0

ファイルストリームでビットマップを作成する必要があります。これまで私はこのコードを持っています:filestreamでビットマップを作成

using (FileStream bmp = File.Create(@"C:\test.bmp")) 
     { 
      BinaryWriter writer = new BinaryWriter(bmp); 
      int i = 0; 

      // writer.Write((char*)&fileheader, sizeof(fileheader)); 
      // writer.Write((char*)&infoheader, sizeof(infoheader)); 

      for (int rows = 0; rows < 160; rows++) 
      { 
       for (int cols = 0; cols < 112; cols++) 
       { 
        writer.Write(CamData[i]); 
        i++; 
       } 
      } 

      bmp.Close(); 
     } 

しかし、私はまだビットマップのヘッダー情報が必要です。私の問題は、私はC#でそれらを実装する方法を知らないということです。私は解像度(320 x 240)を知っていて、私のpixeldataはushort配列で与えられた16ビットのグレースケール値です。

おかげ

答えて

0

バイト配列からBitmapを作成するためのコンストラクタがあります。次に、Bitmapのメンバー関数を使用してbmp形式でストリームに保存します。 hereおよびhereを参照してください。

+0

バイト配列は使用できません。私はUSHORTの値を持っています – h0ppel

+3

Bitmap.LockBits()を使用し、16bpp形式を求めます。 –

+1

私はPixelFormat.Format16bppGrayScaleを使うといつもgdi +エラーが出ます。他のピクセル形式もうまくいきます。 PixelFormat.Format24bppRgbを使用した後、私はこの結果を得る:最初の行の3回の画像[test.bmp] [1] [1]:http://i.imgur.com/Cls1e.png – h0ppel

-1

はこれを試してみてください:

/// From stream to bitmap... 
FileStream fs = new FileStream("test.bmp", FileMode.Open); 
Bitmap bmp = new Bitmap(fs); 
+0

既存のビットマップを開く必要はありません。私はファイルストリームで新しいビットマップを作成したいです。 – h0ppel

+0

@KlausはFileModeをFileMode.Create(または他の適切な選択肢)に変更します。とにかく私はfs.Close();上記の2行の後にすぐに発行することも、ビットマップが使用されている間はストリームを開いたままにすることもできます。 – ADTC

0

は、基礎となるGDI +オブジェクトは、16ビットグレースケールのに対し、0〜255の値としてその色成分を見ているせいか、たSystem.Drawingクラスは16ビットグレースケールを扱う好きではないようです実際には、グレーの65535シェードを持つことができます。

これは、PresentationCoreに切り替えてイメージを作成するか、値をバイトサイズにダウンサンプリングして8ビットグレースケールイメージを作成するという2つの選択肢があることを意味します。

最初のオプションについては、this answerで説明しています。

  • (8ビットグレースケールは、技術的にパレットであるため)
  • グレースケールカラーパレットを生成し、画素あたり1バイト
  • が8を作成するために、データのダウンサンプリング:

    第2のオプションは、3つのステップを含みますダウンサンプリングされたデータとパレットのうちの8ビットのインデックス付き画像を表示します。

コード:

Byte[] camDataBytes = new Byte[CamData.Length]; 
for(Int32 i = 0; i < camData.Length; i++) 
    camDataBytes[i] = (Byte)(CamData[i]/256); 

Color[] palette = new Color[256]; 
for(Int32 i = 0; i < 256; i++) 
    palette[i] = Color.FromArgb(i,i,i); 

using(Bitmap b = BuildImage(camDataBytes, 320, 240, 320, PixelFormat.Format8bppIndexed, palette, null)) 
    b.Save(@"C:\test.bmp", ImageFormat.Bmp); 
BuildImage

関数はバイト配列からイメージを作成するためにはhereを見出すことができます。イメージデータが320x240のコンパクトであると仮定すると、最後のバイト配列のストライドは正確に幅になるはずです。したがって、320.

関連する問題