pngcrush发现了libping错误,但仅限于为设备构建时

时间:2013-06-12 21:18:13

标签: iphone ios xcode libpng pngcrush

我的iPhone应用程序项目中有一些png文件。当我为模拟器构建时,它们工作正常。但是,当我为设备构建时,突然每个png文件都会产生可怕的“同时读取这样一个例如pngcrush抓到了libpng错误:......找不到文件:...”

正如我所说,一切都在模拟器上构建并运行良好。只有当我更改为设备构建的方案时,我才会收到错误。

我尝试过清洁和重建。

我尝试手动删除Products目录。

我尝试重新启动系统。

我尝试在不同的项目中使用这些文件(结果相同)。

我发现唯一可行的方法是打开文件并重新保存。然而,这是一个不太理想的解决方案,因为我有数百个PNG文件都遇到了这个问题。我想知道问题是什么,以便我可以直接修复它。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

听起来好像你已经使用Apple的流氓“pngcrush”Xcode程序重新压缩了PNG文件,该程序会写入无效PNG文件。在文件开头附近找到字符串“CgBI”(从第12个字节开始),其中应该是“IHDR”。有些应用程序(包括Apple版本的“pngcrush”)可以解决问题。

答案 1 :(得分:0)

通过编写快速且脏的递归文件重新保护程序解决了这个问题。我已经确认只是在我的项目目录中运行此操作可以修复我看到的459错误。这是相关代码,以防它帮助任何人。

- (IBAction) btnGo_Pressed:(id) sender {
    // The path to search is specified by the user
    NSString *path = self.txtPathToSearch.stringValue;

    // Recursively find all files within it
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *subpaths = [fileManager subpathsOfDirectoryAtPath:path error:nil];

    // Look for pngs
    int totalImagesResaved = 0;
    for (int j=0; j<[subpaths count]; j++) {

        NSString *fullPath = [path stringByAppendingPathComponent:[subpaths objectAtIndex:j]];

        // See if this path ends with a ".png"
        if ([fullPath compare:@".png" options:NSCaseInsensitiveSearch range:NSMakeRange([fullPath length] - 4, 4)] == NSOrderedSame) {

            // Got one. Now resave it as a png
            NSImage *image = [[NSImage alloc] initWithContentsOfFile:fullPath];
            [self saveImage:image asPngWithPath:fullPath];
            totalImagesResaved++;
        }
    }

    // Status report
    NSAlert *alert = [NSAlert alertWithMessageText:@"Done" defaultButton:@"OK" alternateButton:nil otherButton:nil informativeTextWithFormat:@"Encountened %li paths. Resaved %i .pngs.", (unsigned long)[subpaths count], totalImagesResaved];
    [alert runModal];
}

- (void) saveImage:(NSImage *) image asPngWithPath:(NSString *) path
{
    // Cache the reduced image
    NSData *imageData = [image TIFFRepresentation];
    NSBitmapImageRep *imageRep = [NSBitmapImageRep imageRepWithData:imageData];
    imageData = [imageRep representationUsingType:NSPNGFileType properties:nil];
    [imageData writeToFile:path atomically:YES];
}