【问题标题】:How to "include" a .PNG image in a binary file?如何在二进制文件中“包含”.PNG 图像?
【发布时间】:2013-05-31 04:42:26
【问题描述】:

我正在编写一些资源管理代码,其中我获取了一堆不同的资源(图像位置等)以及实际图像,并从中制作了一个二进制文件。现在,我如何实际将 .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 文件合并到这个二进制文件中。

【问题讨论】:

  • 我不确定我是否理解这个问题 - 您是在询问将文件添加到存档(类似于 zip、7z、rar、tar 等)还是询问如何创建图像其中部分来自不同的输入源(例如,使用 Graphics.DrawImage)。如果是后者,您使用的是哪个 UI 框架(如果有)?
  • 更像前者。我有自己的二进制文件格式,我在其中转储图像和有关其使用情况的信息。我将用一个例子更新原始问题。 :)

标签: c# .net binary png


【解决方案1】:

您将需要使用这种前缀 (int) 后跟长度指示符 (int) 后跟有效负载(可变长度),或者如果您知道这将是文件中的最后一件事,那么您可以跳过前缀/大小,然后一直读取到流结束。

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

理想情况下,您可以使用诸如 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);
}

【讨论】:

  • 谢谢,基本上 bitmap.Save() 就是我要找的东西。 :) 如果最后有东西,那么阅读呢,你能详细说明一下吗?
  • 如果你有额外的结构需要,你需要前缀(类型)长度数据方法,这样你就知道你正在解码的东西有多少可以读取。然后,您只需将 size 中定义的数量读入您的结构中
  • +1 用于“zip + zip 中的自定义文件以获取其他元数据”方法。最近有许多“归档格式”可以做到这一点,包括 Java 世界中的the jar/war/ear/etc formatsOpen Packaging Conventions has a similar situation in supporting many different file formats 也是如此。
【解决方案2】:

基本上,Paul Farry 的回答是您需要做的。阅读像PNG format(见文件头,块),ZIP format(文件头,数据描述符)这样的二进制格式,它们实现了一些东西——比你需要的更复杂——存储不同的机制一个文件中的数据块。

【讨论】:

    猜你喜欢
    • 2020-08-12
    • 2013-04-03
    • 2017-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多