我使用CIFilters将图像转换为灰度,并应用一些图像处理效果。在UIImageView中显示输出是可行的;图像显示并按预期进行了修改。
然而,每次调用UIImageJPEGRepresentation似乎都不返回任何数据。从来都不起作用。使用原始彩色图像调用UIImageJPEGRepresentation很好。
这里发生了什么事?当显示图像时,为什么jpeg转换会失败?没有抛出异常(设置异常断点,它没有命中),控制台中也没有出现任何消息。
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's answer 编辑:这是基于的工作代码
// 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)
}发布于 2015-04-19 20:39:16
我以前遇到过CIImage的问题,为了解决这个问题,我用CIImage做了一个CGImage,然后用CGImage做了一个UIImage。
发布于 2016-11-03 08:58:45
UIImageJPEGRepresentation似乎使用了UIImage的CGImage属性。问题是,当您用一个UIImage初始化CIImage时,该属性就是nil。
我的解决方案是在UIImageJPEGRepresentation调用之前添加以下块:
上一次更新Swift 5.1
if image.cgImage == nil {
guard
let ciImage = image.ciImage,
let cgImage = CIContext(options: nil).createCGImage(ciImage, from: ciImage.extent)
else {
return nil
}
image = UIImage(cgImage: cgImage)
}发布于 2018-01-29 08:10:22
丹尼尔的回答很有效。下面他的答案转换为在Swift4中使用。
Swift4
if image?.cgImage == nil {
guard let ciImage = image?.ciImage, let cgImage = CIContext(options: nil).createCGImage(ciImage, from: ciImage.extent) else { return }
image = UIImage(cgImage: cgImage)
}https://stackoverflow.com/questions/29732886
复制相似问题