我试图用Swift获得UIImage中像素的 colored颜色 ,但它似乎总是返回0.下面是代码,翻译自@Minas在this线程上的答案:

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)
      }  
  }

这种方法会从图像的CG图像中选取像素 colored颜色 .因此,确保你从正确的图像中 Select .e、 g.如果你的UIImage是200x200,但是Imgaes的原始图像文件.xcassets或它来自的任何地方,都是400x400,你是在拾取点(100100),你实际上是在图像的左上角拾取点,而不是在中间.

两种解决方案:

//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、按比例上下zoom 以匹配UIImage.e、 g.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)) 

我只测试了第一种方法,我正在使用它从调色板中获得一种 colored颜色 .两者都应该有效.

Swift相关问答推荐

您可以在SwiftUI中将transformEffect与scrollTransition一起使用吗?

如何在SWIFT中使用DiscardingTaskGroup获得任务结果

为什么枚举上的.allCases.forEach不是循环(继续和中断不起作用)?

如何在应用程序区域永久更改 NSCursor?

如何使用Swift宏和@Observable和@Environment?

为什么这段Swift读写锁代码会导致死锁?

为什么我在我的 Swift iOS 应用程序项目中收到 Xcode 中的错误消息无法识别的 Select 器发送到类?

macOS 的窗口框架中使用的真实类型和真实类型是什么?

如何将视图添加到多行文本视图的末尾?

ConfirmationDialog取消swiftui中的错误

swiftui中服务端图片如何设计view并赋予rotationEffect?

iOS SwiftUI - 无法转换 ObservedObject 类型的值

在 RealityKit 中创建转场

用于 Swift 编码的 iOS 应用程序的 Ffmpeg

Swift 读写图片占用大量内存

在 Swift 中获取双精度的小数部分

将强制向下转换视为可选将永远不会产生零

如何使用 swift 将 Images.xcassets 中的图像加载到 UIImage 中

自定义 Google 登录按钮 - iOS

如何在 SwiftUI 中为删除和禁用配置 ContextMenu 按钮?