簡體   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