孢子允许通过导出.png
文件共享玩家创建的生物。那.png
是生物的照片,但是如果将其导入到游戏中,则生物的信息(例如纹理,大小和形状)也会随之出现。
如何实现这种功能?
孢子允许通过导出.png
文件共享玩家创建的生物。那.png
是生物的照片,但是如果将其导入到游戏中,则生物的信息(例如纹理,大小和形状)也会随之出现。
如何实现这种功能?
Answers:
如果您真正需要的只是PNG文件,那么他们很可能只是将信息添加到文件中。这实际上是隐写术的一种做法。很多时候,这用于隐藏有效载荷或秘密消息,这些东西似乎是面向公众的。但是,在这种情况下,很可能使用了这种方法。典型的文字描写法不会隐藏内容,但是没有理由不能简单地将数据追加到文件末尾的图像中并进行检索。
有几种工具可以为您编码这些数据,谷歌搜索至少会显示this和this。
PNG $89
在开始时具有字节签名,因此有可能将信息插入到PNG结构本身之后,并通过SPORE游戏简单地进行了解析。
但是,其他答案和在Google上进行的搜索给出的进一步研究表明,Spore实际上仅使用了一种文字术来将信息隐藏在alpha位中。考虑到这一点,我们可以排除附加数据或元数据的可能性。
应该注意的是,如果要在本地解析元数据,那么元数据仍然是一个非常可行的选择。如果该信息可能在网络上共享或重新编码,则不能保证导出会保留您的所有信息。使用像素数据时,它可以毫无损失地幸免于难。
该PNG格式有更多或更少的任意元数据支持。的PNG标准定义了一个PNG文件,本质上是一系列的块,其中的一些是必需的(和包含的图像数据)的。但是,其他是可选的。例如,有一个块用于存储伽马信息或直方图数据。
特别是,有一个tEXt
块可用于存储任意键/值文本对。只要您可以将数据表示为文本(很有可能),就可以使用它来运送所需的任何种类的任意数据。
您将需要一个PNG库,该库允许您访问和操作这些其他块(例如参考库),或者您需要自己编写一个。然后,只需选择如何将所需数据编码为键/值对即可。我建议以下内容:
为了做出更完整的答案,我还将指出,还有另一种方法(以前由@Vaughn和@Alexis的答案记录):直接在图像像素中编码所需的其他数据,然后将数据分布到整个图像像素中。颜色通道的低位。这种方法不需要使用额外的元数据,这意味着您可以完全实现它而无需依赖它,也不必担心外部程序会错误地处理该元数据。它还具有很高的“酷”因数,并且由于仅使用低阶位,因此图像在人眼看来仍将是正确的。但是,这确实意味着图像大小是可存储数据量的主要控制因素。如果需要更多存储空间,则需要为图像分配更多像素。
正如其他人指出的那样,此过程称为隐写术。
摩纳哥的开发人员实际上就他们和Spore如何做到这一点发表了出色的文章。
他们所做的工作的基本摘要非常简单:
只需相反地执行此操作即可检索您的数据。
该过程背后的基本思想是图像中有很多像素,并且每个颜色通道的最低位没有太大区别。另外,您写入的比特中的大约一半将恰好是映像中已经存在的比特。您得到的基本上是正确的图像,但带有怪异的伪影。他花时间注意到,只有在您真正提高对比度/饱和度并放大后,这些伪像才真正引起注意。不过,他的源图像确实带有很多初始噪声。
从文章:
注意在上一张图片中,噪声中几乎没有可分辨的水平线。这是关卡数据的结尾。这意味着我实际上可以仅使用最低有效位将所有级别的数据拟合为265x120像素的图像。
棘手的补遗:
我可以做的事情,我相信孢子人也一样,实际上是使用像素中100%透明的所有颜色位。由于这些像素是透明的,因此将它们设置为什么颜色都没有关系。
但是,由于我正在使用整个图像,因此无法执行此操作,这意味着我没有透明像素可以使用。
为什么不赞成仅将这种技术存储在元数据中呢?
额外的功劳:为了降低噪声的可见性,您可以使用带有固定种子的PRNG选择要修改的像素。您也只能以类似方式修改某些颜色通道。
我下载并检查了一些来自孢子虫的孢子生物。从那些我了解到:
值得注意的是,这正是Spore所做的,它是一种将简单性放在大多数其他问题之前的方法。
选择使用速记技术而不是使用其他数据块意味着如果重新编码图像(例如通过网站),则数据将保留下来,尽管它在缩放或Jpeg压缩后将无法幸存。
我认为最突出的选择实际上是只对图像中的一个id编码,然后将实际数据存储在中央服务器上,在此该ID可以交换为确切的生物数据。这样的id足够短,以致可以以缩放和压缩容忍的速记格式进行编码。
对孢子格式可能的简单改进包括: