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