Код Swift, основанный на ответе Минаса. Я расширил UIImage, чтобы сделать его доступным везде, и добавил простую логику, чтобы угадать формат изображения на основе шага пикселя (1, 3 или 4)
Swift 3:
public extension UIImage {
func getPixelColor(point: CGPoint) -> UIColor {
guard let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage)) else {
return UIColor.clearColor()
}
let data = CFDataGetBytePtr(pixelData)
let x = Int(point.x)
let y = Int(point.y)
let index = Int(self.size.width) * y + x
let expectedLengthA = Int(self.size.width * self.size.height)
let expectedLengthGrayScale = 2 * expectedLengthA
let expectedLengthRGB = 3 * expectedLengthA
let expectedLengthRGBA = 4 * expectedLengthA
let numBytes = CFDataGetLength(pixelData)
switch numBytes {
case expectedLengthA:
return UIColor(red: 0, green: 0, blue: 0, alpha: CGFloat(data[index])/255.0)
case expectedLengthGrayScale:
return UIColor(white: CGFloat(data[2 * index]) / 255.0, alpha: CGFloat(data[2 * index + 1]) / 255.0)
case expectedLengthRGB:
return UIColor(red: CGFloat(data[3*index])/255.0, green: CGFloat(data[3*index+1])/255.0, blue: CGFloat(data[3*index+2])/255.0, alpha: 1.0)
case expectedLengthRGBA:
return UIColor(red: CGFloat(data[4*index])/255.0, green: CGFloat(data[4*index+1])/255.0, blue: CGFloat(data[4*index+2])/255.0, alpha: CGFloat(data[4*index+3])/255.0)
default:
// unsupported format
return UIColor.clearColor()
}
}
}
Обновлено для Swift 4:
func getPixelColor(_ image:UIImage, _ point: CGPoint) -> UIColor {
let cgImage : CGImage = image.cgImage!
guard let pixelData = CGDataProvider(data: (cgImage.dataProvider?.data)!)?.data else {
return UIColor.clear
}
let data = CFDataGetBytePtr(pixelData)!
let x = Int(point.x)
let y = Int(point.y)
let index = Int(image.size.width) * y + x
let expectedLengthA = Int(image.size.width * image.size.height)
let expectedLengthGrayScale = 2 * expectedLengthA
let expectedLengthRGB = 3 * expectedLengthA
let expectedLengthRGBA = 4 * expectedLengthA
let numBytes = CFDataGetLength(pixelData)
switch numBytes {
case expectedLengthA:
return UIColor(red: 0, green: 0, blue: 0, alpha: CGFloat(data[index])/255.0)
case expectedLengthGrayScale:
return UIColor(white: CGFloat(data[2 * index]) / 255.0, alpha: CGFloat(data[2 * index + 1]) / 255.0)
case expectedLengthRGB:
return UIColor(red: CGFloat(data[3*index])/255.0, green: CGFloat(data[3*index+1])/255.0, blue: CGFloat(data[3*index+2])/255.0, alpha: 1.0)
case expectedLengthRGBA:
return UIColor(red: CGFloat(data[4*index])/255.0, green: CGFloat(data[4*index+1])/255.0, blue: CGFloat(data[4*index+2])/255.0, alpha: CGFloat(data[4*index+3])/255.0)
default:
// unsupported format
return UIColor.clear
}
}