Image 使用Swift 3中的CGPoint从图像中获取像素颜色
我在Swift 3中尝试这个像素提取器类,得到一个错误; 无法使用类型为“”的参数列表调用类型为“”的UnsafePointer“”的初始值设定项 获取其他错误;'类型“UnsafeRawPointer?”没有下标成员Image 使用Swift 3中的CGPoint从图像中获取像素颜色,image,pixel,swift3,cgpoint,Image,Pixel,Swift3,Cgpoint,我在Swift 3中尝试这个像素提取器类,得到一个错误; 无法使用类型为“”的参数列表调用类型为“”的UnsafePointer“”的初始值设定项 获取其他错误;'类型“UnsafeRawPointer?”没有下标成员 如何修改此错误?以下部分摘自一些Swift 3代码,我正在使用这些代码对图像中的像素进行采样,以获得我用于生成tableView行背景的主要色调。色调选择过程的机制不适用于您的问题,因此我只提供相关片段 let colorSpace = CGColorSpaceCreateDev
如何修改此错误?以下部分摘自一些Swift 3代码,我正在使用这些代码对图像中的像素进行采样,以获得我用于生成tableView行背景的主要色调。色调选择过程的机制不适用于您的问题,因此我只提供相关片段
let colorSpace = CGColorSpaceCreateDeviceRGB() // UIExtendedSRGBColorSpace
let newImage = image.cgImage?.copy(colorSpace: colorSpace)
let pixelData = newImage?.dataProvider!.data
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
var hueFrequency = [Int: Double]()
hueFrequency[1] = 1 // Add one entry so this serves as a default if no hues from the image pass the filters
let nStart = 1
let mStart = 1
for n in nStart...Int(image.size.width / samplingFactor) {
for m in mStart...Int(image.size.height / samplingFactor) {
let pixelInfo: Int = ((Int(image.size.width) * m * Int(samplingFactor)) + n * Int(samplingFactor)) * 4 // bytesPerPixel
let b = CGFloat(data[pixelInfo]) / CGFloat(255.0) // cgImage bitmapinfo = rawValue 8194 -> BGRA ordering
let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
let r = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
let colorSpace=CGColorSpaceCreateDeviceRGB()//UIExtendedSRGBColorSpace
让newImage=image.cgImage?.copy(颜色空间:颜色空间)
设pixelData=newImage?.dataProvider!。数据
let data:UnsafePointer=CFDataGetBytePtr(像素数据)
var HuefFrequency=[Int:Double]()
HuefFrequency[1]=1//添加一个条目,以便在图像中没有任何色调通过过滤器时,将其作为默认项
设nStart=1
设mStart=1
对于n,在nStart中…Int(image.size.width/samplingFactor){
对于m,单位为mStart…Int(image.size.height/samplingFactor){
设pixelInfo:Int=((Int(image.size.width)*m*Int(samplingFactor))+n*Int(samplingFactor))*4//bytesperpoixel
设b=CGFloat(data[pixelInfo])/CGFloat(255.0)//cgimabitmapinfo=rawValue 8194->BGRA排序
设g=CGFloat(数据[pixelInfo+1])/CGFloat(255.0)
设r=CGFloat(数据[pixelInfo+2])/CGFloat(255.0)
设a=CGFloat(数据[pixelInfo+3])/CGFloat(255.0)
另外,请注意,我找到了bitmapInfo值(image.cgImage!.bitmapInfo使用我的参数)指示将RGBA序列重新排序到BGRA,我必须在排序步骤中处理这一点,以选择数据。如果您的颜色不正确,您可能需要检查这一点。当您的
数据中有一个UnsafeRawPointer
时,您可以这样写:
let alpha = data.load(fromByteOffset: offset, as: UInt8.self)
let red = data.load(fromByteOffset: offset+1, as: UInt8.self)
let green = data.load(fromByteOffset: offset+2, as: UInt8.self)
let blue = data.load(fromByteOffset: offset+3, as: UInt8.self)
或者,您可以从uncastedData
获取UnsafeMutableRawPointer
(假设它是UnsafeMutableRawPointer
):
SWIFT 3(2017年3月更新)Xcode 8/IOS 10
重要提示:请注意,返回值与向后存储的数据中的红色:b、绿色:r和蓝色:r相对应
- 首先,创建扩展(您可以复制并粘贴到
代码)
虽然代码返回的是不精确的颜色,但对于不同的CGP点,似乎没有返回正确的颜色
可能是因为屏幕分辨率(x1,x2,x3)
如果有人能为这个谜团添加一些线索,那就太好了。Swift-3(IOS 10.3)
位置是一个CG点
size是图像视图的大小
虽然我仍然有视网膜显示的问题,但我发现这篇文章可能会对某人有所帮助:我只是想知道,UIImage的点使用什么坐标系?是UIKit吗?例如,点(0,0)在左上角?谢谢!
let data = UnsafeRawPointer(uncastedData)
let colorSpace = CGColorSpaceCreateDeviceRGB() // UIExtendedSRGBColorSpace
let newImage = image.cgImage?.copy(colorSpace: colorSpace)
let pixelData = newImage?.dataProvider!.data
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
var hueFrequency = [Int: Double]()
hueFrequency[1] = 1 // Add one entry so this serves as a default if no hues from the image pass the filters
let nStart = 1
let mStart = 1
for n in nStart...Int(image.size.width / samplingFactor) {
for m in mStart...Int(image.size.height / samplingFactor) {
let pixelInfo: Int = ((Int(image.size.width) * m * Int(samplingFactor)) + n * Int(samplingFactor)) * 4 // bytesPerPixel
let b = CGFloat(data[pixelInfo]) / CGFloat(255.0) // cgImage bitmapinfo = rawValue 8194 -> BGRA ordering
let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
let r = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
let alpha = data.load(fromByteOffset: offset, as: UInt8.self)
let red = data.load(fromByteOffset: offset+1, as: UInt8.self)
let green = data.load(fromByteOffset: offset+2, as: UInt8.self)
let blue = data.load(fromByteOffset: offset+3, as: UInt8.self)
let data = uncastedData.assumingMemoryBound(to: UInt8.self)
extension UIImage {
func getPixelColor(pos: CGPoint) -> UIColor {
if let pixelData = self.cgImage?.dataProvider?.data {
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4
let r = CGFloat(data[pixelInfo+0]) / CGFloat(255.0)
let g = CGFloat(data[pixelInfo+1]) / CGFloat(255.0)
let b = CGFloat(data[pixelInfo+2]) / CGFloat(255.0)
let a = CGFloat(data[pixelInfo+3]) / CGFloat(255.0)
return UIColor(red: b, green: g, blue: r, alpha: a)
} else {
//IF something is wrong I returned WHITE, but change as needed
return UIColor.white
}
}
}
let colorAtPixel : UIColor = (theView.image?.getPixelColor(pos: CGPoint(x: 2, y: 2)))!
extension UIImage {
func getPixelColor(atLocation location: CGPoint, withFrameSize size: CGSize) -> UIColor {
let x: CGFloat = (self.size.width) * location.x / size.width
let y: CGFloat = (self.size.height) * location.y / size.height
let pixelPoint: CGPoint = CGPoint(x: x, y: y)
let pixelData = self.cgImage!.dataProvider!.data
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelIndex: Int = ((Int(self.size.width) * Int(pixelPoint.y)) + Int(pixelPoint.x)) * 4
let r = CGFloat(data[pixelIndex]) / CGFloat(255.0)
let g = CGFloat(data[pixelIndex+1]) / CGFloat(255.0)
let b = CGFloat(data[pixelIndex+2]) / CGFloat(255.0)
let a = CGFloat(data[pixelIndex+3]) / CGFloat(255.0)
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}
let color = yourImageView.image!.getPixelColor(atLocation: location, withFrameSize: yourImageView.frame.size)