2015-01-02 2 views
2

Я нашел пример кода Objective-C, который получает цвет пикселя в точке здесь: How to get the pixel color on touch?Получить цвет пикселя На Поинт В Swift

Конкретная часть кода мне нужна помощь именно там контекст создается с помощью 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' 

Если бы вы могли посоветовать, как мне нужно настроить мой код выше, чтобы получить параметры параметров контекста введены правильно. Я был бы благодарен вам!

ответ

5

Есть две разных проблемы:

  • CGBitmapContextCreate() является функцией, не метода, и поэтому не использования внешних имен параметров по умолчанию.
  • CGImageAlphaInfo.PremultipliedLast не может быть передан как bitmapInfo: параметр, сравнить Swift OpenGL unresolved identifier 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) 
+0

Wow! Я никогда не знал такой разницы между функциями и методами (они всегда имели в виду одно и то же), что ДЕЙСТВИТЕЛЬНО очищает вещи благодаря вам. Также спасибо за указание на разницу распределения, я тоже застрял на этом. Большое спасибо! – Aggressor

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