我正在使用一个过滤器应用程序,该应用需要将UIImage
分解为像素矩阵[[UIColor]]
本质上。
进行操作后,我需要将[[UIColor]]
转换回UIImage
,但找不到这样做的方法。
我唯一发现的是.setFill(color)
,它将整个图像设置为具有单一颜色。
有什么像.setData(color:[[UIColor]])
这样的东西吗?这是我过去从 UIImage
->转到颜色矩阵(在堆栈溢出中找到的...)
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)
}
}
关于如何转换的任何想法?
有点...
首先,您应该意识到UIImage
只是其他东西的包装器,很可能是CGImage
。UIColor
主要用于使用绘图命令时使用,因此您可以创建一个CGContext并绘制一系列的1x1px rects。这不是您想要的。
创建一个结构
您想创建一个结构以保持您的颜色值。
struct PixelData
{
var red: UInt8
var green: UInt8
var blue: UInt8
var alpha: UInt8
}
因此,通过拥有此结构,您具有一个非常简单的中间形式,然后一旦将这些数据塞入[Pixeldata],就可以很容易地将其写入CGimage。注意:这是具有宽度时间高度pixelsdata structs的1-d阵列,其中一行数据随后是另一个。