我需要使用文件流创建位图。到目前为止我有这个代码:
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);
可以在
here找到从字节数组创建图像的
BuildImage
函数。假设图像数据是紧凑的 320x240,则最终字节数组的步长应该恰好是宽度,即 320。
试试这个:
/// From stream to bitmap...
FileStream fs = new FileStream("test.bmp", FileMode.Open);
Bitmap bmp = new Bitmap(fs);