簡體   English   中英

用文件流創建位圖

[英]create bitmap with 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 ) 和我的像素數據是 ushort 數組中給出的 16 位灰度值。

謝謝

似乎 System.Drawing 類不喜歡處理 16 位灰度,可能是因為底層 GDI+ 對象將其顏色分量視為從 0 到 255 的值,而 16 位灰度實際上意味着您可以擁有 65535 種灰度。

這意味着您有兩個選擇:要么切換到 PresentationCore,然后使用它創建圖像,要么將值下采樣到字節大小並制作 8 位灰度圖像。

本答案中解釋了第一個選項。

第二個選項包括三個步驟:

  • 將數據下采樣到每像素 1 個字節
  • 生成灰度調色板(因為 8 位灰度在技術上是調色板)
  • 從您的下采樣數據和調色板中創建一個 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函數。 假設圖像數據是緊湊的 320x240,最終字節數組的步幅應該正好是寬度,因此是 320。

有一個構造函數可以從字節數組創建Bitmap 然后,使用Bitmap的成員函數將其保存為 bmp 格式的流。 請參閱此處此處

嘗試這個:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM