繁体   English   中英

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

[英]Swift 4: Get RGB values of pixel in UIImage

我知道有很多关于如何在给定CGPoint如何获取UIImage像素的颜色的文章,但据我所知,它们都已经过时了。 其中大多数包含CGImageGetDataProviderCGDataProviderCopyData ,在Swift 4中是错误的:

“ CGImageGetDataProvider”已替换为属性“ CGImage.dataProvider”“ CGDataProviderCopyData”已替换为属性“ 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 ,我已经检查过了。


PS我用于该功能的图像是相机的快照。 我有一个实时摄像头,每帧之后,都会调用此函数(如下),将当前帧转换为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)
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM