我使用一些链式过滤器生成CIImage,并尝试在用户相册中输出生成的图像以用于某些调试目的。我提供给UIImageWriteToSavedPhotosAlbum()
的回调总是返回一个nil错误,因此我认为没有任何错误。但图像似乎永远不会出现。
我过去曾使用过这个功能将OpenGL缓冲区转储到相册进行调试,但我发现这并不是同样的情况。我应该采取不同的做法吗?
-(void)cropAndSaveImage:(CIImage *)inputImage fromFeature:(CIFaceFeature *)feature
{
// First crop out the face.
[_cropFilter setValue:inputImage forKey:@"inputImage"];
[_cropFilter setValue:[CIVector vectorWithCGRect:feature.bounds] forKey:@"inputRectangle"];
CIImage * croppedImage = _cropFilter.outputImage;
__block CIImage * outImage = croppedImage;
dispatch_async(dispatch_get_main_queue(), ^{
UIImage * outUIImage = [UIImage imageWithCIImage:outImage];
UIImageWriteToSavedPhotosAlbum(outUIImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
});
}
-(void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
NSLog(@"debug LBP output face. error: %@", error);
}
我已经确认边界永远不会为0.
回调输出始终为
调试LBP输出面。错误:(null)
答案 0 :(得分:0)
我自己想出来并删除了这个问题,但后来我想也许有人会从中得到一些帮助。我这样说是因为我遇到了一个较旧的答案,表明最初的实施工作正常。但实际上必须做以下事情以使其正常工作。
__block CIImage * outImage = _lbpFilter.outputImage;
dispatch_async(dispatch_get_main_queue(), ^{
CGImageRef imgRef = [self renderCIImage:outImage];
UIImage * uiImage = [UIImage imageWithCGImage:imgRef];
UIImageWriteToSavedPhotosAlbum(uiImage, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
});
+ (CGImageRef)renderCIImage:(CIImage *)img
{
if ( !m_ctx ) {
NSDictionary * options = @{kCIContextOutputColorSpace:[NSNull null], kCIContextWorkingColorSpace:[NSNull null]};
m_ctx = [CIContext contextWithOptions:options];
}
return [m_ctx createCGImage:img fromRect:img.extent];
}
答案 1 :(得分:0)
使用filter.outputImage
由CGImage
转换为CIContext.createCGImage()
,将CGImage
转换为UIImage
可以成功保存图片。