3

最大 4 枚の写真を組み合わせることができるアプリがあります。ただし、写真 (最大 4 枚) から選択させると、画質を FastFormat に設定しても非常に遅くなることがあります。4 秒かかります (1 枚の写真につき約 1 秒)。最高品質では、4 つの画像に 6 秒かかります。

とにかく、画像をより速く取得することを提案できますか?

これは、画像を処理するブロックです。

func processImages()
    {
        _selectediImages = Array()
        _cacheImageComplete = 0
        for asset in _selectedAssets
        {
            var options:PHImageRequestOptions = PHImageRequestOptions()
            options.synchronous = true
            options.deliveryMode = PHImageRequestOptionsDeliveryMode.FastFormat
            PHImageManager.defaultManager().requestImageForAsset(asset, targetSize:CGSizeMake(CGFloat(asset.pixelWidth), CGFloat(asset.pixelHeight)), contentMode: .AspectFit, options: options)
                {
                    result, info in
                    var minRatio:CGFloat = 1
                    //Reduce file size so take 1/3 the screen w&h
                    if(CGFloat(asset.pixelWidth) > UIScreen.mainScreen().bounds.width/2 || CGFloat(asset.pixelHeight) > UIScreen.mainScreen().bounds.height/2)
                    {
                        minRatio = min((UIScreen.mainScreen().bounds.width/2)/(CGFloat(asset.pixelWidth)), ((UIScreen.mainScreen().bounds.height/2)/CGFloat(asset.pixelHeight)))
                    }
                    var size:CGSize = CGSizeMake((CGFloat(asset.pixelWidth)*minRatio),(CGFloat(asset.pixelHeight)*minRatio))
                    UIGraphicsBeginImageContextWithOptions(size, false, 0.0)
                    result.drawInRect(CGRectMake(0, 0, size.width, size.height))
                    var final = UIGraphicsGetImageFromCurrentImageContext()
                    var image = iImage(uiimage: final)
                    self._selectediImages.append(image)
                    self._cacheImageComplete!++
                    println(self._cacheImageComplete)
                    if(self._cacheImageComplete == self._selectionCount)
                    {
                        self._processingImages = false
                        self.selectionCallback(self._selectediImages)
                    }
            }

        }
    }
4

2 に答える 2

7

自分で画像のサイズを変更しないでください。目的の一部はPHImageManager、あなたのためにそれを行うことです。(また、サムネイル画像をキャッシュして、次回より迅速に取得できるようにし、そのキャッシュをアプリ間で共有して、ライブラリ全体の 6 つの個別の 500 MB サムネイル キャッシュを作成する 6 つのアプリで終わることがないようにします。 )

func processImages() {
    _selectediImages = Array()
    _cacheImageComplete = 0
    for asset in _selectedAssets {
        let options = PHImageRequestOptions()
        options.deliveryMode = .FastFormat

        // request images no bigger than 1/3 the screen width
        let maxDimension = UIScreen.mainScreen().bounds.width / 3 * UIScreen.mainScreen().scale
        let size = CGSize(width: maxDimension, height: maxDimension)

        PHImageManager.defaultManager().requestImageForAsset(asset, targetSize: size, contentMode: .AspectFill, options: options)
            { result, info in
                // probably some of this code is unnecessary, too,
                // but I'm not sure what you're doing here so leaving it alone
                self._selectediImages.append(result)
                self._cacheImageComplete!++
                println(self._cacheImageComplete)
                if self._cacheImageComplete == self._selectionCount {
                    self._processingImages = false
                    self.selectionCallback(self._selectediImages)
                }
            }
        }
    }
}

主な変更点:

  • メインスレッドで同期的に画像を要求しないでください。ただしないでください。
  • 正方形の最大サイズを渡してモードrequestImageForAssetを使用しAspectFillます。これにより、縦横比に関係なく、その正方形を埋めるようにトリミングされる画像が得られます。
  • ここではピクセル サイズで画像を要求しています。画面サイズはポイント単位です。画面のスケールを掛けないと、画像がピクセル化されます。(繰り返しますが、あなたは を求めているFastFormatので、とにかくぼやけた画像になるかもしれません。)
于 2014-12-10T19:03:53.310 に答える