【问题标题】:change an UI Image into a String array将 UI 图像更改为字符串数组
【发布时间】:2016-12-11 12:53:27
【问题描述】:

我有一个仅由 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)

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

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

那么我怎样才能得到所有像素的RGBA数据呢?

【问题讨论】:

    标签: ios swift uiimage swift3 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)
            }
        }
    }
    

    一旦它有了它想要的颜色,它就会调用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。如果是,则返回值 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 类型的值。您还可以对其进行修改以包含您需要的任何其他信息。

    【讨论】:

    • 但是当我使用该代码时出现问题。我应该得到(rgba)1-0-0-1(红色)/0-1-0-1(绿色)/0-0-1-1(蓝色)/0-0-0-1(黑色)但我得到双倍,例如:(rgba)0.6787878 - 0.823345 - 0.34522 - 1
    • 已更新以解决您的问题。希望能解决它。
    • 不行,我总是得到“0.0-0.0-0.0-1.0”。这意味着像素是黑色的,但实际上图片不是黑色的。你知道我需要如何修复它吗? @CodeBender
    • 它不是:让 r: CGFloat = (CGFloat(pointerData[pixelInfo]) / maxValue) > 254.9 ? 1.0 : 0.0
    • 它是:让 r: CGFloat = (CGFloat(pointerData[pixelInfo]) / maxValue) > 0.9 ? 1.0 : 0.0
    猜你喜欢
    • 2018-07-04
    • 2013-11-23
    • 1970-01-01
    • 1970-01-01
    • 2021-08-26
    • 1970-01-01
    • 2021-10-20
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多