簡體   English   中英

如何在二進制文件中“包含”.PNG圖像?

[英]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);
}

Paul Farry的答案基本上就是你需要做的。 閱讀二進制格式,如PNG格式 (參見文件頭,塊), ZIP格式 (文件頭,數據描述符),它們實現了一些東西 - 在比你需要的更精細的層面上 - 存儲不同塊的機制數據在一個文件中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM