位图byte []的大小与BMP内存流大小不同

时间:2014-07-06 12:32:39

标签: c# bitmap memorystream

我正在尝试通过tcp / ip连接发送位图。到目前为止,我的程序工作正常。但在调试过程中,我发现了我的位图byte []的奇怪值。

我打开一个24位的位图并将其转换为16位。位图是800x600所以字节[]长度应该是800 * 800 * 2Byte = 960000Byte ...但是我的数组是960054 ...

额外字节来自哪里?

        Console.WriteLine("Bitmap auf 16Bit anpassen...\n");
        Rectangle r = new Rectangle(0,0,bitmap_o.Width, bitmap_o.Height);
        Bitmap bitmap_n = bitmap_o.Clone(r, PixelFormat.Format16bppRgb555);
        bitmap_n.Save("test2.bmp");

        Console.WriteLine("Neue Bitmap-Eigenschaften:");
        Console.WriteLine(bitmap_n.Width.ToString());
        Console.WriteLine(bitmap_n.Height.ToString());
        Console.WriteLine(bitmap_n.PixelFormat.ToString());

        byte[] data = new byte[0];
        MemoryStream mem_stream = new MemoryStream();
        bitmap_n.Save(mem_stream, ImageFormat.Bmp);
        data = mem_stream.ToArray();
        mem_stream.Close();

        Console.WriteLine(data.Length.ToString());

        stream.Write(data, 0, 960000);
        Console.WriteLine("Sending data...");

2 个答案:

答案 0 :(得分:2)

位图数组中可能有额外的字节来填充扫描线以获得更好的数字。 扫描线的有效长度称为“Stride”,您可以通过BitmapData.Stride字段进行测试。

Bitmap的总长度计算如下:

int size1 = bmp1Data.Stride * bmp1Data.Height;

你可以看一下post,它使用它来为LockBits方法创建一个数组,以便扫描整个Bitmap。

答案 1 :(得分:2)

额外字节是文件头,其中包含例如:

  • 位图文件签名
  • 图像尺寸(像素大小)
  • 比特深度
  • 分辨率(ppi)

像素数据中还可能有额外的字节。在你的情况下,800个像素,每个两个字节,每个扫描线有1600个字节,但如果你有三个字节的145个像素,每个将产生435个字节,所以一个填充字节将被添加到每个扫描线,使其成为436被四个人平均分配。

参考:BMP file format