2017-01-23 21 views
0

Я получаю цвет одного пикселя, используя функцию getPixelColor ниже. Тем не менее, я не знаю, к какому точному пикселю обращаются от пройденного CGPoint. Где я могу посмотреть «происхождение» CGImage? Верхний левый? Нижний левый? Ничто действительно не имеет смысла с пиксельными цветами, которые я получаю с моими изображениями.Как визуализировать CGImage при извлечении пиксельных данных в swift

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. СтрокаWidthInBytes - это просто ширина, умноженная на числоOfBytesPerPixel (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

зависит, к сожалению, цветовая схема изображения. по историческим причинам Кварц использует систему координат Mac OS, которая является декартовой. В iOS положительный Y указывает вниз, поэтому его масштабируется на -Y или отражается относительно оси x. Иногда это может привести к тому, что изображение будет отображаться с ног на голову при использовании cgMethods. UIImage знает свою ориентацию и будет вращаться соответственно при рисовании. https://developer.apple.com/reference/uikit/uiimage/1624141-imageorientation –

 Смежные вопросы

  • Нет связанных вопросов^_^