2011-03-27 1 views
0

파일 스트림으로 비트 맵을 생성해야합니다. 지금까지 나는이 코드를 가지고있다 :파일 스트림으로 비트 맵을 생성하십시오.

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)를 알고 있고 픽셀 데이터는 ushort 배열에 주어진 16 비트 그레이 스케일 값이다.

감사

답변

0

바이트 배열에서 Bitmap을 만들 수있는 생성자가있다. 그런 다음 Bitmap의 멤버 함수를 사용하여 bmp 형식으로 스트림에 저장합니다. herehere을 참조하십시오.

+0

바이트 배열이 없으므로 Bitmap 클래스를 사용할 수 없습니다! USHORT 값이 있습니다. – h0ppel

+3

Bitmap.LockBits()를 사용하고 16bpp 형식을 요구합니다. –

+1

PixelFormat.Format16bppGrayScale을 사용할 때 항상 gdi + 오류가 발생합니다. 다른 pixelformats도 잘 작동합니다. 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(); 위의 두 행 다음에 즉시 발행되거나 스트림이 비트 맵이 사용되는 동안 열려 있어야하는지 여부. – ADTC

0

가 System.Drawing 클래스 16 비트 계조 처리 싫어하는 보이는데, 기본 GDI + 목적은 16 비트 계조 반면, 0 ~ 255의 값으로 그 컬러 성분 본다 때문일 실제로 회색의 65535 음영을 가질 수 있음을 의미합니다.

즉, PresentationCore로 전환하여 이미지를 만들거나 값을 바이트 크기로 다운 샘플링하고 8 비트 회색 음영 이미지를 만들 수 있습니다.

첫 번째 옵션은 this answer에 설명되어 있습니다.

  • (8 비트 그레이 스케일 기술적 팔레트 때문에)
  • 는 그레이 컬러 팔레트를 생성 픽셀 당 1 바이트
  • 는 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.