位图文件大小 vs 字节数组大小

4

bmp.ToByteArray(ImageFormat.Bmp).Length 3145782 int,但文件系统显示为2,25 MB (2.359.350 bytes) and Size on disk 2,25 MB (2.363.392 bytes)

为什么会有差异,如何确定字节数组中位图的正确大小?

    string appPath = Application.StartupPath;

    var bmp = new Bitmap(Image.FromFile(appPath + "\\Images\\Penguins.bmp"));

    public static byte[] ToByteArray(this Image image, ImageFormat format)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            image.Save(ms, format);
            return ms.ToArray();
        }
    }

Windows 7 / NTFS


你说的确切类型是什么?磁盘上的格式是什么? - Jon Skeet
请提供“ ToByteArray()”方法的文档链接。 - Matthew Watson
Information added in question - Mert
你所说的“正确大小”是什么意思?你问题的背景是什么?它们都有不同的上下文,因此每个都是正确的。另外,文件有标题,也许这就是原始图片字节和磁盘上的大小之间的区别。 - roxik0
你是如何将文件写入磁盘的?请发布写入磁盘的代码。基本上,尝试发布一个完整的示例,以演示差异。很可能你会发现,发布的代码之外还有其他代码创建了差异。例如,一个典型的原因可能是你首先从磁盘加载了一个2.25MB的JPEG文件,然后将其作为BMP或具有不同质量因素的JPG重新保存到内存中,导致图像的新解释,因此不是完全相同的字节。你能否解释字节数组、图像和文件之间的关系? - Lasse V. Karlsen
var bmp = new Bitmap(Image.FromFile(appPath + "\Images\Penguins.bmp")); 变量bmp = 新位图(图像.从文件(appPath + "\Images\Penguins.bmp")); - Mert
1个回答

2
我怀疑这是因为硬盘上的文件不包含 alpha 通道,但在内存中却有。在硬盘上,每个像素使用3个字节,而在内存中则使用4个字节。
2359350*4/3 等于 3145800,与您发现的值仅略有不同。我猜差异很小是因为硬盘上有一个头文件,但实际上它并不是图像的一部分。

或者(也许还有)磁盘上的格式是压缩的,而内存中的格式则不是? - Matthew Watson
是的,但我假设它是磁盘上的.bmp文件,对于32bbp图像来说是未压缩的。如果这个假设是错误的,那么它很可能是压缩的。我预计压缩比应该比25%更好,并且数字之间的比率相当巧合。 - Andrew Wilkinson
现在OP已经更新了他的问题,我相信这(缺失的Alpha通道)就是答案。 - Matthew Watson
我尝试将Format32bppRgb转换为相同大小,但当我将其转换为Format24bppRgb时,它变成了2359350 int。因此,差异不是来自alpha而是位深度。这让我找到了解决方案,所以我会接受它作为答案,你可以将这个问题添加到你的答案中,以帮助其他遇到同样问题的人。 - Mert
1
32bpp和24bpp之间的区别在于8位alpha通道。 - Andrew Wilkinson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接