Swift で UIImage のピクセルの色を取得するにはどうすればよいですか? 質問する

Swift で UIImage のピクセルの色を取得するにはどうすればよいですか? 質問する

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

前もって感謝します!

ベストアンサー1

少し検索したところ、同様の問題に直面していたのでここにたどり着きました。コードは問題なく動作します。問題は画像から発生している可能性があります。

コード:

  //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) を選択した場合、実際には画像の中央ではなく、左上のセクションのポイントを選択していることになります。

2 つの解決策:
1. Imgaes.xcassets からの画像を使用し、1x フィールドに @1x 画像を 1 つだけ入力します。@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、UIImageと一致するようにCGPointの比率を拡大/縮小します。たとえば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)) 

私は最初の方法だけをテストしました。カラーパレットから色を取得するために使用しています。どちらも機能するはずです。コーディングを楽しんでください :)

おすすめ記事