我正在尝试将裁剪后的图像保存到相机胶卷中 (我需要以编程方式进行,我不能让用户编辑它)
这是我的(仍然非常基本的)剪切和保存代码:
- (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
。 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
吗?
答案 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