1

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

所以本质上,它归结为写入一个文件,目前我已经全部工作了,我正在写入 2 个字节来指示沿世界的 x 和 y 轴的块数,然后通过并存储一个字节用于 alpha,每个块的每个像素的红色、绿色和蓝色。

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

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

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

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

有谁知道其中任何一个的方法?或者有效存储多个图像的另一个想法?

4

1 回答 1

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);
}

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

于 2012-09-12T12:23:22.800 回答