从 UIImage (Swift) 获取 CIImage

Posted

技术标签:

【中文标题】从 UIImage (Swift) 获取 CIImage【英文标题】:Getting CIImage from UIImage (Swift) 【发布时间】:2014-11-23 03:17:28 【问题描述】:

试图从 UIImage 获取 CIImage 以便将其用于 CIFilter,但在最后一行得到以下异常:

Execution was interrupted, reason: EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)

我做错了什么?

import UIKit

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), false, 0)
let con:CGContextRef = UIGraphicsGetCurrentContext()
CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100))
CGContextSetFillColorWithColor(con, UIColor.blueColor().CGColor)
CGContextFillPath(con)
let im:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

let ciimage = CIImage(image: im) // <- Exception here

更新: 按照不要将 CIImage 实例化为变量的建议,我重新编写了初始代码 sn-p 以在操场上工作:

UIGraphicsBeginImageContextWithOptions(CGSizeMake(100,100), false, 0)
let con:CGContextRef = UIGraphicsGetCurrentContext()
CGContextAddEllipseInRect(con, CGRectMake(0,0,100,100))
CGContextSetFillColorWithColor(con, UIColor.blueColor().CGColor)
CGContextFillPath(con)
let im:UIImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()

//let ciimage = CIImage(image: im) // <- this was causing an exception

let filter = CIFilter(name: "CIGaussianBlur", withInputParameters: [kCIInputRadiusKey: 10, kCIInputImageKey: CIImage(image: im)]) // <- this does not cause an exception
let calayer = CALayer()
calayer.contents = CIContext(options:nil).createCGImage(filter.outputImage, fromRect: filter.outputImage.extent())
calayer.frame = CGRect(x: 0, y: 0, width: 270, height: 270)
var view = UIView()
view.frame = calayer.frame
view.layer.addSublayer(calayer)
XCPShowView("view", view)

【问题讨论】:

这在操场上失败,但对我来说在编译后的代码中工作 - 一定是操场环境的怪癖。 是的,在为我编译时也可以工作。 【参考方案1】:

如果您尝试使用过滤器,我解决了这个游乐场错误:

let pic = UIImage(named: "crumpled.jpg")
let filter = CIFilter(name: "CISepiaTone")
filter.setValue(CIImage(image: pic), forKey: kCIInputImageKey)
filter.setValue(0.8, forKey: kCIInputIntensityKey)
let ctx = CIContext(options:nil)
let cgImage = ctx.createCGImage(filter.outputImage, fromRect:filter.outputImage.extent())

【讨论】:

【参考方案2】:

一行就可以了。

UIImage > CIImage

let ciimage = CIImage(image: image)

CIImage > UIImage

let image = UIImage(ciImage: ciimage)

【讨论】:

以上是关于从 UIImage (Swift) 获取 CIImage的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Swift 中从文件夹中获取 UIImage 数组?

如何在swift中从UIImage获取图像扩展/格式

Swift 在 CollectionView 中结合 PHAsset 和 UIImage

在后台 Swift 中循环并将 json 数据附加到 UIImage[] 中

Swift 核心数据 FetchRequest NSData 到 UIIMage

从IOS中的UIImage获取坐标和框架