2017-01-23 72 views
0

我使用下面的getPixelColor函數獲取一個像素的顏色。但是,我不清楚從傳遞的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。該公式是這樣的:

pixelOffset = row * rowWidthInBytes + yOffset * numberOfBytesPerPixel 

清理:

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

更改名稱和廣告一些CGFloat的對INT的轉換,這就是:

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

因此,在該行的代碼,會位置(0,0)對應於圖像的左下角? –

+0

不幸的是取決於圖像的方向。由於歷史原因,Quartz使用笛卡爾的Mac OS座標系。在iOS中,正Y指向下,所以它由-Y縮放或反映在x軸上。這有時會導致圖像在使用cgMethods時顛倒。 UIImage知道它的方向,並在繪圖時相應地旋轉。 https://developer.apple.com/reference/uikit/uiimage/1624141-imageorientation –