C#在一个文件中存储多个图像
我正在处理地图保存文件。本质上,这个地图保存将包含实体的位置等信息,以及这个世界上每个区块的图像(在游戏过程中会发生变化)。我可以将这些都保存在多个文件中,但是为了简单起见,我宁愿将其保存为一个文件(对于用户来说很简单…),而且,因为我不希望地图是可编辑的(不仅仅是双击一个图像文件) 所以本质上,它可以归结为写入一个文件,目前我已经完成了所有的工作,我正在写入2个字节来表示世界x轴和y轴上的块数,然后遍历并存储每个块的每个像素的alpha、红色、绿色和蓝色的字节 每个区块是一个512 x 512的图像。当我保存一个世界时(仅包含区块和世界大小(2字节)。文件大小与预期一致。区块数*512*512*4(ARGB)+2(世界大小)字节 但是,看看我刚刚用Bitmap.Save()测试导出的每个块的图像文件大小,这些图像文件的大小都是10-20KB,基本上要小得多 因此我需要以某种方式将多个图像存储在一个文件中,从而占用更真实的空间。 或者,以某种方式获取Bitmap.Save()通常会导出的内容,并将其添加到文件中,或者使用比每像素4字节更节省空间的方式手动存储图像 有人知道其中一种方法吗?或者另一种有效存储多个图像的方法吗?使用 因此,设计一个类来表示要存储的模型数据:C#在一个文件中存储多个图像,c#,image,save,C#,Image,Save,我正在处理地图保存文件。本质上,这个地图保存将包含实体的位置等信息,以及这个世界上每个区块的图像(在游戏过程中会发生变化)。我可以将这些都保存在多个文件中,但是为了简单起见,我宁愿将其保存为一个文件(对于用户来说很简单…),而且,因为我不希望地图是可编辑的(不仅仅是双击一个图像文件) 所以本质上,它可以归结为写入一个文件,目前我已经完成了所有的工作,我正在写入2个字节来表示世界x轴和y轴上的块数,然后遍历并存储每个块的每个像素的alpha、红色、绿色和蓝色的字节 每个区块是一个512 x 512
[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#中的保存问题,所以直到现在我才听说过二进制格式化程序。再次感谢:)