26

CIImage からロードされる UIImage があります。

tempImage = [UIImage imageWithCIImage:ciImage];

tempImage問題は、特定のものにトリミングする必要があることです。CGRectこれを行う方法を知っている唯一の方法は、 を使用することCGImageです。問題は、iOS 6.0 のドキュメントで次のように見つけたことです。

CG画像
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;  
}
4

3 に答える 3

25

createCGImage:fromRectCIContextのドキュメントを参照してください。

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

同様の質問への回答から: https://stackoverflow.com/a/10472842/474896

また、最初は があるので、 を使用して実際に画像をトリミングするCIImageこともできます。CIFilter

于 2013-01-18T15:59:54.910 に答える
-2

いくつかのグーグル検索の後、CMSampleBufferRef を CGImage に変換するこのメソッドを見つけました。

+ (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;
}

(ただし、タブを閉じたので、どこから入手したのかわかりません)

于 2013-01-18T17:50:34.233 に答える