1

カメラ ピッカーからの画像の読み込みに関する優れた 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 に渡されるまで速度が低下することはありません。これは正しいです?

画像のデコードは既にシステムによって非同期に行われていると思いますが、ロード中に電話の速度が大幅に低下します。

優先度が非常に低いバックグラウンド キューで画像を表示するために必要な作業の一部を実行する方法はありますか?

4

3 に答える 3

5

あなたは物事を最も複雑な方法でやろうとしています:) View Controllerをプッシュする前に小さな画像を準備してそれらに渡すのはなぜですか? このコードを見てください:

- (void)imagePickerController:(UIImagePickerController *)picker
        didFinishPickingMediaWithInfo:(NSDictionary *)info 
{

    UIImage *fullImage = [info objectForKey:UIImagePickerControllerOriginalImage];
    UIImage *smallImage = [fullImage imageScaledToSize:self.view.bounds];

    // Push a view controller and give it BOTH images
}

// And in your pushed view controller

- (void)viewDidLoad
{
    _imageView.image = self.smallImage;
}

- (void)viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];

    _imageView.image = self.fullImage;
}

主なことはviewDidAppear:、アニメーションが完了した直後に呼び出されるため、ここで画像を心配なく切り替えることができます.

于 2012-10-06T11:23:57.713 に答える
3

アンドレイの答えに加えて、を使用する代わりに、をimageScaledToSize使用しますCGImageSourceCreateThumbnailAtIndex。実際、フォト アルバムで使用されている画像には既にサムネイルが含まれている可能性が非常に高いです (私はそのように確信しています)。したがって、画像自体を気にする代わりに、既存のサムネイルを取得して表示し、Andrey のコードを使用してメイン画像に切り替えます。こうすることで、アニメーション期間中の作業を最小限に抑えることができます。

呼び出すCGImageSourceCreateThumbnailAtIndexと、サムネイル画像が既に存在するか生成する必要があるかに関係なく、サムネイル画像が返されます。したがって、使用するのは非常に安全で、おそらく少なくともimageScaledToSize.

これを使用するための完全なコード サンプルは Apple ドキュメントで見つけることができます。ここで複製する必要はありません。

于 2012-10-10T07:25:20.800 に答える
1

フル解像度で画像をロードする代わりに、ALAssetsLibraryを使用してその画像のサムネイルをロードしようとしましたか?サイズを変更するよりも高速です。

于 2012-10-12T11:58:20.853 に答える