我正在做一些资源管理代码,其中我将一堆不同的资源(图像位置等)与实际图像一起使用,并从中制作单个二进制文件。现在,我如何将.PNG文件实际包含在二进制文件中,如何再次将其读回?我想保留.PNG压缩。
我使用BinaryWriter将数据写入文件,并使用BinaryReader将其读回。这是我正在使用的格式的一个例子:
BinaryWriter writer = new BinaryWriter(new FileStream("file.tmp"));
writer.Write(name);
writer.Write(positionX);
writer.Write(positionY);
// Here should be the binary data of the PNG image
writer.Close();
BinaryReader reader = new BinaryReader(new FileStream("file.tmp"));
string name = reader.ReadString();
float posX = reader.ReadSingle();
float posY = reader.ReadSingle();
Bitmap bitmap = ... // Here I'd like to get the PNG data
reader.Close();
在PNG数据之前和之后,还有一些其他数据。基本上我会将多个PNG文件合并到这个二进制文件中。
答案 0 :(得分:2)
您将需要使用如此类型的前缀(int)后跟长度指示符(int),后跟您的Payload(可变长度),或者如果您知道这将是您文件中的最后一项,那么您可以跳过前缀/大小,只读到流结束。
然后当您保存各个部分时,您可以编写前缀,然后编写长度,然后编写数据。
理想情况下,你可以使用像protobuf这样的一些序列化器为你做很多序列化,然后你就可以加载你的课程了。我在插件安装程序的一个项目中执行此操作。最终的文件是Zip,但生成文件“文件名,描述,实际文件位置等”的结构存储在自定义文件中,就像您所描述的那样。
如果您在内存中执行此操作,那么您可以将PNG图像序列化为MemoryStream(获取大小),然后将大小写入FileStream(file.tmp),然后将MemorySteam缓冲区
写入using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms);
writer.Write(ms.Length);
ms.Position = 0;
ms.CopyTo(writer.BaseStream);
}
答案 1 :(得分:0)
Paul Farry的答案基本上就是你需要做的。阅读二进制格式,例如PNG format(参见文件头,块),ZIP format(文件头,数据描述符),它们实现了一些东西 - 在比你需要的更精细的层面上 - 将不同数据块存储在一个文件中的机制。