Я знаю, что было много сообщений о том, как получить цвет пикселя в UIImage
при CGPoint
, но, насколько я могу судить, все они устарели.Большинство из них содержат 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
?Или может быть другое решение?Спасибо:)