C#将多个图像存储在一个文件中

时间:2012-09-12 12:15:46

标签: c# image save

我正在处理地图保存文件。本质上,这个地图保存将包含诸如实体的位置之类的信息,以及这个世界中每个块的图像(在游戏过程中发生变化)。我可以将这一切保存在多个文件中,但是为了简单起见,我宁愿将其保存为一个文件(对于用户来说很简单......)而且,因为我不希望地图可编辑(不仅仅是双至少点击图像文件。)

基本上,它归结为写入文件,目前我已经全部工作了,我写了2个字节来表示沿着世界的x和y轴的块数,然后经过并存储一个字节对于每个块的每个像素的alpha,red,green和blue。

每个块是512乘512的图像。当我保存一个世界(仅包含块和世界大小(2个字节)。文件大小是预期的。块数* 512 * 512 * 4(ARGB)+ 2(世界大小)字节。

但是,查看我刚用Bitmap.Save()进行测试导出的每个块的图像的文件大小,每个图像文件的大小都是10 - 20 KB。基本上,少了很多。

所以我需要以某种方式将多个图像存储在一个文件中,占用更多的空间。

要么以某种方式获取Bitmap.Save()通常会导出的内容,并将其添加到文件中,或者手动存储图像的节省空间的方式,而不是像素的4个字节。

有谁知道这两种方法?或者有效存储多个图像的另一个想法是什么?

1 个答案:

答案 0 :(得分:7)

如何使用BinaryFormatter

因此,设计一个类来表示您要存储的模型数据:

[Serializable]
public class MyModel
{
    public byte[][] Images { get; set; }
}

然后假设你有这个类的实例:

var model = new MyModel
{
    Images = new[]
    {
        File.ReadAllBytes(@"d:\work\image1.png"),
        File.ReadAllBytes(@"d:\work\image2.png"),
        File.ReadAllBytes(@"d:\work\image3.png"),
    }
};

您可以将其序列化为文件:

var formatter = new BinaryFormatter();
using (var output = File.Create("images.dat"))
{
    formatter.Serialize(output, model);
}

当然,如果您有一个Bitmap实例,只需将其转换为相应的字节数组,以便将其填充到模型中。

然后当你想要读回数据时:

using (var input = File.OpenRead("images.dat"))
{
    var model = (MyModel)formatter.Deserialize(input);
}

您的模型当然可以像您希望的那样复杂。您可以通过设计另一个模型将元数据与这些图像相关联,例如名称,类型等。