UIImagePickerControllerによって返されるカメラUIImageのサイズ変更は、この投稿のように通常の方法で行うと、途方もなく長い時間がかかります。
[更新:ここで創造的なアイデアの最後の呼び出し!私の次の選択肢は、Appleに聞いてみるということだと思います。]
はい、それはたくさんのピクセルですが、iPhoneのグラフィックハードウェアは1/60秒でたくさんの1024x1024テクスチャクワッドを画面に完全に描くことができるので、2048x1536画像のサイズをに変更する方法が本当にあるはずです1.5秒未満で640x480。
では、なぜそんなに遅いのですか?OSがピッカーから返す基になる画像データは、どういうわけか描画する準備ができていないので、GPUが支援できない何らかの方法でスウィズルする必要がありますか?
私の推測では、RGBAからABGRなどに変換する必要があります。たとえデータが間違った形式であっても、システムにデータを迅速に提供するように説得することができるかもしれない方法を誰かが考えることができますか?後でそれを自分で処理しますか?
私の知る限り、iPhoneには専用の「グラフィック」メモリがないので、画像データをある場所から別の場所に移動することに問題はありません。
それで、質問:GPUをより活用するCGBitmapContextCreateとCGContextDrawImageを使用する以外に、いくつかの代替の描画方法はありますか?
調査すべき点:画像ピッカーからのものではない同じサイズのUIImageから始めた場合、それは同じくらい遅いですか?どうやらそうではありません...
[info objectForKey:@"UIImagePickerControllerEditedImage"]
更新:Matt Longは、手動のカメラコントロールでトリミングを有効にしている場合、ピッカーから取得した画像のサイズを変更するのに30ミリ秒しかかからないことを発見しました。takePicture
これは、プログラムで写真を撮るために使用している場所が気になる場合には役立ちません。編集した画像はですkCGImageAlphaPremultipliedFirst
が、元の画像はkCGImageAlphaNoneSkipFirst
です。
さらなる更新:Jason Crawfordが提案CGContextSetInterpolationQuality(context, kCGInterpolationLow)
しました。これは、実際には時間を約1.5秒から1.3秒に短縮しますが、画質は犠牲になりますが、それでもGPUが可能な速度にはほど遠いです。
週が切れる前の最後の更新:ユーザーrefulgentisがプロファイリングを行いました。これは、キャプチャされたカメラ画像をJPEGとしてディスクに書き込み、それを読み戻すのに1.5秒かかることを示しているようです。trueの場合、非常に奇妙です。