iPhone/iPad 的 IPA 包中的 PNG 文件在编译时默认会做特殊处理(应该是以便硬件加速解码?),有时候需要“参考”下第三方的 PNG 图片的时候带来了巨大的麻烦:一直流传着各种方法和工具,分别是 Windows 下的 FixPng、Mac下的iPhone PNG Fix、Python脚本修复、PNG Nomalizer(http://www.beyondcow.com/pngnormalizer/),在线修复(http://www.raisedtech.com/iphone-ipa-png/)等等这种各样。实际用下来基本上对于现在的 IPA 文件中的 PNG 多半有很多图片无法还原。
解铃还须系铃人,为了真正解决这个问题,我们还是从 iOS 设备上入手吧:
1.先拿到 IPA 解出所有的 PNG;
2.编译到我们的程序 iOS App 中;
3.在程序中枚举所有的 PNG,装载,重新保存为 PNG——此时生成的 PNG 就是通用格式的 PNG 啦,真正解决了问题:
} //
void UIUtil::NormalizePngFolder(NSString dst, NSString src)
{
NSArray files = [[NSFileManager defaultManager] subpathsAtPath:src];
for (NSString file in files)
{
if ([file.lowercaseString hasSuffix:@".png"])
{
NormalizePngFile([dst stringByAppendingPathComponent:file], [src stringByAppendingPathComponent:file]);
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
//
BOOL UIUtil::NormalizePngFile(NSString dst, NSString src)
{
NSString *dir = dst.stringByDeletingLastPathComponent;
if ([[NSFileManager defaultManager] fileExistsAtPath:dir] == NO)
{
[[NSFileManager defaultManager] createDirectoryAtPath:dir withIntermediateDirectories:YES attributes:nil error:nil];
}
<span class="n">UIImage</span> <span class="o">*</span><span class="n">image</span> <span class="o">=</span> <span class="p">[</span><span class="n">UIImage</span> <span class="nf">imageWithContentsOfFile</span><span class="p">:</span><span class="n">src</span><span class="p">];</span>
<span class="k">if</span> <span class="p">(</span><span class="n">image</span> <span class="o">==</span> <span class="nb">nil</span><span class="p">)</span> <span class="k">return</span> <span class="nb">NO</span><span class="p">;</span>
<span class="n">NSData</span> <span class="o">*</span><span class="n">data</span> <span class="o">=</span> <span class="n">UIImagePNGRepresentation</span><span class="p">(</span><span class="n">image</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="n">data</span> <span class="o">==</span> <span class="nb">nil</span><span class="p">)</span> <span class="k">return</span> <span class="nb">NO</span><span class="p">;</span>
<span class="k">return</span> <span class="p">[</span><span class="n">data</span> <span class="nf">writeToFile</span><span class="p">:</span><span class="n">dst</span> <span class="nf">atomically</span><span class="p">:</span><span class="nb">NO</span><span class="p">];</span>
4.拷贝出这些 PNG 来即可。
上面仅仅时代码片段,可以完善一下,可以写个小程序,输入 IPA 的地址直接把图片还原出来。