Saltar al contenido

¿Cómo obtengo el color de un píxel en una UIImage con Swift?

Esta crónica fue probado por especialistas así aseguramos la exactitud de nuestra esta noticia.

Solución:

Un poco de búsqueda me lleva aquí ya que estaba enfrentando un problema similar. Tu código funciona bien. El problema podría surgir de su imagen.

Código:

  //On the top of your swift 
  extension UIImage 
      func getPixelColor(pos: CGPoint) -> UIColor 

          let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
          let data: UnsafePointer = CFDataGetBytePtr(pixelData)

          let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

          let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
          let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
          let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
          let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)

          return UIColor(red: r, green: g, blue: b, alpha: a)
        
  

Lo que sucede es que este método seleccionará el color del píxel de la CGImage de la imagen. Así que asegúrese de elegir la imagen correcta. por ejemplo, si su UIImage es 200×200, pero el archivo de imagen original de Imgaes.xcassets o de donde sea que provenga, es 400×400, y está seleccionando el punto (100,100), en realidad está seleccionando el punto en la sección superior izquierda de la imagen, en lugar de medio

Dos soluciones:
1, use la imagen de Imgaes.xcassets y solo coloque una imagen @1x en el campo 1x. Deje @2x, @3x en blanco. Asegúrese de conocer el tamaño de la imagen y elija un punto que esté dentro del rango.

//Make sure only 1x image is set
let image : UIImage = UIImage(named:"imageName") 
//Make sure point is within the image
let color : UIColor = image.getPixelColor(CGPointMake(xValue, yValue)) 

2, Escale su CGPoint hacia arriba o hacia abajo en la proporción para que coincida con la UIImage. p.ej let point = CGPoint(100,100) en el ejemplo anterior,

let xCoordinate : Float = Float(point.x) * (400.0/200.0)
let yCoordinate : Float = Float(point.y) * (400.0/200.0) 
let newCoordinate : CGPoint = CGPointMake(CGFloat(xCoordinate), CGFloat(yCoordinate))
let image : UIImage = largeImage
let color : UIColor = image.getPixelColor(CGPointMake(xValue, yValue)) 

Solo probé el primer método y lo estoy usando para obtener un color de una paleta de colores. Ambos deberían funcionar. Feliz codificación 🙂

SWIFT 3, XCODE 8 Probado y funcionando

extension UIImage 
    func getPixelColor(pos: CGPoint) -> UIColor 

        let pixelData = self.cgImage!.dataProvider!.data
        let data: UnsafePointer = CFDataGetBytePtr(pixelData)

        let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

        let r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
        let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
        let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
        let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)

        return UIColor(red: r, green: g, blue: b, alpha: a)
    


Si está llamando a la pregunta respondida más de una vez, entonces no debe usar la función en cada píxel, porque está recreando el mismo conjunto de datos. Si desea todos los colores en una imagen, haga algo más como esto:

func findColors(_ image: UIImage) -> [UIColor] 
    let pixelsWide = Int(image.size.width)
    let pixelsHigh = Int(image.size.height)

    guard let pixelData = image.cgImage?.dataProvider?.data else  return [] 
    let data: UnsafePointer = CFDataGetBytePtr(pixelData)

    var imageColors: [UIColor] = []
    for x in 0..

Aquí hay un proyecto de ejemplo

Como nota al margen, esta función es significativamente más rápida que la respuesta aceptada, pero da un resultado menos definido. Solo puse UIImageView en el parámetro sourceView.

func getPixelColorAtPoint(point: CGPoint, sourceView: UIView) -> UIColor 
    let pixel = UnsafeMutablePointer.allocate(capacity: 4)
    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)

    sourceView.layer.render(in: context!)
    let color: UIColor = UIColor(red: CGFloat(pixel[0])/255.0,
                                 green: CGFloat(pixel[1])/255.0,
                                 blue: CGFloat(pixel[2])/255.0,
                                 alpha: CGFloat(pixel[3])/255.0)
    pixel.deallocate(capacity: 4)
    return color

Reseñas y valoraciones del tutorial

Acuérdate de que puedes optar por la opción de valorar este tutorial si diste con la solución.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *