Я использую это расширение, чтобы получить цвет пикселя:
extension UIImage {
subscript (x: Int, y: Int) -> UIColor? {
guard x >= 0 && x < Int(size.width) && y >= 0 && y < Int(size.height),
let cgImage = cgImage,
let provider = cgImage.dataProvider,
let providerData = provider.data,
let data = CFDataGetBytePtr(providerData) else {
return nil
}
let numberOfComponents = 4
let pixelData = ((Int(size.width) * y) + x) * numberOfComponents
let r = CGFloat(data[pixelData]) / 255.0
let g = CGFloat(data[pixelData + 1]) / 255.0
let b = CGFloat(data[pixelData + 2]) / 255.0
let a = CGFloat(data[pixelData + 3]) / 255.0
return UIColor(red: r, green: g, blue: b, alpha: a)
}
}
Все работает нормально, когда я бегу, используя игровую площадку или симулятор, но когда я запускаю его на своем устройстве (iPhone XR) Я получил разные значения.
После некоторой отладки я обнаружил, что при использовании симулятора cgimage имеет alphaInfo kCGImageAlphaLast , а при использовании устройства alphaInfo составляет kCGImageAlphaNoneSkipLast
Отладка:
// Simulator
<CGImage 0x7f9f674150f0> (IP)
<<CGColorSpace 0x600002893120> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
width = 1000, height = 500, bpc = 8, bpp = 32, row bytes = 4000
kCGImageAlphaLast | 0 (default byte order) | kCGImagePixelFormatPacked
is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? Yes
// -------------------------------------------- //
// Device
<CGImage 0x7f88df70d980> (DP)
<<CGColorSpace 0x6000003dc540> (kCGColorSpaceICCBased; kCGColorSpaceModelRGB; sRGB IEC61966-2.1)>
width = 1000, height = 500, bpc = 8, bpp = 32, row bytes = 4000
kCGImageAlphaNoneSkipLast | 0 (default byte order) | kCGImagePixelFormatPacked
is mask? No, has masking color? No, has soft mask? No, has matte? No, should interpolate? Yes
Поскольку alphaInfo является свойством только для чтения, есть ли способ установить его или воссоздать установку alphaValue на kCGImageAlphaLast
.
Я обнаружил, что умножает значение цвета на альфа-значение, но меня немного смущает, как "восстановить" "правильное" значение.
https://developer.apple.com/documentation/coregraphics/cgimagealphainfo/kcgimagealphapremultipliedlast