UIImageWriteToSavedPhotosAlbum()不保存裁剪的图像

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

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

- (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

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

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

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

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

编辑:刚做了一个实验:

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

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

难道UIImageWriteToSavedPhotosAlbum可以使用支持CGImageRef吗?

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

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

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

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

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

 let lecturePicture = UIImage(data: NSData(contentsOfURL: NSURL(string:"http://sofzh.miximages.com/ios/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