iOS UIImageJPEGRepresentation 错误:不是 JPEG 文件:以 0xff 0xd9 开头

11

我正在将一个 .jpg 文件写入我的应用程序的文档目录,就像这样:

NSData *img = UIImageJPEGRepresentation(myUIImage, 1.0);
BOOL retValue = [img writeToFile:myFilePath atomically:YES];

后来,我使用以下方式将图像重新加载到UIImage中:

UIImage *myImage = [UIImage imageWithContentsOfFile:path];

我知道它能正常工作,因为我可以在表格单元格中绘制图像并且一切都很好。现在,如果我尝试使用UIImageJPEGRepresentation(myImage, 1.0),调试器会打印出这些行:

<Error>: Not a JPEG file: starts with 0xff 0xd9
<Error>: Application transferred too few scanlines

该函数返回nil。是否有人知道为什么会这样?在加载完UIImage数据后,我没有对其进行任何操作。我只是将UIImage提供给了单元格中的图像视图。我设置了图像视图属性,以便所有单元格中的图像排成一行并且大小相同,但我认为这与将UIImage转换为NSData无关。


只是出于兴趣:您是否尝试过在这两个调用中将压缩值设置为除了 1.0 之外的其他值(比如 0.5)? - lxt
图片已损坏。JPEG 图片应该以 0xFF 0xD9 结尾。你是如何构建 myImage 的? - Dylan Copeland
我还没有尝试过除1.0以外的压缩值。 - viperacr99
我正在使用相机拍照或从相机胶卷中选择一张照片(使用标准图像选择器),然后将其调整大小为缩略图。该图像是由UIImage的imageWithContentsOfFile选择器构建的,给它提供缩略图的路径。我不明白如何将文件读入UIImage中,并成功显示它,但是当将该图像传递给UIImageJPEGRepresentation()时,它就会损坏。除了从用户打开表视图到按下保存按钮的时间内保持对该UIImage的控制之外,我没有对该UIImage进行任何其他操作。 - viperacr99
1
最近我在通过 NSURLConnection 加载图片时遇到了同样的错误信息。你可能会认为这些图片已经损坏,但实际上它们以 0xFFD8 开头,以 0xFFD9 结尾(并且在浏览器中正常显示),就像 JPEG 文件应该有的那样... 所以至少可以说这个错误信息是不正确的。 - Pieter Witvoet
显示剩余2条评论
1个回答

21
图片没有损坏,我能够正确地显示它们。问题可能是UIImage中的一个bug,或者文档应该更清楚地说明如何使用imageWithContentsOfFile:。
通过更改,我能够消除错误信息。
UIImage *myImage = [UIImage imageWithContentsOfFile:path];

为了

NSData *img = [NSData dataWithContentsOfFile:path];
UIImage *photo = [UIImage imageWithData:img];

1
感谢您确认了我的猜测,这可能与数据和文件之间的区别有关。 - SuperGuyAbe

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接