Первое, что здесь нужно сделать, это просмотреть ваше изображение и создать карту всех точек на нем.
func getPixelColor(image: UIImage) {
let width = image.size.width
let height = image.size.height
for x in 0..<Int(width) {
for y in 0..<Int(height) {
let color = image.pixelColor(CGPoint(x: CGFloat(x), y: CGFloat(y)))
print(color.RGBA)
}
}
}
Получив желаемый цвет, он вызывает функцию RGBA
в расширении UIColor
, чтобы предоставить нужную строку.
Затем мы используем расширение UIImage
, чтобы затем взять точки, предоставленные вышеприведенной функцией, и запросить данные изображения для его данных UIColor
.
extension UIImage {
func pixelColor(_ point: CGPoint) -> UIColor {
let pixelData = cgImage?.dataProvider?.data
let pointerData: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelInfo = Int(((self.size.width * point.y) + point.x)) * 4
let maxValue: CGFloat = 255.0
let compare: CGFloat = 0.99
let r: CGFloat = (CGFloat(pointerData[pixelInfo]) / maxValue) > compare ? 1.0 : 0.0
let g: CGFloat = (CGFloat(pointerData[pixelInfo + 1]) / maxValue) > compare ? 1.0 : 0.0
let b: CGFloat = (CGFloat(pointerData[pixelInfo + 2]) / maxValue) > compare ? 1.0 : 0.0
let a = CGFloat(pointerData[pixelInfo + 3]) / maxValue
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}
Это расширение использует необработанные данные для определения значений RGB для каждого пикселя. Затем он выполняет грубую проверку, чтобы не рисковать с CGFloats, чтобы увидеть, равно ли значение 255,0 для этого конкретного цвета. Если это так, он вернет значение 1,0, в противном случае он вернет 0,0.
Далее, есть расширение для UIColor, которое предоставит форматированную строку, которую вы ищете.
extension UIColor {
var RGBA: String {
guard let components = cgColor.components, components.count == 4 else {
return ""
}
return "\(components[0])-\(components[1])-\(components[2])-\(components[3])"
}
}
Это должно предоставить значения типа 1-0-0-1, которые вы ищете. Вы также можете изменить это, чтобы включить любую дополнительную информацию, которая вам нужна.
person
CodeBender
schedule
11.12.2016