我有一个包含图像数组的结构:
public struct ObjectImages
{
public System.Drawing.Image[] _images;
public ObjectImages(System.Drawing.Image[] images)
{
_images = images;
}
}
如果我在对象中放入10 kb的两张图像然后尝试序列化,我发现我的内存流目标有160kb。我验证了,每个图像都有~10-11kb。
ObjectImages o = new ObjectImages(x); // where x is an array of images from my webcam
MemoryStream ms = new MemoryStream();
BinaryFormatter formatter = new BinaryFormatter();
formatter.Serialize(ms, o);
我发现真的很奇怪!如果你知道问题出在哪里,能告诉我吗?
答案 0 :(得分:2)
嗯,当您在硬盘上看到图像时,它会被压缩 - 例如PNG或JPEG文件。在C#中加载图像时,它会被解压缩,因此可以渲染像素。所以实际上,图像包含的字节数多于存储在硬盘上的字节数。
C#对象包含未压缩的数据,因此粗略地(对于RGBA图像),内存中的大小应该是.NET所需的(4 * width * height) + further data
。二进制格式化程序不保存图像(作为PNG或JPEG),它保存表示图像的对象。