2012-02-01 15 views
10

イメージを処理するためにCoreImageフィルタを使用しています。入力イメージにフィルタを適用すると、CIImageタイプのfilterOutputImageという出力イメージが生成されます。CIImageからUIImageを作成する

私は今、その画像を表示したい、とやってみました:

self.modifiedPhoto = [UIImage imageWithCIImage:filterOutputImage]; 
self.photoImageView.image = self.modifiedPhoto; 

ビューがしかし、ブランクである - 何も表示されていません。

filterOutputImageとself.modifiedPhotoの両方の詳細を出力するロギングステートメントを追加すると、これらのロギングステートメントで、両方のvarsに正当なイメージデータが含まれているように見えます。サイズが報告されていてオブジェクトがnilではありません。

グーグルをしてから、私はCGImageステージを通過する必要がある解決策を見つけました。 vis:

CGImageRef outputImageRef = [context createCGImage:filterOutputImage fromRect:[filterOutputImage extent]]; 
self.modifiedPhoto = [UIImage imageWithCGImage:outputImageRef scale:self.originalPhoto.scale orientation:self.originalPhoto.imageOrientation]; 
self.photoImageView.image = self.modifiedPhoto; 
CGImageRelease(outputImageRef); 

この第2のアプローチでは、ビューに正しい画像が表示されています。

誰かが私の最初の試みが失敗した理由を説明してもらえますか? imageWithCIImageメソッドで何が間違っていて、存在していると思われるが表示できない画像になっているのですか? CIImageからUIImageを生成するには、常にCGImageステージを「通過」する必要がありますか?

願って誰かが私はself.photoImageViewがUIImageViewであると仮定し、私の混乱:)

H.

答えて

8

を片付けることができますか? もしそうなら、最終的には、UIImageで-[UIImage CGImage]を呼び出し、そのCGImageをCALayerのcontentsプロパティとして渡します。

(コメントを参照してください:私の詳細は間違っていた)

をUIImageドキュメントごと-[UIImage CGImage]のために:

If the UIImage object was initialized using a CIImage object, the 
value of the property is NULL. 

だから、UIImageViewは-CGImageを呼び出しますが、それはNULLになり、そう何も表示されません。

私はこれを試していないが、しかし、あなたはCIImageを描画する-[UIView drawRect:]にUIImageの-draw...メソッドを使用して、カスタムUIViewのを作ると試みることができます。

+0

Ahh!ありがとうございました。はい、photoImageViewはUIImageViewです。私はそれがUIImageのCGImageプロパティを使用していることを知らなかった。 – Hamster

+0

もう1つの質問です。どの文書でUIImageViewがその画像をどのように表示するのか説明していますか?私はあなたがそれをどこから学んだのかを調べようとしています:) – Hamster

+0

実際、私はバイナリコードを実際に見ています:UIImageViewはsetContents:を呼び出すのではなく、独自のCALayerで-drawRectをオーバーライドします。最終的にCGImageRefをつかんで描画するUIImage描画メソッドを呼び出すようです。だから、同じ結果が、私の詳細は間違っていた。 – iccir

15

これはすべきです!

-(UIImage*)makeUIImageFromCIImage:(CIImage*)ciImage 
{ 
    self.cicontext = [CIContext contextWithOptions:nil]; 
    // finally! 
    UIImage * returnImage; 

    CGImageRef processedCGImage = [self.cicontext createCGImage:ciImage 
                 fromRect:[ciImage extent]]; 

    returnImage = [UIImage imageWithCGImage:processedCGImage]; 
    CGImageRelease(processedCGImage); 

    return returnImage; 
} 
関連する問題