2013-01-18 7 views
14

からCGImageを取得私はCIImageからロードされるUIImageがあります。問題は、私は特定のCGRecttempImageをトリミングする必要があるCIImage

tempImage = [UIImage imageWithCIImage:ciImage];

と私が行う方法を知っている唯一の方法これはCGImageを使用しています。 問題は、iOS 6.0のマニュアルには、私はこれを見つけたということです。

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

A.どのようにCIImageからCGImageへ変換するのですか? 私はこのコードを使用していますが、私はメモリリークを持っている(と場所を理解することはできません):

+(UIImage*)UIImageFromCIImage:(CIImage*)ciImage { 
    CGSize size = ciImage.extent.size; 
    UIGraphicsBeginImageContext(size); 
    CGRect rect; 
    rect.origin = CGPointZero; 
    rect.size = size; 
    UIImage *remImage = [UIImage imageWithCIImage:ciImage]; 
    [remImage drawInRect:rect]; 
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    remImage = nil; 
    ciImage = nil; 
    // 
    return result; 
} 
+0

作図を行うにはCGImageが必要です。 Joris Kluivers氏は、CIImageでCICropフィルタを使用することで、CGImageなしで作物を処理できると述べています。 CGImageが必要なことは他にありますか?もしそうなら、何? –

+0

また、メモリリークに関して、InstrumentsのLeaksテンプレートを使用してみましたか? Leaks楽器とAllocations楽器のHeapshotツールの間で、あなたのアプリ内でどこにメモリが漏れているか蓄積されているかを特定できるはずです。 –

+0

@PeterHosey私は何とかして何らかの理由で私はCIImageの200以上のライブインスタンスと100以上のCGImageを持っていることを発見しました。私はちょうどどこに見えないのですか – tagyro

答えて

20

は、同様の質問への答えからcreateCGImage:fromRect:

CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]]; 

ためCIContextマニュアルを参照してください: https://stackoverflow.com/a/10472842/474896

また、最初にCIImageがあるので、CIFilterを使用してイメージを実際にトリミングすることができます。

+2

Core Imageは* createCGImage:fromRect: '(または完成したピクセルを必要とする他の方法)では、すべての作業が実際に完了したポイントです。これまでに実際のフィルタリングは行われていません。コアイメージフィルタを使用してクロップすると、実際にはかなりの作業量が節約されますが、クロップアウトされたピクセルを要求しないため、レンダリングされません。 (もちろん、もう1つの方法は 'fromRect:'の作図用矩形を渡すことです。これは同じ効果を持ちます。) –

+0

@Joris Kluiversは答えに感謝しますが、私は同じ結果を得ます: CIContext * context = [CIContext new]; CGImageRef ref = [コンテキストcreateCGImage:cIImage fromRect:[ciImageエクステント]]; tempImage = [UIImage imageWithCGImage:ref]; CGImageRelease(ref); NSLog(@ "tempImage:%f%f"、tempImage.size.width、tempImage.size.height); 出力:tempImage:0.000000 0.000000 – tagyro

+0

@PeterHoseyあなたはそうですが、残念ながら私は変換を行っているときにトリミング情報を持っていないので、CGImageを使用しているので変換を行う必要があります。ありがとう – tagyro

-3

私はCGImageにCMSampleBufferRefを変換し、この方法で見つかったいくつかのグーグルで後:

+ (CGImageRef)imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer // Create a CGImageRef from sample buffer data 
{ 
    CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer); 
    CVPixelBufferLockBaseAddress(imageBuffer,0);  // Lock the image buffer 

    uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddressOfPlane(imageBuffer, 0); // Get information of the image 
    size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer); 
    size_t width = CVPixelBufferGetWidth(imageBuffer); 
    size_t height = CVPixelBufferGetHeight(imageBuffer); 
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 

    CGContextRef newContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst); 
    CGImageRef newImage = CGBitmapContextCreateImage(newContext); 
    CGContextRelease(newContext); 

    CGColorSpaceRelease(colorSpace); 
    CVPixelBufferUnlockBaseAddress(imageBuffer,0); 
    /* CVBufferRelease(imageBuffer); */ // do not call this! 

    return newImage; 
} 

を(私は、私からそれを得たところ私は知りません、タブを閉じて)

+1

これはCIImageをまったく含まない。ですから、本当にあなたはCMSampleBufferからCGImageを作成しようとしていましたが、CIImageはそれを念頭に置いただけの手段でした。 –

+0

@PeterHoseyおそらく私は 'AVCaptureOutput'からsampleBufferを取得していますが、私はCIImageを顔検出に使用しています。最終的な目標はキャプチャされた画像から顔を切り取ることです。私はCIImageとCGImageを理解するにはあまりにも馬鹿ですので、別の解決策を探しました:CMSampleBuffer ps私はジョリスの答えを受け入れました。なぜなら、それは私の質問に対する正しい答えなのです。 – tagyro

+0

ああ、顔の検出。それは合法です。あなたはまだAVCaptureMetadataOutputとAVMetadataFaceObjectを見ましたか? –

3

スウィフト3.1

スウィフトのCIImageCGImageに変換するのに便利な機能があります。

func convertCIImageToCGImage(inputImage: CIImage) -> CGImage? { 
    let context = CIContext(options: nil) 
    if let cgImage = context.createCGImage(inputImage, from: inputImage.extent) { 
     return cgImage 
    } 
    return nil 
} 
関連する問題