使用 QImage::setText() 将二进制数据存储在 PNG 文件中

Posted

技术标签:

【中文标题】使用 QImage::setText() 将二进制数据存储在 PNG 文件中【英文标题】:Storing binary data in a PNG file using QImage::setText() 【发布时间】:2014-04-07 19:44:49 【问题描述】:

我需要在 PNG 图像的元数据中读取/存储二进制数据。具体来说,就是经过谷歌protobuf库序列化的gzip压缩数据。

我正在使用 Qt5 的 QImage 库来加载和存储图像,所以如果我能找到一种方法来使用一些 Qt 库将此二进制数据添加到 QImage I'我已经在使用了。

我看到QImage 类有一个setText method,它似乎完全符合我的要求,除了一个警告:它需要QString 作为参数而不是QByteArray,而@987654330 @构造函数破坏了我的二进制数据。

如何强制QString 在存储和加载时保留我的二进制数据?如果这不可能,Qt5 中是否有其他方法可以将元数据添加到 PNG 图像?

【问题讨论】:

元数据中的压缩数据?对不起,我没有遵循...也许,您可以从用例开始?另外,从 QBA 获取内容的 from* 转换方法到底有什么问题? 用例是缓存一个昂贵的计算,这对于程序使用图像至关重要。我不想将它放在单独的缓存文件中,因为这些图像会定期编辑/移动/复制,并且将数据存储在图像本身可以简化确定缓存数据是否存在以及是否有效的任务。 数据究竟是如何被破坏的?如果有终结符(字符 '\0'),那么构造应该停止在那里(请参阅此处的“从 QByteArray 转换为 QString”:doc.qt.digia.com/qq/qq05-achtung.html#qstringisaunicodestring)。是那个还是别的什么,你能告诉我吗? @Elliott:目前,我仍在努力理解您的用例。缓存什么? @Pukku QString 中的一半字符被通用问号字符替换。如果我使用QString::fromUtf8,则空字符不是问题,但最终会用问号替换几乎所有字符 【参考方案1】:

您可以在转换为 QString 之前尝试encode the data as Base64,然后在回读时尝试decode。我知道这会大大降低 gzip 压缩的好处,但至少您可以尝试看看这是否有帮助。

【讨论】:

这可行,尽管它远非理想。由于没有其他选择,我可能会这样做。 后续:Qt 将 text() 数据存储在“zTXt”元数据字段中,该字段会压缩其数据。所以,它是 base64 的事实并不重要,我的 gzip 事先也不重要!所以,我只是直接将它转换为base64而不压缩它,结果base64被png算法本身压缩,否定了base64的空间问题。我学到了一些东西!

以上是关于使用 QImage::setText() 将二进制数据存储在 PNG 文件中的主要内容,如果未能解决你的问题,请参考以下文章

如何使用二进制运算将整数除以 3

使用javascript将二进制转换为文本

使用 PHP 将二进制流写入浏览器

使用 .NET 将二进制数据(例如二进制文件)导出为字符串?

使用前导零将十六进制转换为二进制

使用 python 将二进制数据写入 zip 文件