Изменить изображение пользовательского интерфейса в массив строк
У меня UIImage сделан только из 4 типов пикселей.
static let black = RGBA32(red: 0, green: 0, blue: 0, alpha: 255)
static let red = RGBA32(red: 255, green: 0, blue: 0, alpha: 255)
static let green = RGBA32(red: 0, green: 255, blue: 0, alpha: 255)
static let blue = RGBA32(red: 0, green: 0, blue: 255, alpha: 255)
(ссылка на код, использованный для создания изображения /questions/27733892/kak-sozdat-izobrazhenie-piksel-za-pikselem/27733900#27733900)
Я сохранил изображение в библиотеке фотографий телефона, а затем снова открыл изображение в своем приложении. Я знаю, что количество пикселей одинаково.
Итак, как я могу получить данные RGBA всех пикселей?
1 ответ
Первое, что здесь делается, - это пройтись по изображению и создать карту всех точек на нем.
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, которые вы ищете. Вы также можете изменить это, чтобы включить любую дополнительную информацию, которая вам нужна.