UIImageJPEGRepresentation返回nil

sto*_*one 17 uiimage ios cifilter swift

我正在使用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!?
Run Code Online (Sandbox Code Playgroud)

编辑:这是工作代码,基于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)
    }
Run Code Online (Sandbox Code Playgroud)

Dan*_*iel 31

UIImageJPEGRepresentation似乎使用的CGImage属性UIImage.问题是,当你UIImage使用a 初始化时CIImage,该属性是nil.

我的解决方案是在UIImageJPEGRepresentation通话前添加以下块:

(最后更新Swift 4)

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 太棒了,这就像一个魅力.不确定我会偶然发现nil CIImage属性. (2认同)

Arb*_*tur 11

我曾经遇到过CIImage的问题,并解决了我用CIImage制作CGImage然后用CGImage制作UIImage的问题.

  • 建议:通过发布完成此操作所需的代码,可以改善您的答案. (8认同)