Получить цвет пикселей в точке в Swift
Я нашел пример кода Objective C, который получает цвет пикселя в точке здесь: Как получить цвет пикселя на ощупь?
Конкретный раздел кода, с которым мне нужна помощь, - это где контекст создается с использованием CGColorSpaceCreateDeviceRGB:
--- Это код Objective-C
unsigned char pixel[4] = {0};
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef context = CGBitmapContextCreate(pixel,
1, 1, 8, 4, colorSpace, (CGBitmapInfo)kCGImageAlphaPremultipliedLast);
CGContextTranslateCTM(context, -point.x, -point.y);
Моя лучшая попытка выглядит следующим образом (я ничего не возвращаю, но сначала пытаюсь правильно получить контекст):
--- Это моя лучшая попытка конверсии в Swift
func getPixelColorAtPoint()
{
let pixel = UnsafeMutablePointer<CUnsignedChar>.alloc(1)
var colorSpace:CGColorSpaceRef = CGColorSpaceCreateDeviceRGB()
let context = CGBitmapContextCreate(pixel, width: 1, height: 1, bitsPerComponent: 8, bytesPerRow: 4, space: nil, bitmapInfo: CGImageAlphaInfo.PremultipliedLast)
}
Однако это дает мне ошибку
Cannot convert the expression's type '(UnsafeMutablePointer<CUnsignedChar>, width: IntegerLiteralConvertible, height: IntegerLiteralConvertible, bitsPerComponent: IntegerLiteralConvertible, bytesPerRow: IntegerLiteralConvertible, space: NilLiteralConvertible, bitmapInfo: CGImageAlphaInfo)' to type 'IntegerLiteralConvertible'
Если бы вы могли посоветовать, как мне нужно настроить мой код выше, чтобы правильно ввести параметры контекстной функции, я был бы признателен, спасибо!
1 ответ
Есть две разные проблемы:
CGBitmapContextCreate()
является функцией, а не методом, и поэтому не использует имена внешних параметров по умолчанию.CGImageAlphaInfo.PremultipliedLast
не может быть передан какbitmapInfo:
параметр, сравните неразрешенный идентификатор Swift OpenGL kCGImageAlphaPremultipliedLast.
Так что это должно скомпилировать:
let pixel = UnsafeMutablePointer<CUnsignedChar>.alloc(4)
var colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
let context = CGBitmapContextCreate(pixel, 1, 1, 8, 4, colorSpace, bitmapInfo)
// ...
pixel.dealloc(4)
Обратите внимание, что вы должны выделить место для 4 байтов, а не 1.
В качестве альтернативы:
var pixel : [UInt8] = [0, 0, 0, 0]
var colorSpace = CGColorSpaceCreateDeviceRGB()
let bitmapInfo = CGBitmapInfo(CGImageAlphaInfo.PremultipliedLast.rawValue)
let context = CGBitmapContextCreate(UnsafeMutablePointer(pixel), 1, 1, 8, 4, colorSpace, bitmapInfo)