カメラ ピッカーからの画像の読み込みに関する優れた wiki があります。これにより、フル解像度で画像を撮影するコストに気づきました。
現時点では、写真が選択されると、新しいビュー コントローラーをプッシュして画像をフル解像度で表示します。ビューをプッシュすると、非常に遅く途切れ途切れになる (約 1 fps です!) ので、滑らかにしたいと思います。Instagram で写真を選ぶのと比較すると、低解像度の画像を使用し、後で完全な画像に差し替えていることに気付きました。(ユーザーはズームとパンができるはずなので、フル解像度の画像が必要です)
私が欲しいアイデアは次のようなものです:
- (void)imagePickerController:(UIImagePickerController *)picker
didFinishPickingMediaWithInfo:(NSDictionary *)info
{
UIImage* fullImage = [info objectForKey:UIImagePickerControllerOriginalImage];
// Push a view controller and give it the image.....
}
- (void) viewDidLoad {
CGSize smallerImageSize = _imageView.bounds;
UIImage* smallerImage = [MyHelper quickAndDirtyImageResize:_fullImage
toSize:smallerImageSize];
// Set the low res image for now... then later swap in the high res
_imageView.image = smallerImage;
// Swap in high res image async
// This is the part im unsure about... Im sure UIKit isn't thread-safe!
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_LOW, NULL), ^{
_imageView.image = _fullImage;
});
}
UIImage は、使用されるまでメモリマップされていないと思います。したがって、imageView に渡されるまで速度が低下することはありません。これは正しいです?
画像のデコードは既にシステムによって非同期に行われていると思いますが、ロード中に電話の速度が大幅に低下します。
優先度が非常に低いバックグラウンド キューで画像を表示するために必要な作業の一部を実行する方法はありますか?