UIImageWriteToSavedPhotosAlbum()不保存裁剪的图像

tom*_*ave 1 objective-c ios

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

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

- (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);
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我首先创建一个CIImage使用raw UIImage.
  • 然后我CIImage使用第一个实例方法进行裁剪.
  • 之后我UIImage使用裁剪的CIImage 创建一个新的.

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

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

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

编辑:刚做了一个实验:

NSLog(@"rawImage: %@    -   rawImage.CGImage: %@", rawImage, rawImage.CGImage);
NSLog(@"endImage: %@    -   endImage.CGImage: %@", endImage, endImage.CGImage);
Run Code Online (Sandbox Code Playgroud)

看起来只有rawImage(来自UIImagePickerController)拥有支持CGImageRef.另一个是由a创建的CIImage,不是.

可以UIImageWriteToSavedPhotosAlbum使用支持CGImageRef吗?

mat*_*att 5

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

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

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