2017-01-23 1 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 

변경 이름과 전환을 int로 광고 일부 CGFloat이가 : 코드의 라인에 따라서

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 –

관련 문제