1

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

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

- (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我首先使用 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);

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

可以UIImageWriteToSavedPhotosAlbum使用支持CGImageRef吗?

4

2 回答 2

5

UIImageWriteToSavedPhotosAlbum 是否可以使用支持的 CGImageRef 工作?

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

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

于 2013-05-06T14:48:09.667 回答
2

如果 UIImage 对象是使用 CIImage 对象初始化的,则该属性的值为 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
于 2015-05-21T08:46:37.740 回答