【问题标题】:UIImageWriteToSavedPhotosAlbum() doesn't save cropped imageUIImageWriteToSavedPhotosAlbum() 不保存裁剪的图像
【发布时间】:2015-08-04 21:03:33
【问题描述】:

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

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

- (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 对象为nil。 (回调通常会在两次保存尝试中执行)

编辑: 刚做了一个实验:

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

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

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

【问题讨论】:

    标签: ios objective-c


    【解决方案1】:

    UIImageWriteToSavedPhotosAlbum 可以使用支持的 CGImageRef 吗?

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

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

    【讨论】:

    • 谢谢。其实这只是初步测试。稍后我将需要 CIFilters。我知道有一个过滤器可以裁剪 CIImages,也许我会直接使用它。无论如何,您能否提供一个通过绘制到较小的图形上下文中进行裁剪的简单示例?另外,我将如何使用 CIContext 将 CIImage 转换回位图?干杯。
    • 通过绘制到较小的上下文中进行裁剪:apeth.com/iOSBook/ch15.html#_uiimage_drawing
    【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多