将 UI 图像更改为字符串数组
change an UI Image into a String array
我有一个仅由 4 种像素组成的 UIImage。
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)
(参考用于创建图像的代码)
我将图像保存在 phone 的照片库中,然后再次在我的应用程序中打开图像。我知道像素数是一样的
那么如何获取所有像素点的RGBA数据呢?
这里要做的第一件事是遍历图像并创建其中所有点的地图。
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)
}
}
}
一旦获得所需的颜色,它就会调用 UIColor
扩展中的 RGBA
函数来提供所需的字符串。
接下来,我们使用 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。如果是,它将 return 值为 1.0,否则它将 returns 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 类型的值。您还可以修改它以包含您需要的任何其他信息。
我有一个仅由 4 种像素组成的 UIImage。
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)
(参考用于创建图像的代码
我将图像保存在 phone 的照片库中,然后再次在我的应用程序中打开图像。我知道像素数是一样的
那么如何获取所有像素点的RGBA数据呢?
这里要做的第一件事是遍历图像并创建其中所有点的地图。
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)
}
}
}
一旦获得所需的颜色,它就会调用 UIColor
扩展中的 RGBA
函数来提供所需的字符串。
接下来,我们使用 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。如果是,它将 return 值为 1.0,否则它将 returns 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 类型的值。您还可以修改它以包含您需要的任何其他信息。