这是在试图将图像保存到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看到两个图像都存在且相似。
我的问题是:在裁剪过程中是否存在阻止保存正常发生的事情?
(请快速回答)
答案 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。