[英]Swift 4: Get RGB values of pixel in UIImage
我知道有很多關於如何在給定CGPoint
如何獲取UIImage
像素的顏色的文章,但據我所知,它們都已經過時了。 其中大多數包含CGImageGetDataProvider
和CGDataProviderCopyData
,在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.