Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/image/5.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#_Image_Save - Fatal编程技术网

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

C#在一个文件中存储多个图像,c#,image,save,C#,Image,Save,我正在处理地图保存文件。本质上,这个地图保存将包含实体的位置等信息,以及这个世界上每个区块的图像(在游戏过程中会发生变化)。我可以将这些都保存在多个文件中,但是为了简单起见,我宁愿将其保存为一个文件(对于用户来说很简单…),而且,因为我不希望地图是可编辑的(不仅仅是双击一个图像文件) 所以本质上,它可以归结为写入一个文件,目前我已经完成了所有的工作,我正在写入2个字节来表示世界x轴和y轴上的块数,然后遍历并存储每个块的每个像素的alpha、红色、绿色和蓝色的字节 每个区块是一个512 x 512

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

所以本质上,它可以归结为写入一个文件,目前我已经完成了所有的工作,我正在写入2个字节来表示世界x轴和y轴上的块数,然后遍历并存储每个块的每个像素的alpha、红色、绿色和蓝色的字节

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

但是,看看我刚刚用Bitmap.Save()测试导出的每个块的图像文件大小,这些图像文件的大小都是10-20KB,基本上要小得多

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

或者,以某种方式获取Bitmap.Save()通常会导出的内容,并将其添加到文件中,或者使用比每像素4字节更节省空间的方式手动存储图像

有人知道其中一种方法吗?或者另一种有效存储多个图像的方法吗?

使用

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

[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);
}
当然,如果您有一个位图实例,那么只需将其转换为相应的字节数组,以便将其填充到模型中即可

然后,当您稍后要读回数据时:

using (var input = File.OpenRead("images.dat"))
{
    var model = (MyModel)formatter.Deserialize(input);
}
您的模型当然可以像您希望的那样复杂。您可以通过设计另一个模型,将元数据与这些图像关联起来,例如它们的名称、类型等。

如何使用

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

[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);
}
当然,如果您有一个位图实例,那么只需将其转换为相应的字节数组,以便将其填充到模型中即可

然后,当您稍后要读回数据时:

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

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

如果您有地图,我猜它是用于一个游戏的。即使没有,一个重要因素是每个图像是否可以出现多次。如果是这样,我将拆分保存file分为两部分。一部分包含所有图像(使用类似png的内容),第二个是参考第一部分图像的实际布局。同样,对于大小问题,您可以使用压缩算法,如zip。如果在保存和加载时将这些字节压缩一段时间,会怎么样?Darin的回答非常有效。感谢Hans和dowhilefor的想法。在这种情况下,没有任何一项重复通过很遗憾,这种方法是行不通的。如果你有一张地图,我猜它是用于一个游戏的。即使没有,一个重要的因素是每个图像是否可以出现多次。如果是这样,我会将保存文件分为两部分。一部分包含所有图像(使用类似png的东西),第二个是参考第一部分图像的实际布局。同样,对于大小问题,您可以使用压缩算法,如zip。如果在保存和加载时将这些字节压缩一段时间,会怎么样?Darin的回答非常有效。感谢Hans和dowhilefor的想法。在这种情况下,没有任何一项重复通过非常感谢!是的,我以前没有处理过用C#保存的问题,所以直到现在我才听说过二进制格式化程序。再次感谢:)非常感谢!是的,我以前没有处理过C#中的保存问题,所以直到现在我才听说过二进制格式化程序。再次感谢:)