Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Image 使用Swift 3中的CGPoint从图像中获取像素颜色_Image_Pixel_Swift3_Cgpoint - Fatal编程技术网

Image 使用Swift 3中的CGPoint从图像中获取像素颜色

Image 使用Swift 3中的CGPoint从图像中获取像素颜色,image,pixel,swift3,cgpoint,Image,Pixel,Swift3,Cgpoint,我在Swift 3中尝试这个像素提取器类,得到一个错误; 无法使用类型为“”的参数列表调用类型为“”的UnsafePointer“”的初始值设定项 获取其他错误;'类型“UnsafeRawPointer?”没有下标成员 如何修改此错误?以下部分摘自一些Swift 3代码,我正在使用这些代码对图像中的像素进行采样,以获得我用于生成tableView行背景的主要色调。色调选择过程的机制不适用于您的问题,因此我只提供相关片段 let colorSpace = CGColorSpaceCreateDev

我在Swift 3中尝试这个像素提取器类,得到一个错误; 无法使用类型为“”的参数列表调用类型为“”的UnsafePointer“”的初始值设定项

获取其他错误;'类型“UnsafeRawPointer?”没有下标成员


如何修改此错误?

以下部分摘自一些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)