我有一个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?我正在使用这段代码,但内存泄漏(并且不知道在哪里):
+(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;
}发布于 2013-01-18 15:59:54
请参阅CIContext文档中的createCGImage:从:
CGImageRef img = [myContext createCGImage:ciImage fromRect:[ciImage extent]];一个类似问题的答案:https://stackoverflow.com/a/10472842/474896
此外,由于您有一个CIImage开始,您可以使用CIFilter实际裁剪您的图像。
发布于 2017-08-22 10:19:29
Swift 3,Swift 4和Swift 5
这里有一个很好的小函数,可以在Swift中将CIImage转换为CGImage。
func convertCIImageToCGImage(inputImage: CIImage) -> CGImage? {
let context = CIContext(options: nil)
if let cgImage = context.createCGImage(inputImage, from: inputImage.extent) {
return cgImage
}
return nil
}在桌面或电视上,您通常会使用:
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,请按照苹果的建议缓存它。发布于 2013-01-18 17:50:34
在googling之后,我找到了这个方法,它将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;
}(但我关闭了账单,所以我不知道从哪里得到的)
https://stackoverflow.com/questions/14402413
复制相似问题