如何加快通过UIImagePNGRepresentation()从相机保存UIImagePickerController图像到文件系统?

我正在制作一个让用户拍照并在缩略图和照片查看器中显示它们的应用程序。 我有NSManagedObject类称为照片和照片有一个方法,需要UIImage并使用UIImagePNGRepresentation()将其转换为PNG,并将其保存到文件系统。 在此操作之后,将图像调整为缩略图大小并保存。

这里的问题是UIImagePNGRepresentation()和图像大小的转换似乎是非常慢,我不知道这是否是一个正确的方法来做到这一点。

告诉我,如果有人知道完成我想要做的最好的方法。

先谢谢你。

根据图像分辨率的不同, UIImagePNGRepresentation的确可以很慢,就像写入文件系统一样。

您应该始终在asynchronous队列中执行这些types的操作。 即使性能对于应用程序来说足够好,但是在testing时仍然应该使用asynchronous队列 – 您永远不会知道设备可能执行的其他进程是什么,这可能会在您的应用程序掌握在用户手中后, 。

使用Grand Central Dispatch(GCD),较新版本的iOS可以非常容易地进行asynchronous保存。 步骤是:

  1. 创build一个保存图像的NSBlockOperation
  2. 在块操作的完成块中,从磁盘读取图像并显示它。 唯一需要注意的是,您必须使用主队列来显示图像: 所有UI操作必须在主线程上进行
  3. 将块操作添加到操作队列中并观察它!

而已。 这里是代码:

 // Create a block operation with our saves NSBlockOperation* saveOp = [NSBlockOperation blockOperationWithBlock: ^{ [UIImagePNGRepresentation(image) writeToFile:file atomically:YES]; [UIImagePNGRepresentation(thumbImage) writeToFile:thumbfile atomically:YES]; }]; // Use the completion block to update our UI from the main queue [saveOp setCompletionBlock:^{ [[NSOperationQueue mainQueue] addOperationWithBlock:^{ UIImage *image = [UIImage imageWithContentsOfFile:thumbfile]; // TODO: Assign image to imageview }]; }]; // Kick off the operation, sit back, and relax. Go answer some stackoverflow // questions or something. NSOperationQueue *queue = [[NSOperationQueue alloc] init]; [queue addOperation:saveOp]; 

一旦你对这个代码模式感到满意,你会发现自己使用它很多。 当生成大数据集,加载长操作等等时,这是非常有用的。从本质上来说,任何让你的UI的影响最小的操作是这个代码的一个很好的select。 只要记住,当你不在主队列时,你不能对UI做任何事情,而其他所有事情都是蛋糕。

是的,在iPhone 4上需要时间,图片大小约为6 MB。 解决scheme是使用performSelectorInBackground:withObject:来在后台线程中执行UIImagePNGRepresentation() ,以便您的UI线程不会冻结。

在转换为PNG之前进行大小调整可能会快得多。

尝试使用中等压缩质量的UIImageJPEGRepresentation。 如果瓶颈是IO,那么这可能会更快,因为文件大小一般小于PNG。

使用工具检查UIImagePNGRepresentation是否是缓慢的部分,或者是否将数据写入缓慢的文件系统。