[英]How to “include” a .PNG image in a binary file?
我正在做一些資源管理代碼,其中我將一堆不同的資源(圖像位置等)與實際圖像一起制作出一個單獨的二進制文件。 現在,我如何將.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文件合並到這個二進制文件中。
您將需要使用如此類型的前綴(int)后跟長度指示符(int),后跟您的Payload(可變長度),或者如果您知道這將是文件中的最后一項,那么您可以跳過前綴/大小並只讀到直到結束。
然后,當您保存各個部分時,您可以編寫前綴,然后編寫長度,然后編寫數據。
理想情況下,你可以使用像protobuf這樣的一些序列化器為你做很多序列化,然后你可以加載你的課程。 我在插件安裝程序的一個項目中執行此操作。 最終的文件是Zip,但生成文件“文件名,描述,實際文件位置等”的結構存儲在自定義文件中,就像您所描述的那樣。
如果您在內存中執行此操作,那么您可以將PNG圖像序列化為MemoryStream(獲取大小),然后將Size寫入FileStream(file.tmp),然后寫入MemorySteam Buffer
using (MemoryStream ms = new MemoryStream())
{
bitmap.Save(ms);
writer.Write(ms.Length);
ms.Position = 0;
ms.CopyTo(writer.BaseStream);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.