首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从CGImage获得CIImage

从CGImage获得CIImage
EN

Stack Overflow用户
提问于 2013-01-18 15:44:17
回答 3查看 32K关注 0票数 33

我有一个UIImage,它是从一个CIImage加载的:

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.

如何从CIImage转换到CGImage?我正在使用这段代码,但内存泄漏(并且不知道在哪里):

代码语言:javascript
复制
+(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;  
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-18 15:59:54

请参阅CIContext文档中的createCGImage:从:

代码语言:javascript
复制
CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]];

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

此外,由于您有一个CIImage开始,您可以使用CIFilter实际裁剪您的图像。

票数 26
EN

Stack Overflow用户

发布于 2017-08-22 10:19:29

Swift 3Swift 4Swift 5

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

代码语言:javascript
复制
func convertCIImageToCGImage(inputImage: CIImage) -> CGImage? {
    let context = CIContext(options: nil)
    if let cgImage = context.createCGImage(inputImage, from: inputImage.extent) {
        return cgImage
    }
    return nil
}

在桌面或电视上,您通常会使用:

代码语言:javascript
复制
let ctx = CIContext(options: [.useSoftwareRenderer: false])
let cgImage = ctx.createCGImage(output, from: output.extent)

在核心图像处理器中还有许多其他的提示选项,如.allowLowPower.cacheIntermediates.highQualityDownsample、优先级等等。

备注:

  • CIContext(options: nil)将使用软件渲染器,而且速度可能很慢。要提高性能,请使用CIContext(options: [CIContextOption.useSoftwareRenderer: false]) --这会迫使操作在GPU上运行,而且速度会更快。
  • 如果您不止一次使用CIContext,请按照苹果的建议缓存它。
票数 42
EN

Stack Overflow用户

发布于 2013-01-18 17:50:34

在googling之后,我找到了这个方法,它将CMSampleBufferRef转换为CGImage:

代码语言:javascript
复制
+ (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;
}

(但我关闭了账单,所以我不知道从哪里得到的)

票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14402413

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档