【问题标题】:Size of bitmap byte[] differs from BMP memorystream size位图字节 [] 的大小与 BMP 内存流大小不同
【发布时间】:2014-07-06 12:32:39
【问题描述】:

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

我打开一个 24 位的位图并将其转换为 16 位。位图是 800x600,所以 byte[] 长度应该是 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...");

【问题讨论】:

  • 如果你看一下 BITMAP 文件格式,很明显你不应该只计算像素en.wikipedia.org/wiki/BMP_file_format
  • @Steve,您应该将其发布为答案。
  • 只是吹毛求疵:空字节数组byte[] data = new byte[0]; 的实例化是多余的。 (嗯,它没有负面的副作用,但它也没有任何好处......)。摆脱它,然后做byte[] data;。也不要使用流 + stream.Close() 而是使用using (MemoryStream mem_stream = ...) { ...do stuff with stream... } - using 语句确保流在 using 阻塞时及时关闭正在离开...
  • 有吹毛求疵,然后有好的建议。 +1 位于右侧

标签: c# bitmap memorystream


【解决方案1】:

额外的字节是文件头,例如:

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

像素数据中也可能有额外的字节。在您的情况下,每个扫描线有两个字节的 800 个像素,每个扫描线有 1600 个字节,但是如果您有例如三个字节的 145 个像素,每个像素会产生 435 个字节,因此每个扫描线将添加一个填充字节以使其成为 436能被四整除。

参考:BMP file format

【讨论】:

    【解决方案2】:

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

    Bitmap 的总长度是这样计算的:

    int size1 = bmp1Data.Stride * bmp1Data.Height;
    

    您可以查看post,它使用它为 LockBits 方法创建一个数组,以便扫描整个位图。

    【讨论】:

    • 哎呀,我以为您在谈论预期的数据大小与内存中位图的实际大小。我会留下这个答案,即使它不是你的问题,因为它也包含一些有用的信息。至于文件大小,史蒂夫说得对;即使是像 BMP 这样的愚蠢格式也有一个小标题。
    猜你喜欢
    • 2021-09-22
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 2019-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多