使用文件流创建位图

问题描述 投票:0回答:3

我需要使用文件流创建位图。到目前为止我有这个代码:

 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 位灰度值。

谢谢

c# header bitmap filestream
3个回答
0
投票

有一个构造函数可以从字节数组创建

Bitmap
。然后,使用
Bitmap
的成员函数将其保存为 bmp 格式的流。请参阅此处此处


0
投票

似乎 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); 

可以在

here
找到从字节数组创建图像的BuildImage函数。假设图像数据是紧凑的 320x240,则最终字节数组的步长应该恰好是宽度,即 320。


-1
投票

试试这个:

/// From stream to bitmap...
FileStream fs = new FileStream("test.bmp", FileMode.Open);
Bitmap bmp = new Bitmap(fs);
© www.soinside.com 2019 - 2024. All rights reserved.