2016-10-20 1 views
3

Я пробовал разные решения (например, this one), но цвет, который я получаю, выглядит немного иначе, чем в реальном изображении. Я думаю, это потому, что изображение только RGB, а не RGBA. Может быть, это проблема?Swift 3: получить цвет пикселя в UIImage (лучше: UIImageView)

Связанная проблема: если UIImage имеет contentMode = .scaleAspectFill, мне нужно сделать пересчет изображения, или я могу просто использовать imageView.image?

EDIT:

Я пытался с этим расширением:

extension CALayer { 
    func getPixelColor(point: CGPoint) -> CGColor { 
     var pixel: [CUnsignedChar] = [0, 0, 0, 0] 

     let colorSpace = CGColorSpaceCreateDeviceRGB() 
     let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue) 

     let context = CGContext(data: &pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue) 

     context!.translateBy(x: -point.x, y: -point.y) 

     self.render(in: context!) 

     let red: CGFloat = CGFloat(pixel[0])/255.0 
     let green: CGFloat = CGFloat(pixel[1])/255.0 
     let blue: CGFloat = CGFloat(pixel[2])/255.0 
     let alpha: CGFloat = CGFloat(pixel[3])/255.0 


     let color = UIColor(red:red, green: green, blue:blue, alpha:alpha) 

     return color.cgColor 
    } 
} 

но для некоторых изображений это кажется, как будто система координат поворачивается вокруг, для других я получаю действительно неправильные значения ... Что я Мне здесь не хватает?

EDIT 2:

Я стараюсь с этими изображениями:

https://dl.dropboxusercontent.com/u/119600/gradient.png https://dl.dropboxusercontent.com/u/119600/[email protected]

, но я получаю неправильные значения. Они встроены в UIImageView но преобразовать координаты:

private func convertScreenPointToImage(point: CGPoint) -> CGPoint { 
    let widthMultiplier = gradientImage.size.width/UIScreen.main.bounds.width 
    let heightMultiplier = gradientImage.size.height/UIScreen.main.bounds.height 

    return CGPoint(x: point.x * widthMultiplier, y: point.y * heightMultiplier) 
} 

Это один

enter image description here

дает мне === Optional((51, 76, 184, 255)) при работе на iPhone 7 тренажере, который не является правильным ...

ответ

3

Я написал, что это детская площадка. Я индексировать в данные изображения с указателем и захватить значения RGBA:

func pixel(in image: UIImage, at point: CGPoint) -> (UInt8, UInt8, UInt8, UInt8)? { 
    let width = Int(image.size.width) 
    let height = Int(image.size.height) 
    let x = Int(point.x) 
    let y = Int(point.y) 
    guard x < width && y < height else { 
     return nil 
    } 
    guard let cfData:CFData = image.cgImage?.dataProvider?.data, let pointer = CFDataGetBytePtr(cfData) else { 
     return nil 
    } 
    let bytesPerPixel = 4 
    let offset = (x + y * width) * bytesPerPixel 
    return (pointer[offset], pointer[offset + 1], pointer[offset + 2], pointer[offset + 3]) 
} 

let image = UIImage(named: "t.png")! 
if let (r,g,b,a) = pixel(in: image, at: CGPoint(x: 1, y:2)) { 
    print ("Red: \(r), Green: \(g), Blue: \(b), Alpha: \(a)") 
} 

Обратите внимание, что если вы используете это на UIImage, что является свойством UIImageView координаты пикселя те фактического изображения в оригинале а не координаты экрана масштабированного UIImageView. Также он попытался использовать RGB Jpg и RGBA PNG, и оба они импортируются как 32-битные изображения RGBA, поэтому он работает для обоих.

+0

Я не могу заставить его работать правильно, я все равно получаю неправильные значения :(Пожалуйста, см. Мое редактирование – swalkner

+0

Код верный, я только что проверил его с вашим первым изображением. Я открыл фотошоп, переключился на инструмент пипетки и открыл палитру информации.Я наведите указатель мыши на пиксель при x = 120, y = 500 и фотошоп говорит r: 175 g: 146 b 232. Я запускаю код на игровой площадке, и я получаю Red 175, Green: 146, Blue: 232, Альфа: 255. Каковы ваши входы и каковы ваши ожидаемые результаты? –

+0

Я получаю разные значения (см. Мое редактирование) - как вы загружаете изображение? – swalkner

 Смежные вопросы

  • Нет связанных вопросов^_^