使用CIImage时为什么UIImageWriteToSavedPhotosAlbum()无效?

时间:2015-11-21 20:36:04

标签: ios uikit core-image photosframework

我使用一些链式过滤器生成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)

2 个答案:

答案 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.outputImageCGImage转换为CIContext.createCGImage(),将CGImage转换为UIImage可以成功保存图片。