无法保存从CIImage和UIImage切换格式的裁剪图像

时间:2014-12-04 12:23:42

标签: ios swift

这是在试图将图像保存到Parse.com后端的快速应用程序的上下文中 在项目中,我将原始图像裁剪为正方形图像:

    @IBOutlet weak var imageContainer: UIImageView! //Original image container
    @IBOutlet weak var dest: UIImageView! //Cropped image container

原始图像通过这个:

//Crop image
    let croppedImage = imageContainer.image
    let ciImage = CIImage(image: croppedImage)
    let ciImageCropped = ciImage.imageByCroppingToRect(grabberRectangleCoordinates)
    let finalImageToUIImage = UIImage(CIImage: ciImageCropped!)

    dest.image = finalImageToUIImage as UIImage!

当我将这两个图像与println()进行比较时,我得到了非常相似的结果:

//Cropped
Optional(<UIImage: 0x79e7a0b0> size {850, 850} orientation 0 scale 1.000000) 
//Original
Optional(<UIImage: 0x7992d390> size {1280, 850} orientation 0 scale 1.000000)

所以你看到两个图像确实存在并且相似。我在他们的容器中看到它们都在屏幕上。

但是,当我尝试保存以解析:

    let user = PFUser.currentUser()
    let imageData = UIImagePNGRepresentation(dest.image!)
    let imageFile = PFFile(name:"image.png", data:imageData)
    var userEntry = PFObject(className:"Photos")
    userEntry["imageFile"] = imageFile
    //save code below but doesn't matter

剧烈崩溃并显示错误消息:

  

由于未捕获的异常'NSInternalInconsistencyException'而终止应用,原因:'无法保存文件数据   for image.png :( null)'

什么是奇怪的,阻止我在这里,是在我替换裁剪的容器dest.image时的保存代码!通过原始图像容器imageContainer.image !,它运行良好,但我们用println看到两个图像都存在且相似。

我的问题是:在裁剪过程中是否存在阻止保存正常发生的事情?

(请快速回答)

1 个答案:

答案 0 :(得分:0)

得到了解决方案。 事实证明,将图像转换为CIImage会导致问题。所以必须避免这种情况。因此,我们将转换为CGImage,并使用另一种方法从矩形坐标进行裁剪。转换回UIImage时不仅不会造成问题(不再为零),它使代码更简单:

        //Crop image
        let croppedImage = imageContainer.image //Original image
        //CGImageCreateWithImageInRect is the function to create the cropped image. Must be a CGImage.
        let finalCroppedImage : CGImageRef = CGImageCreateWithImageInRect(croppedImage?.CGImage, grabberRectangleCoordinates)
        dest.image = UIImage(CGImage: finalCroppedImage)

您现在可以将dest.image保存到Parse.com中,它不会返回nil。