【问题标题】:Why is image data in plist dictionary?为什么图像数据在 plist 字典中?
【发布时间】:2010-01-16 00:15:38
【问题描述】:

我继承了一个 OpenGL iPhone 应用程序代码,其中包含一些大的 PNG 文件(例如,sunshine.png,10,000 像素 x 80 像素)和每个 png 对应的 PLIST 文件(例如,ImageData/sunshine.plist)。

问题是,当我替换 PNG 文件时,应用程序并没有拾取它们,显然是因为它并没有真正读取 PNG,只是相应的 PLIST 图像数据文件。这些 plist 文件是使用 OpenGL 库进行纹理映射的。我的怀疑是 PLIST 包含要渲染的每个图块的一些二进制编码,并且原始图像已被分割成图块并以某种方式存储在 .plist 文件中。问题是,我不知道如何重新生成新的 PLIST 文件!

我尝试将 PLIST 文件设为 0 字节,或者通过 NSData 使用 UTF8Encoding 对其进行解密,但只收到垃圾。已确认未使用 PVRTC 编码。任何关于这些 PLIST 文件格式的含义或来源的想法将不胜感激!我无法更新这个应用程序,因为它的主要功能是显示大的、可滚动的图像。

sunshine.plist 文件格式如下:(数据缩短)

<dict>
<key>0</key>
<data>
12LXYpValWKVYtdilWLXYpVi12KVWpVi12KVWpVi12LXYtdilVqVYpVi12KVYtdilWLX YpValWLXYpValWLXYtdi12KVWpVilWLXYpVi12KVYtdilVqVYtdilVqVYtdi12LXYpVa... </data>
<key>1</key>
<data>...</data>
</dict>

在 Xcode plist 编辑器中,以下是其中一个字典值的外观:(数据已缩短)

&lt;d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 d762d762 955a9562 9562d762 9562d762 9562d762 955a9562 d762955a 9562d762 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 73ce31c6 31c673ce 73ce31c6 31c631c6 31c631c6 73ce31c6 31c673ce 31c631c6 e5f6e7fe e5f6e5f6 a5f6e5fe e5fee7fe e7fee5f6 e5fee7fe e5f6e7fe ...&gt;

感谢 StackOverflow 社区!

【问题讨论】:

    标签: iphone opengl-es plist


    【解决方案1】:

    听起来原来的程序员使用了类似...

    UIImage *anImage;
    ...
    NSData *imgData=UIImagePNGRepresentation(anImage);
    

    ... 然后他们将imgData 存储在 NSDictionary 中并将其写入文件。

    要反转它,您需要加载字典,然后提取各个数据对象。然后你可以使用这样的数据创建图像:

    NSDictionary *imgDict=[NSDictionary dictionaryWithContentsOfFile:plistFilePath];
    NSData *imgData=[imgDict valueForKey:@"keyForImage"];
    UIImage *newImg=[UIImage imageWithData:imgData];
    

    UIImage可以从数据中解出文件格式。图像的键是 plist &lt;key&gt;1&lt;/key&gt; 中的值。键是 NSStrings。

    拥有 UIImage 后,您可以将其转换为其他格式。


    编辑01:

    您可能会有所帮助:Archives and Serialization Programming for Cocoa

    【讨论】:

    • 试过了,没用。 newImg 为 nil,表示 imgData 未成功处理。澄清一下,对于 1 个 PNG 文件,字典有大约 100 多个键值对。
    • 好吧,那我不知道他们做了什么。我从来没有见过。什么代码读取原始中的 plist?如果您发布它,它可能会为正在发生的事情提供线索。
    • 只是一点,plist的存在意味着某处有一个符合NSCoding协议的对象。该对象可以读取和解压 plist。
    【解决方案2】:

    会不会是之前的程序员跳过了UIImage阶段,只使用NSData来存储纹理,没有进一步编码?因为当我查看您在此处编写的字典流时,它看起来像是某种原始图像格式。它似乎每个像素使用 16 位(或者可能是 32 位?!),但颜色格式和宽度和高度可能会被硬编码(或者希望在字典中)。

    【讨论】:

      猜你喜欢
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 2023-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多