ios - swift 4 : Get RGB values of pixel in UIImage

标签 ios swift colors uicolor

我知道有很多帖子介绍如何在给定 CGPoint 的情况下获取 UIImage 中像素的颜色,但据我所知,它们都已过时告诉。其中大部分包含 CGImageGetDataProviderCGDataProviderCopyData,这在 Swift 4 中是一个错误:

'CGImageGetDataProvider' has been replaced by property 'CGImage.dataProvider' 'CGDataProviderCopyData' has been replaced by property 'CGDataProvider.data'

Xcode 建议使用这些替代品,但它们并不存在,因此我一直无法尝试重新创建 Swift 4 函数来获取 UIImage 中像素的颜色。

这是典型的 Swift 3 函数:

extension UIImage {

    subscript (x: Int, y: Int) -> UIColor? {

        if x < 0 || x > Int(size.width) || y < 0 || y > Int(size.height) {
            return nil
        }

        let provider = CGImageGetDataProvider(self.cgImage!)
        let providerData = CGDataProviderCopyData(provider!)
        let data = CFDataGetBytePtr(providerData)

        let numberOfComponents = 4
        let pixelData = ((Int(size.width) * y) + x) * numberOfComponents

        let r = CGFloat(data![pixelData]) / 255.0
        let g = CGFloat(data![pixelData + 1]) / 255.0
        let b = CGFloat(data![pixelData + 2]) / 255.0
        let a = CGFloat(data![pixelData + 3]) / 255.0

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

}

非常感谢任何建议或评论。谢谢!


编辑

我尝试了@Mukesh 的解决方案,但即使所有构建错误都已修复,程序还是崩溃了。它说:

我给函数的图片不是nil,我检查过了。


附言我用于该功能的图像是相机的快照。我有一个实时摄像头,在每一帧之后,都会调用此函数(如下),我将当前帧转换为 UIImage。这个 UIImage 是我想要找到的像素颜色:

func captureOutput(_ output: AVCaptureOutput, didOutput sampleBuffer: CMSampleBuffer, from connection: AVCaptureConnection) {
        let pixelBuffer: CVPixelBuffer = CMSampleBufferGetImageBuffer(sampleBuffer)!
        let ciImg = CIImage(cvPixelBuffer: pixelBuffer)
        let cameraImage = UIImage(ciImage: ciImg)
        let col = cameraImage.getPixelColor(pos: CGPoint(x: 100, y: 100))
   }

我使用 CGPoint(x: 100, y: 100) 来查看它是否崩溃作为示例,它确实发生了。这一点也在图像中,因为如果不是,它会在此处返回 nil:

if x < 0 || x > Int(size.width) || y < 0 || y > Int(size.height) {
            return nil
}

有没有办法找出为什么它得到一个 nil 值?或者也许是不同的解决方案?谢谢:)

最佳答案

这是我在删除错误后得到的代码:

extension UIImage {

    subscript (x: Int, y: Int) -> UIColor? {

        if x < 0 || x > Int(size.width) || y < 0 || y > Int(size.height) {
            return nil
        }

        let provider = self.cgImage!.dataProvider
        let providerData = provider!.data
        let data = CFDataGetBytePtr(providerData)

        let numberOfComponents = 4
        let pixelData = ((Int(size.width) * y) + x) * numberOfComponents

        let r = CGFloat(data![pixelData]) / 255.0
        let g = CGFloat(data![pixelData + 1]) / 255.0
        let b = CGFloat(data![pixelData + 2]) / 255.0
        let a = CGFloat(data![pixelData + 3]) / 255.0

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

关于ios - swift 4 : Get RGB values of pixel in UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50623967/

相关文章:

ios - iOS 的 AWS Cognito SMS 传输问题

html - 在 WPF 中更改 Web 浏览器背景颜色

wpf - 当项目不属于 ItemsSource 集合时,如何设置 ComboBox 的 SelectedItem?

ios - 我不明白为什么这个 @selector 不起作用

ios - AVPlayer:当视频和设备的宽高比不同时,为什么 iPhone 视频不会失真?

ios - iPhone 7 Plus - AVFoundation 双摄像头

arrays - 如何使类属性数组成为泛型类型的异构数组?

ios - 从 MPMediaQuery 获取用于 UITableView 的部分标题列表(数组)?

swift - 加入 bool 优化Swift

c++ - 如何从 C++ 中的十六进制颜色值获取 OpenCV HSV 值?