Swift 4: получить RGB-значения пикселей в UIImage - PullRequest
0 голосов
/ 31 мая 2018

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

1 Ответ

0 голосов
/ 31 мая 2018

Вот код, который я получаю после устранения ошибок:

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