如何“包含”二进制文件中的png图像

本文关键字:png 图像 二进制文件 包含 如何 | 更新日期: 2023-09-27 18:16:06

我正在做一些资源管理代码,在那里我把一堆不同的资源(图像位置等)与实际的图像一起,并使一个二进制文件出来。那么,如何将。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文件合并到一个二进制文件中

如何“包含”二进制文件中的png图像

你将需要使用so sort of Prefix (int)后跟一个Length Indicator (int)后跟你的Payload(可变长度),或者如果你知道这将是你文件中的最后一件事,那么你可以跳过前缀/size,只读到流结束。

然后当你保存你的各个部分,你写你的前缀,然后你的长度,然后你的数据。

理想情况下,你可以使用一些序列化器,如protobuf为你做很多序列化,然后你可以加载你的类回来。我在我的一个插件安装项目中这样做。最终的文件是一个Zip文件,但是生成文件的结构"文件名、描述、实际文件位置等"存储在一个自定义文件中,就像你所描述的那样。

如果你在内存中做这些,那么你可以序列化你的PNG图像到MemoryStream(获取大小),然后写大小到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格式(文件头,数据描述符),它们实现了一些东西-在比您需要的更复杂的级别上-在一个文件中存储不同数据块的机制。