Я использую функцию getPixelColor (распечатанную ниже) для извлечения всех данных пикселей из CGImage:
extension CGImage{
func getPixelColor(pos: CGPoint) -> UIColor {
let pixelData = self.dataProvider!.data
let data: UnsafePointer<UInt8> = CFDataGetBytePtr(pixelData)
let pixelInfo: Int = ((Int(self.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)
}
}
Затем я усредняю значения пикселей R, G, B для расчета интенсивности. Я помещаю каждое значение интенсивности в двумерный массив с размерами imageWidth x imageHeight. Затем эти значения интенсивности проверяются на соответствие определенному порогу и соответственно им присваивается либо ноль, либо единица.
extension UIColor {
var coreImageColor: CIColor {
return CIColor(color: self)
}
var components: (red: CGFloat, green: CGFloat, blue: CGFloat, alpha: CGFloat) {
let color = coreImageColor
return (color.red, color.green, color.blue, color.alpha)
}
}
var intensityArray: [[Float]] = Array(repeating: Array(repeating: 0, count: width), count: height)
//fill intensity array with a nested for loop
for index1 in 0...height-1{ //make sure height-1 is here always
for index2 in 0...width-1{ //(width-1) has to goes here because the last place in the array is the size-1
let cgPoint = CGPoint(x: CGFloat(index2), y: CGFloat(index1)) //get an "index out of range error at 250 times
let color = cgImage?.getPixelColor(pos: cgPoint)
let CIcolor = color?.coreImageColor
let greencomponent = Float((color?.components.green)!)
let redcomponent = Float((color?.components.red)!)
let bluecomponent = Float((color?.components.blue)!)
let alphacomponent = Float((color?.components.alpha)!)
var intensity = (greencomponent+redcomponent+bluecomponent)/3
if intensity > 0.9 {
intensity = 1
} else {
intensity = 0
}
intensityArray[index1][index2] = intensity
}
}
С изображениями размером более 100x100 этот процесс занимает очень много времени, поэтому мне было интересно, есть ли более простой способ получить данные о пикселях изображения в двоичном формате.