5

CIImageからUIImageを取得するのに問題があります。以下のコード行はiOS6で正常に機能します:(出力画像はCIImageです)

self.imageView = [UIImage imageWithCIImage:outputImage];

また

[self.imageView setImage:[UIImage imageWithCIImage:outputImage]];

iOS 5を実行しているデバイスでこれと同じコード行を実行すると、imageViewが空白になります。UIImageのsizeプロパティをログに記録すると、それは正しいのですが、画像が画面に表示されません。

CGImageRefを使用すると(以下に示すように)、両方のデバイスで正常に機能しますが、ヒープショット分析を行うとメモリが大幅に増加します。

context = [CIContext contextWithOptions:nil];
CGImageRef ref = [context createCGImage:outputImage fromRect:outputImage.extent];
self.imageView.image = [UIImage imageWithCGImage:ref scale:1.0 orientation:UIImageOrientationUp];
CGImageRelease(ref);

UIImage imageWithCIImageが機能しない理由を誰かが知っていますか?UIImageクラスリファレンスによると、iOS5以降で動作するはずです。また、なぜCGImageRefを使用すると、このような大量のヒープが増加するのでしょうか。

ありがとうございました

4

1 に答える 1

4

iOS 5.0では、-imageWithCIImage:正しく動作するようには見えませんでした-createCGImage:fromRect:。CoreImageフィルターチェーンをラスター出力にレンダリングするために、上記のアプローチを使用するように言われました。

ご覧のとおり、これの欠点は-createCGImage:fromRect:、ターゲット画像のサイズで新しいCGImageRefが作成され、その中心にあるビットマップが新しいUIImageに渡されることです。これはおそらく、ある時点でメモリ内の最終的なフィルタリングされたフレームを表す少なくとも2つの完全なビットマップがあることを意味します。これは、これらが大きな画像である場合、かなりのスパイクを引き起こす可能性があります。

iOS 6.0で修正されたようです-imageWithCIImage:(Core Imageでは5.0から6.0に多くの改善が加えられています)。なぜこのメモリスパイクが発生しないのかを推測することしかできませんが、フィルタリングプロセスからの出力OpenGLESテクスチャとに保存されている最終的なビットマップの間でメモリを共有するためにテクスチャキャッシュを使用しているためだと思います。 UIImage。私はGPUImageフレームワークでこれを行い、大きな画像をフィルタリングするときのメモリ消費を削減します。CoreImageでも同じことを行うのは理にかなっています。繰り返しますが、これは単なる憶測です。

残念ながら、アプリケーションでiOS 5.0をサポートしたい場合は、ここで少しバージョンテストを行い、CIImagesから出力を取得する古い方法にフォールバックする必要があるようです。

于 2012-10-15T22:10:10.147 に答える