UIImageWriteToSavedPhotosAlbum()不保存裁剪的图像

时间:2013-05-06 14:23:20

标签: ios objective-c

我正在尝试将裁剪后的图像保存到相机胶卷中 (我需要以编程方式进行,我不能让用户编辑它)

这是我的(仍然非常基本的)剪切和保存代码:

- (void)cutAndSaveImage:(UIImage*)rawImage
{
    CIImage *workingImage = [[CIImage alloc] initWithImage:rawImage];

    CGRect croppingRect = CGRectMake(0.0f, 0.0f, 3264.0f, 1224.0f);
    CIImage *croppedImage = [workingImage imageByCroppingToRect:croppingRect];

    UIImage *endImage = [UIImage imageWithCIImage:croppedImage scale: 1.0f orientation:UIImageOrientationRight];

    self.testImage.image = endImage;

    UIImageWriteToSavedPhotosAlbum(rawImage, self, @selector(image:didFinishSavingWithError:contextInfo:) , nil);
    UIImageWriteToSavedPhotosAlbum(endImage, self, @selector(image:didFinishSavingWithError:contextInfo:) , nil);
}

该方法在以下内容中调用:
- (void)imagePickerController:(UIImagePickerController*)picker didFinishPickingMediaWithInfo:(NSDictionary*)info

  • 我首先使用原始CIImage创建UIImage
  • 然后我使用第一个实例方法获得裁剪CIImage
  • 之后我使用裁剪的CIImage创建一个新的UIImage

此时,为了获得一些反馈,我将新裁剪的UIImage设置为UIImageView的支持图像。这是有效的,我可以清楚地看到图像完全按照我想要的方式裁剪。

但是,当我尝试将其保存到相机胶卷时,事情就会停止工作 我无法保存新创建的endImage 如您所见,我添加了一行来保存原始UIImage,仅供比较。原版正常保存。

另一个令人困惑的事情是传递给NSError回调的image:didFinishSavingWithError:contextInfo:对象是零。 (回调通常在两次保存尝试时执行)

编辑: 刚做了一个实验:

NSLog(@"rawImage: %@    -   rawImage.CGImage: %@", rawImage, rawImage.CGImage);
NSLog(@"endImage: %@    -   endImage.CGImage: %@", endImage, endImage.CGImage);

看起来只有rawImage(来自UIImagePickerController)拥有支持CGImageRef。从CIImage创建的另一个则没有。

UIImageWriteToSavedPhotosAlbum可以使用支持CGImageRef吗?

2 个答案:

答案 0 :(得分:5)

  

UIImageWriteToSavedPhotosAlbum可以使用支持CGImageRef工作吗?

正确。 CIImage不是图像,只有CIImage支持的UIImage也不是图像;它只是一种包装。为什么你在这里使用CIImage?您没有使用CIFilter,所以这没有任何意义。或者如果 使用CIFilter,则必须通过CIContext渲染以将输出作为位图。

您可以通过绘制较小的图形上下文轻松裁剪。

答案 1 :(得分:2)

如果使用CIImage对象初始化UIImage对象,则 该属性的值为NULL。

您可以像这样从CIImage生成UIImage:

let lecturePicture = UIImage(data: NSData(contentsOfURL: NSURL(string:"http://i.stack.imgur.com/Xs4RX.jpg")!)!)!
let controlsFilter = CIFilter(name: "CIColorControls")
controlsFilter.setValue(CIImage(image: lecturePicture), forKey: kCIInputImageKey)
controlsFilter.setValue(1.5, forKey: kCIInputContrastKey)
let displayImage = UIImage(CGImage: CIContext(options:nil).createCGImage(controlsFilter.outputImage, fromRect:controlsFilter.outputImage.extent()))!
displayImage