将[[UIColor]] double数组转换为UIImage

时间:2015-05-03 18:42:04

标签: swift uiimage uicolor

我正在开发一个过滤器应用,它需要将UIImage分解为像素矩阵[[UIColor]]

执行操作后,我需要将[[UIColor]]转换回UIImage,但我找不到这样做的方法。

我唯一能找到的是.setFill(color),它将整个图像设置为单一颜色。

是否有类似.setData(color:[[UIColor]])的内容?这就是我过去常常从UIImage - >到一个颜色矩阵(在Stack Overflow中找到它...)

extension UIImage {
    func getPixelColor(pos: CGPoint) -> UIColor {

        var pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
        var data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)

        var pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

        var r = CGFloat(data[pixelInfo]) / CGFloat(255.0)
        var g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
        var b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
        var a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)

        return UIColor(red: r, green: g, blue: b, alpha: a)
    }
}

有关如何将其转换回来的任何想法?

1 个答案:

答案 0 :(得分:-1)

排序......

首先,您应该知道UIImage只是其他内容的包装器,很可能是CGImageUIColor主要用于使用绘图命令,因此您可以创建CGContext并绘制一系列1x1px rects。这不是你想要的。

创建结构

您想要创建一个结构来保存颜色值。

struct PixelData 
{
    var red: UInt8
    var green: UInt8
    var blue: UInt8
    var alpha: UInt8
}

因此,通过使用这个结构,您可以获得一个非常简单的中间形式,然后一旦将这些数据填充到[PixelData]中,就可以很容易地将其写入CGImage。注意:这是一维数组,宽度乘以高度PixelsData结构,一行数据后跟另一行。