从CIImage获取CGImage

tag*_*yro 18 core-graphics core-image cgimage ios ciimage

我有一个从CIImage加载的UIImage:

tempImage = [UIImage imageWithCIImage:ciImage];

问题是我需要裁剪tempImage到一个特定的CGRect,我知道如何做到这一点的唯一方法是使用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;  
}
Run Code Online (Sandbox Code Playgroud)

Jor*_*ers 23

请参阅createCGImageCIContext文档:fromRect:

CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]];
Run Code Online (Sandbox Code Playgroud)

从答案到类似的问题:https://stackoverflow.com/a/10472842/474896

此外,由于你有一个CIImage开始,你可以CIFilter用来实际裁剪你的图像.

  • 可能而且应该:核心图像是非常*懒惰的,因为`createCGImage:fromRect:`(或任何其他需要完成像素的方法)是所有工作实际完成的点; 之前没有进行过实际的过滤.使用核心图像滤镜进行裁剪实际上可以节省相当多的工作量(与裁剪的数量成比例),因为这样你就不会要求裁剪出的像素,因此它们根本不会被渲染.(当然,另一种方法是传递`fromRect:`的裁剪矩形,它将具有相同的效果.) (2认同)

sky*_*ook 17

Swift 3Swift 4

这是一个很好的小函数,CIImage可以CGImage在Swift中转换为.

func convertCIImageToCGImage(inputImage: CIImage) -> CGImage? {
    let context = CIContext(options: nil)
    if let cgImage = context.createCGImage(inputImage, from: inputImage.extent) {
        return cgImage
    }
    return nil
}
Run Code Online (Sandbox Code Playgroud)