将 UIImage 转换为 CGImage 以获取像素颜色

Posted

技术标签:

【中文标题】将 UIImage 转换为 CGImage 以获取像素颜色【英文标题】:Converting UIImage to CGImage to get Pixel Color 【发布时间】:2016-01-24 20:39:20 【问题描述】:

根据来自这个问题 (How do I get the color of a pixel in a UIImage with Swift?) 的代码,我正在尝试在点击按钮时运行一个函数。到目前为止,这是我的代码:

@IBOutlet weak var graphImage: UIImageView!

var image : UIImage?

override func viewDidLoad() 
    super.viewDidLoad()

    // Do any additional setup after loading the view.


func getPixelColor(pos: CGPoint) -> UIColor 
    var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.image!.CGImage))
    var data : UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

    var pixelInfo : Int = ((Int(image!.size.width) * Int(pos.y) + Int(pos.x)*4))

    let r = CGFloat(data[pixelInfo])
    let g = CGFloat(data[pixelInfo]+1)
    let b = CGFloat(data[pixelInfo]+2)
    let a = CGFloat(data[pixelInfo]+3)

    return UIColor(red: r, green: g, blue: b, alpha: a)


@IBAction func playTapped(sender: AnyObject) 
    var c : CGFloat = 100.0
    var d : CGFloat = 100.0
    getPixelColor(CGPoint(x:c,y:d))

但是,每当我在 ios 模拟器中点击播放按钮时,应用程序就会崩溃,并且我会在函数 getPixelColor 的第一行收到警告“致命错误:在展开可选值时意外发现 nil”。我在这里做错了什么/我需要添加什么?

【问题讨论】:

【参考方案1】:

非常直接。根据此处的代码,您确实在解开 nil 对象。您的实例变量 image 从未初始化为任何内容...因此您尝试使用 ! 强制解包它,但它实际上是 nil

【讨论】:

哦,不好意思,我忘了说,我调试的时候,image对象其实不是nil,但是变量pixelData是。我对编码很陌生,所以我不知道这是否意味着我的图像对象仍然不是问题。无论如何,我将如何初始化这个变量?我试着只是说“var image = graphImage”,但后来我在函数 getPixelColor 的第三行得到一个错误,说 UIImageView 没有成员大小。 没有进入你的项目的细节 - 关键是你的变量imagenil。这取决于你,或者另一个问题来找出原因。祝你好运!

以上是关于将 UIImage 转换为 CGImage 以获取像素颜色的主要内容,如果未能解决你的问题,请参考以下文章

将UIImage转换为CVPixelBufferRef

UIImage 在将其转换为 CIImage,然后转换为 CGImage 并返回 UIImage 时失去其方向

有啥方法可以在不将 CIImage 转换为 UIImage 或 CGImage 的情况下将 CIImage 转换为 NSData?

UIImage 大小(以像素为单位)

为啥我的 CGImage 是 UIImage 大小的 3 倍

在swift中从UIImage / CGImage获取像素数据作为数组