将UI Image更改为String数组

时间:2016-12-11 12:53:27

标签: ios swift uiimage swift3 rgba

我的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)

(参考用于创建图像的代码https://stackoverflow.com/a/40207142/7010252

我将图片保存在手机的照片库中,然后我再次在我的应用中打开图片。我知道像素数是一样的。

那么如何获得所有像素的RGBA数据?

1 个答案:

答案 0 :(得分: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类型的值。您也可以修改它以包含您需要的任何其他信息。