2017-01-23 4 views
0

下記のgetPixelColor関数を使用して1ピクセルの色を取得しています。しかし、正確なピクセルが渡されたCGPointからアクセスされているかどうかは不明です。 CGImageの「起源」をどこで見ることができますか?左上?左下?私は実際に私の画像を取得しているピクセルの色に意味をなさない。すぐにピクセルデータを抽出するときにCGImageを視覚化する方法

extension CGImage { 
    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) 
    } 

}

私は混乱がライン内にあると思う:

let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4

私はデータがこのInt値を経由してアクセスする方法については不明です。

ありがとうございます!

答えて

0

ピクセルは32ビット、4バイト(RGBAの順)です。それらは行ごとに並べられています。したがって、ピクセルの行を取得するには、行* rowWidthInBytesでポインタを進めます。 rowWidthInBytesは幅だけで、numberOfBytesPerPixel(4)を乗じたものです。列を取得するには、yOffset * numberOfBytesPerPixelを追加するだけです。 、でしょう

let pixelInfo: Int = ((Int(self.size.width) * Int(pos.y)) + Int(pos.x)) * 4 
+0

だから、そのコード行に:変換をintに

pixelOffset = row * (width * numberOfBytesPerPixel) + yOffset * numberOfBytesPerPixel pixelOffset = (row * width + yOffset) * numberOfBytesPerPixel pixelOffset = (width * row + yOffset) * numberOfBytesPerPixel 

変更の名前と広告いくつかCGFloatをし、これがある:再配置

pixelOffset = row * rowWidthInBytes + yOffset * numberOfBytesPerPixel 

:方程式は次のようになります位置(0,0)は画像の左下に対応するか? –

+0

は残念なことに画像の向きに依存します。歴史的な理由から、QuartzはデカルトであるMac OS座標系を使用しています。 iOSでは、正のYは下を指すので、-Yでスケーリングされるか、またはx軸に関して反映されます。これにより、cgMethodsを使用するときに画像が上下逆さまに表示されることがあります。 UIImageはその向きを知っており、描画するときにそれに従って回転します。 https://developer.apple.com/reference/uikit/uiimage/1624141-imageorientation –

関連する問題