Swift Цветовое пространство отличается на iPhone 5 по сравнению с iPhone 5s или 5se
Я нажимаю на изображение, чтобы вернуть цвет пикселя. Это прекрасно работает, но я обнаружил, что это не работает на iPhone 5. Он работает на iPhone 5s, 5SE и всех других размеров. Я не понимаю почему. Следующий код дает красный и синий, как Nan на iPhone 5.
// returns the color data of the pixel at the currently selected point
func getPixelColorAtPoint(_ point:CGPoint)-> UIColor{
let pixel = UnsafeMutablePointer<CGFloat>.allocate(capacity: 4)
let colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(rawValue: CGImageAlphaInfo.premultipliedLast.rawValue)
if let context = CGContext(data: pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: colorSpace, bitmapInfo: bitmapInfo.rawValue){
context.translateBy(x: -point.x, y: -point.y)
torsoImage.layer.render(in: context)
}
let pColor:UIColor = UIColor(red: CGFloat(pixel[0])/255.0, green: CGFloat(pixel[1])/255.0, blue: CGFloat(pixel[2])/255.0, alpha: CGFloat(pixel[3])/255.0)
pixel.deallocate(capacity: 4)
print("Colour touch is \(pColor)")
return pColor
}
//Colour touch is UIExtendedSRGBColorSpace nan 1.94443e+12 nan 1.48678e-42
1 ответ
Решение
CGContext(data: pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, ...)
создает графический контекст, который поддерживается четырьмя байтами (по одному для каждого компонента цвета), поэтому вы должны передать массив UInt8
:
let pixel = UnsafeMutablePointer<UInt8>.allocate(capacity: 4)
Что происходит в вашем случае, так это то, что только первые 4 байта первого CGFloat
будет установлен, все остальные данные не определены (и может привести к nan
или какое-то произвольное значение). Даже если ты не получишьnan
, значения будут неправильными.