我正在尝试使用Swift来获取UIImage中像素的颜色,但它似乎总是返回0。这是从@Minas
对此线程的回答中转换的代码:
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])
var g = CGFloat(data[pixelInfo+1])
var b = CGFloat(data[pixelInfo+2])
var a = CGFloat(data[pixelInfo+3])
return UIColor(red: r, green: g, blue: b, alpha: a)
}
提前致谢!
由于遇到了类似的问题,一些搜索将我引到了这里。您的代码工作正常。该问题可能是由您的图像引起的。
码:
//On the top of your swift
extension UIImage {
func getPixelColor(pos: CGPoint) -> UIColor {
let pixelData = CGDataProviderCopyData(CGImageGetDataProvider(self.CGImage))
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]) / 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: r, green: g, blue: b, alpha: a)
}
}
发生的是此方法将从图像的CGImage中选择像素颜色。因此,请确保您选择的是正确的图像。例如,如果您的UIImage是200x200,但是来自Imgaes.xcassets或它来自何处的原始图像文件是400x400,并且您正在选取点(100,100),则实际上是在该图像的左上部分选取该点中。
两种解决方案: 1,使用来自Imgaes.xcassets的图像,并且在1x字段中仅放置一个@ 1x图像。将@ 2x,@
3x留空。确保您知道图像的大小,并选择一个在范围内的点。
//Make sure only 1x image is set
let image : UIImage = UIImage(named:"imageName")
//Make sure point is within the image
let color : UIColor = image.getPixelColor(CGPointMake(xValue, yValue))
2,按比例缩放CGPoint以匹配UIImage。例如let point = CGPoint(100,100)
在上面的例子中,
let xCoordinate : Float = Float(point.x) * (400.0/200.0)
let yCoordinate : Float = Float(point.y) * (400.0/200.0)
let newCoordinate : CGPoint = CGPointMake(CGFloat(xCoordinate), CGFloat(yCoordinate))
let image : UIImage = largeImage
let color : UIColor = image.getPixelColor(CGPointMake(xValue, yValue))
我只测试了第一种方法,并且正在使用它从调色板中获得颜色。两者都应该起作用。快乐编码:)
问题内容: 我最近试图将代码从这里转换为Swift。但是,无论图像如何,我都会保持白色。这是我的代码: 提前致谢。 问题答案: iOS 9中的CoreImage:使用CIAreaAverage过滤器并传递要平均的整个图像的范围。 另外,它既可以在GPU上运行,也可以作为高度优化的CPU CIKernel运行,因此速度更快。
我们正试图将规范化,以便将其正确传递到CoreML模型中。 我们从每个像素检索RGB值的方法是,首先初始化一个称为每个像素值的数组,这样就有了红色、绿色、蓝色和alpha值的位置。在bitmapInfo中,我们从原始UIimage本身获取原始像素值,并执行以下操作。这用于填充中的参数,这是一个变量。我们稍后将使用变量来a,这将在稍后将规范化的转换回。 使用嵌套的for循环在和坐标中迭代,可以找到所
我正在尝试将此java代码转换为python: 我在python中尝试过这个: 然而问题是我在python中得到不同的值。 为什么java返回负整数值,我如何在python中获得相同的结果?
问题内容: 对于给定的多色PNG (具有透明度),什么是最好的/快速惯用的方法: 创建一个副本 在副本中找到所有黑色像素并将其更改为红色 (返回修改后的副本) 关于SO有一些相关的问题,但我一直无法找到可行的方法。 问题答案: 您必须提取图像的像素缓冲区,然后可以循环浏览,并根据需要更改像素。最后,从缓冲区创建一个新图像。 在Swift 3中,这看起来像:
问题内容: 我一直在尝试找出如何在Swift中将rgb像素数据数组转换为UIImage。 我将每个像素的rgb数据保持在一个简单的结构中: 我已经实现了以下功能,但是生成的图像不正确: 关于如何正确地将rgb数组转换为UIImage的任何提示或指针? 问题答案: 注意: 这是iOS创建的解决方案。有关macOS和的解决方案,请参见此答案。 唯一的问题是结构中的数据类型需要为。我在Playgroun
问题内容: 如何从CVPixelBufferRef获取RGB(或任何其他格式)像素值?香港专业教育学院尝试了许多方法,但没有成功。 问题答案: 是不安全的可变指针,或更确切地说是。将指针转换为更特定的类型后,即可轻松访问内存: 确保使用正确的类型(8、16或32位unsigned int)。这取决于视频格式。最有可能是8位。 缓冲区格式的更新: 您可以在初始化实例时指定格式。您基本上可以选择: B