Swift 4:获取UIImage中像素的RGB值

时间:2018-05-31 12:08:30

标签: ios swift colors uicolor

我知道有很多关于如何在给定UIImage的{​​{1}}中获取像素颜色的帖子,但就我所知,它们都已经过时了。其中大多数都包含CGPointCGImageGetDataProvider,其中Swift 4中存在错误:

  

' CGImageGetDataProvider'已被财产取代?CGImage.dataProvider'   ' CGDataProviderCopyData'已被财产' CGDataProvider.data'

取代

Xcode建议这些替代品,但它们不存在,所以我一直无法尝试重新创建一个Swift 4函数来获取CGDataProviderCopyData中像素的颜色。

这是典型的Swift 3功能:

UIImage

非常感谢任何建议或意见。谢谢!

修改

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

我给函数的图像不是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) } } ,我已经检查了。

P.S。我用于该功能的图像是相机的快照。我有一个实时摄像头,在每一帧之后,调用此功能(如下所示),我将当前帧转换为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 } 值的原因?或者可能是另一种解决方案谢谢:))

1 个答案:

答案 0 :(得分:0)

以下是删除错误后获得的代码:

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)
    }
}