[英]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 位灰度圖像。
本答案中解釋了第一個選項。
第二個選項包括三個步驟:
編碼:
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。
嘗試這個:
/// 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.