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
似乎使用UIImage
的CGImage
属性。 问题是,当用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) }