C# 从内存流大小不一致创建图像

C# 从内存流大小不一致创建图像,c#,.net,image,bitmap,C#,.net,Image,Bitmap,我正在从内存流创建一个“gif”图像。我有43字节的内存流。当我从这个流创建一个映像时,我得到一个70字节的映像。有什么问题吗?这是我创建图像的代码: Bitmap httpimage2 = new Bitmap(ms, true); // ms: 43 bytes memory stream httpimage2.Save(@"D:\sample.gif", ImageFormat.Gif); // httpimage2: 70 bytes image 它们是不同的格式,

我正在从内存流创建一个“gif”图像。我有43字节的内存流。当我从这个流创建一个映像时,我得到一个70字节的映像。有什么问题吗?这是我创建图像的代码:

Bitmap httpimage2 = new Bitmap(ms, true);           // ms: 43 bytes memory stream
httpimage2.Save(@"D:\sample.gif", ImageFormat.Gif); // httpimage2: 70 bytes image

它们是不同的格式,那么为什么它们的大小相同呢

提供有关bmp格式的详细信息,并指出内存中的格式将不包含14字节位图文件头,这是造成某些差异的原因

提供有关GIF格式的详细信息

一般来说,可以对内存中表示图像的字节进行一些假设,因为您可能不需要文件中的任何内容来表示图像的元数据,因为该元数据可以隐含在以字节为表示形式的类中。例如,GIF有一个固定长度的标题,指示格式87a或89a。这在内存中可能不是必需的,因为您可能有不同的类,其中仅包含表示图像的字节,一个类用于87a的图像,另一个类用于89a的图像。现在,内存中的图像可以更小,因为您不需要文件中关于其格式的信息,因为这仅在读取hte文件时需要,并用于决定实例化哪个类

由于格式不同,它们需要不同数量的信息来编码相同的图像


如果将图像作为位图保存到磁盘,您可能会发现图像的大小更相似,但它们可能仍然是不同的大小,如果它们是相同的大小,那只是巧合。

它们是不同的格式,为什么它们的大小相同

提供有关bmp格式的详细信息,并指出内存中的格式将不包含14字节位图文件头,这是造成某些差异的原因

提供有关GIF格式的详细信息

一般来说,可以对内存中表示图像的字节进行一些假设,因为您可能不需要文件中的任何内容来表示图像的元数据,因为该元数据可以隐含在以字节为表示形式的类中。例如,GIF有一个固定长度的标题,指示格式87a或89a。这在内存中可能不是必需的,因为您可能有不同的类,其中仅包含表示图像的字节,一个类用于87a的图像,另一个类用于89a的图像。现在,内存中的图像可以更小,因为您不需要文件中关于其格式的信息,因为这仅在读取hte文件时需要,并用于决定实例化哪个类

由于格式不同,它们需要不同数量的信息来编码相同的图像


如果将图像作为位图保存到磁盘,您可能会发现图像的大小更相似,但它们可能仍然是不同的大小,如果它们是相同的大小,那只是巧合。

我不是专家,这可能是因为第二个图像存储在更大的调色板中。从像素角度看,图像是相同的吗


编辑:还要注意,框架对图像的编码可能与创建原始图像的方式不同

我不是专家,这可能是因为第二张图像存储在较大的调色板中。从像素角度看,图像是相同的吗


编辑:还要注意,框架对图像的编码可能与创建原始图像的方式不同

尝试保存图像的调色板和位图,并在“创建”中使用它们尝试保存图像的调色板和位图,并在“创建”中使用它们内存数据大小和磁盘数据大小并非总是100%相同,内存流是否已包含作为gif的二进制数据?也可能是Bitmap.Save方法压缩或使用某些特定的GIF格式,与内存流中最初使用的格式不完全相同。它还能用吗?您是否能够打开并使用保存在磁盘上的图像?内存数据大小和磁盘数据大小并不总是100%相同,内存流是否已经包含gif格式的二进制数据?也可能是Bitmap.Save方法压缩或使用某些特定的GIF格式,与内存流中最初使用的格式不完全相同。它还能用吗?您能够打开并使用保存在磁盘上的图像吗?这更多是为了发表评论而不是回答;-)@DavidePiras我在扩展我的答案的同时提供了一些信息,但就其本身而言,你是对的,第一行只适合作为评论这更适合作为评论而不是答案;-)@戴维德皮拉斯,我在扩大我的答案的同时提供了一些信息,但就其本身而言,你是对的,第一行只适合作为评论