我正在制作一个应用程序,让用户可以拍照并在缩略图和照片查看器中显示它们。 我有一个名为 photo 的 NSManagedObject 类,photo 有一个方法,它接受 UIImage 并使用 UIImagePNGRepresentation() 将其转换为 PNG 并将其保存到文件系统。 完成此操作后,将图像调整为缩略图大小并保存。
这里的问题是 UIImagePNGRepresentation() 并且图像大小的转换似乎真的很慢,我不知道这是否是正确的方法。
如果有人知道完成我想做的事情的最佳方法,请告诉我。
提前谢谢你。
最佳答案
根据图像分辨率,UIImagePNGRepresentation
确实可能非常慢,写入文件系统也是如此。
您应该始终在异步队列中执行这些类型的操作。即使在测试时性能对于您的应用程序来说似乎足够好,您仍然应该使用异步队列——您永远不知道设备可能正在进行哪些其他进程,一旦您的应用程序可能会减慢保存速度应用程序掌握在用户手中。
较新版本的 iOS 使用 Grand Central Dispatch (GCD) 使异步保存变得非常非常容易。步骤是:
- 创建一个保存图像的
NSBlockOperation
- 在 block 操作的完成 block 中,从磁盘读取图像并显示它。这里唯一需要注意的是,您必须使用主队列来显示图像:所有 UI 操作都必须在主线程上进行。
- 将 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/