libzip 在 iPhone 设备上压缩时会损坏 PNG 文件,但在模拟器中不会损坏

StackOverflow https://stackoverflow.com/questions/1866885

  •  18-09-2019
  •  | 
  •  

我继承了一个项目,该项目在某个时候创建​​一个 zip 文件,将一个 XML 文件添加到该 zip 文件中,然后将多个 PNG 文件添加到同一个存档中。在模拟器上一切正常,但每当我在设备本身上运行相同的代码时,生成的 png 文件在我的 Mac 上打开时就会被更改且无法打开。

它们看起来仍然是 png 文件,但“损坏”的导出文件比真实文件稍大,并且十六进制转储显示内容有很大不同。虽然标题被保留...

原来的:

00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 0d 49 48 44 52  |.PNG........IHDR|
00000010  00 00 00 6d 00 00 00 75  08 06 00 00 00 44 7d 6f  |...m...u.....D}o|
00000020  a0 00 00 00 19 74 45 58  74 53 6f 66 74 77 61 72  |?....tEXtSoftwar|
00000030  65 00 41 64 6f 62 65 20  49 6d 61 67 65 52 65 61  |e.Adobe ImageRea|
00000040  64 79 71 c9 65 3c 00 00  38 32 49 44 41 54 78 da  |dyq?e<..82IDATx?|

腐败:

00000000  89 50 4e 47 0d 0a 1a 0a  00 00 00 04 43 67 42 49  |.PNG........CgBI|
00000010  30 00 20 02 10 f3 44 7c  00 00 00 0d 49 48 44 52  |0. ..?D|....IHDR|
00000020  00 00 00 6d 00 00 00 75  08 06 00 00 00 44 7d 6f  |...m...u.....D}o|
00000030  a0 00 00 00 19 74 45 58  74 53 6f 66 74 77 61 72  |?....tEXtSoftwar|
00000040  65 00 41 64 6f 62 65 20  49 6d 61 67 65 52 65 61  |e.Adobe ImageRea|
00000050  64 79 71 c9 65 3c 00 00  38 65 49 44 41 54 ed bd  |dyq?e<..8eIDAT??|

(我意识到文件头的一小块并不是很有帮助,但目的是表明损坏发生在 PNG 中,而不是 ZIP 本身。)

所以我想我想问的是是否有人以前经历过类似的事情?我刚刚尝试使用以下包装器 http://www.flyblog.info/catprogramming/202.html 并遇到了同样的问题,所以猜测它的 libzip 本身导致了这个问题?

有没有人有一个简单的、经过尝试和测试的方法来将文件添加到 iPod 上的 zip 文件中,我可以尝试并交换?

如果有帮助,这里是创建 zip 的代码:

ZipArchive* zip = [[ZipArchive alloc] init];

BOOL ret = [zip CreateZipFile2: zipPath];
NSMutableSet *imageNames = [NSMutableSet set];
[curAlbum collectImageNames:imageNames];

for (NSString *imageName in imageNames) {
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:imageName ofType:@""];
    NSLog(imagePath);
    ret = [zip addFileToZip:imagePath newname:@"test.png"];
}



[zip release];

任何建议表示赞赏:-)

有帮助吗?

解决方案

除了Noah的回答之外,Xcode还压缩PNG文件:

Xcode Build Settings

可能值得设置 COMPRESS_PNG_FILES = NO 在目标信息窗口中。

其他提示

当 Xcode 为设备构建应用程序时,它会更改任何 PNG 资源,将它们转换为 BGRA(而不是通常的 RGBA)并预乘 Alpha 通道。没有办法使用我所知道的任何项目设置来阻止这种情况;您可以尝试为应用程序中包含的资源提供除“.png”之外的扩展名,以查看 Xcode 是否会在不进行任何更改的情况下复制它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top