我的iPhone应用程序项目中有一些png文件。当我为模拟器构建时,它们工作正常。但是,当我为设备构建时,突然每个png文件都会产生可怕的“同时读取这样一个例如pngcrush抓到了libpng错误:......找不到文件:...”
正如我所说,一切都在模拟器上构建并运行良好。只有当我更改为设备构建的方案时,我才会收到错误。
我尝试过清洁和重建。
我尝试手动删除Products目录。
我尝试重新启动系统。
我尝试在不同的项目中使用这些文件(结果相同)。
我发现唯一可行的方法是打开文件并重新保存。然而,这是一个不太理想的解决方案,因为我有数百个PNG文件都遇到了这个问题。我想知道问题是什么,以便我可以直接修复它。
有什么想法吗?
答案 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];
}