objective-c - 如何通过 UIImagePNGRepresentation() 加速将 UIImagePickerController 图像从相机保存到文件系统?

标签 objective-c ios cocoa-touch cocoa uiimagepickercontroller

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

这里的问题是 UIImagePNGRepresentation() 并且图像大小的转换似乎真的很慢,我不知道这是否是正确的方法。

如果有人知道完成我想做的事情的最佳方法,请告诉我。

提前谢谢你。

最佳答案

根据图像分辨率,UIImagePNGRepresentation 确实可能非常慢,写入文件系统也是如此。

您应该始终在异步队列中执行这些类型的操作。即使在测试时性能对于您的应用程序来说似乎足够好,您仍然应该使用异步队列——您永远不知道设备可能正在进行哪些其他进程,一旦您的应用程序可能会减慢保存速度应用程序掌握在用户手中。

较新版本的 iOS 使用 Grand Central Dispatch (GCD) 使异步保存变得非常非常容易。步骤是:

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

就是这样。这是代码:

// 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 延迟的操作都适合使用此代码。请记住,当您不在主队列中时,您无法对 UI 执行任何操作,其他一切都是小菜一碟。

关于objective-c - 如何通过 UIImagePNGRepresentation() 加速将 UIImagePickerController 图像从相机保存到文件系统?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7651632/

相关文章:

ios - Storyboard中的 Appdelegate 变量

iphone - 如何获取日期和时间 (MM/dd/yyyy hh :MM a) format?

ios - UITableView 在使用动态大小的单元格并将内容偏移量设置为顶部后不会一直滚动到顶部

ios - 读取RSSI是否会导致对BLE设备的任何空中请求?

ios - 当对象最初按其中心旋转时,围绕点旋转对象

objective-c - 关于 iPhone SDK,您希望早点知道什么?

iphone - “试图弹出一个不存在的 View Controller 。”

javascript - 从 UIWebView 中的 javascript 向 ObjectiveC 发送通知

iphone - 自动旋转和 UIImageView 动画的问题

ios - 在不耗尽电池电量的情况下以良好的准确性获取位置更新的最佳方法