Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 位图文件大小与字节[]大小_C#_Bitmap - Fatal编程技术网

C# 位图文件大小与字节[]大小

C# 位图文件大小与字节[]大小,c#,bitmap,C#,Bitmap,bmp.ToByteArray(ImageFormat.bmp)。长度3145782 int 但文件系统显示为2,25MB(2.359.350字节),磁盘大小显示为2,25MB(2.363.392字节) 存在差异的原因以及如何确定字节[]中位图的正确大小 形式 Windows 7/NTFS我怀疑这是因为磁盘上的文件不包含alpha通道,但在内存中它包含alpha通道。在磁盘上是每像素3字节,但在内存中是4字节 2359350*4/3为3145800,仅略高于您看到的值。我想有一点区别是因为磁盘上

bmp.ToByteArray(ImageFormat.bmp)。长度3145782 int
但文件系统显示为
2,25MB(2.359.350字节),磁盘大小显示为2,25MB(2.363.392字节)

存在差异的原因以及如何确定字节[]中位图的正确大小 形式


Windows 7/NTFS

我怀疑这是因为磁盘上的文件不包含alpha通道,但在内存中它包含alpha通道。在磁盘上是每像素3字节,但在内存中是4字节


2359350*4/3为3145800,仅略高于您看到的值。我想有一点区别是因为磁盘上有一个标头,但实际上它不是映像的一部分。

您所说的确切类型是什么?磁盘上的格式是什么?请链接到
ToByteArray()
方法文档。问题中添加的信息正确的大小是什么意思?你问题的背景是什么?每个人都是正确的,因为他们有不同的背景。顺便说一句,文件有标题,这可能是原始图片字节和磁盘大小之间的差异。您是如何在磁盘上获得文件的?请将写入此文件的代码发布到磁盘。基本上,试着发布一个完整的例子来说明差异。您很可能会发现,在发布的代码之外有一些代码产生了差异。例如,一个典型的原因可能是您首先从磁盘加载一个2.25MB jpeg,然后将其作为BMP或具有不同质量因子的JPG重新保存到内存中,从而对图像产生新的解释,从而导致不完全相同的字节。你能解释一下字节数组、图像和文件之间的关系吗?或者可能(或者另外)磁盘上的格式是压缩的,而内存中的格式不是?对,但我假设磁盘上是一个.bmp文件,对于32bbp图像,它是未压缩的。如果这个假设是错误的,那么很可能是压缩。不过,我希望压缩率比25%更好,而且数字之间的比率是非常巧合的。现在OP更新了他的问题,我相信这(缺少的alpha通道)就是答案。我尝试将Format32bppRgb转换为相同的大小,但当我格式化24BPPRGB 2359350 int时。所以差异不是来自alpha,而是位深度。这将引导我找到解决方案,因此我将接受作为答案,您最好将此添加到其他有相同问题的人的答案中。32bpp和24bpp之间的区别是8位alpha通道。
    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();
        }
    }