UIImageJPEGRepresentation返回nil

我使用CIFilters将图像转换为灰度并应用一些image processing效果。 在UIImageView中显示输出结果 图像显示并已按预期进行了修改。

但是,调用UIImageJPEGRepresentation似乎每次都不返回任何数据。 它从来没有工作。 调用UIImageJPEGRepresentation使用原始的彩色图像工作正常。

这里发生了什么? 为什么在显示图像时jpeg转换失败可以正常工作? 不会引发任何exception(设置exception断点,没有命中),控制台中不会显示任何消息。

let _cicontext = CIContext(options:nil) // Set up grayscale and blur filters: let grayIze = CIFilter(name: "CIColorControls") let blur = CIFilter(name: "CIGaussianBlur") grayIze.setValue(0, forKey:kCIInputSaturationKey) grayIze.setValue(0.5, forKey: kCIInputBrightnessKey) blur.setValue(4, forKey: kCIInputRadiusKey) // Go! let originalImage = CIImage(image: colorImageThatDefinitelyExists) grayIze.setValue(originalImage, forKey: kCIInputImageKey) blur.setValue(grayIze.outputImage, forKey: kCIInputImageKey) let output = UIImage(CIImage: blur.outputImage) let imageData: NSData? = UIImageJPEGRepresentation(output, 1.0) // Returns nil!? 

编辑:这是基于Arbitur的答案的工作代码:

 // Define an image context at the class level, which will only be initialized once: static let imageContext = CIContext(options:nil) // And here's the updated code in a function: class func convertToGrayscale(image: UIImage)->UIImage? { // Set up grayscale and blur filters: let filter1_grayIze = CIFilter(name: "CIColorControls") let filter2_blur = CIFilter(name: "CIGaussianBlur") filter1_grayIze.setValue(0, forKey:kCIInputSaturationKey) filter1_grayIze.setValue(0.5, forKey: kCIInputBrightnessKey) filter2_blur.setValue(4, forKey: kCIInputRadiusKey) // Go! let originalImage = CIImage(image: image) filter1_grayIze.setValue(originalImage, forKey: kCIInputImageKey) filter2_blur.setValue(filter1_grayIze.outputImage, forKey: kCIInputImageKey) let outputCIImage = filter2_blur.outputImage let temp:CGImageRef = imageContext.createCGImage(outputCIImage, fromRect: outputCIImage.extent()) let ret = UIImage(CGImage: temp) return ret } // And finally, the function call: if let grayImage = ProfileImage.convertToGrayscale(colorImage) { let imageData: NSData? = UIImageJPEGRepresentation(grayImage, 1.0) } 

我以前曾经用CIImage解决了这个问题,并且解决了这个问题,我用CIImage创build了一个CGImage,然后用CGImage创build了一个UIImage。

UIImageJPEGRepresentation似乎使用UIImageCGImage属性。 问题是,当用CIImage初始化UIImage时,该属性nil

我的解决scheme是在UIImageJPEGRepresentation调用之前添加以下块:

  if image.CGImage == nil { guard let ciImage = image.CIImage, let cgImage = CIContext(options: nil).createCGImage(ciImage, fromRect: ciImage.extent) else { return nil } image = UIImage(CGImage: cgImage) }