"Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения" при использовании vImageBuffer_initWithCGImage в Swift ios

Я работаю в Swift iOS8 и пытаюсь преобразовать UIImage в vImage_Buffer для выполнения манипуляций с использованием Accelerate.framework. Я пытаюсь использовать vImageBuffer_initWithCGImage для преобразования, вот код, который я пробовал:

func initvImageBufferwithUIImage (image:UIImage)-> vImage_Buffer{

    var CGImg:CGImageRef = sunset.CGImage
    var inProvider:CGDataProviderRef = CGImageGetDataProvider(CGImg)
    var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider)
    var buffer:vImage_Buffer!

    var format:vImage_CGImageFormat = vImage_CGImageFormat(bitsPerComponent: 8, bitsPerPixel: 32, colorSpace: nil, bitmapInfo: CGBitmapInfo.ByteOrderDefault, version: 0, decode: nil, renderingIntent: kCGRenderingIntentDefault)

    vImageBuffer_InitWithCGImage(&buffer!, &format, nil , sunset.CGImage, 0)

    return buffer

Нет ошибки компиляции, и когда я пытаюсь ее запустить, я получаю "фатальную ошибку: неожиданно найден ноль при развертывании необязательного значения" в строке vImageBuffer_InitWithCGImage. Я не уверен, почему это происходит, так как и буфер, и третий параметр, который является backgroundColor, оба небезопасны и согласно документации должны принимать NULL, равный нулю в swift для UnsafeMutablePointer (поправьте меня, если я ошибаюсь).

РЕДАКТИРОВАТЬ: хорошо, я по крайней мере понял, почему сейчас это происходит. Потому что я отправляю развернутый & буфер!. Но я не могу отправить и буфер, так как он говорит, что "vImage_buffer! Не идентичен vImage_buffer".

Я пробовал все виды комбинаций с объявлением буфера как vImage_buffer? но я не могу заставить это работать. Мне просто нужно выделить параметр буфера, чтобы передать его в функцию инициализации, но я не знаю, как... Пожалуйста помоги

3 ответа

Просто создайте фиктивный объект vImage_Buffer перед вызовом:

var buf = vImage_Buffer(data: nil, height: 0, width: 0, rowBytes: 0)

а затем позвоните:

vImageBuffer_InitWithCGImage(&buffer, ... )

и vImage заполнит все поля структуры правильно для вас.

Я понятия не имею, что такое vImage. Но из документа Apple, vImage_Buffer - это структура, которая должна иметь тело, прежде чем анализировать его в vImageBuffer_InitWithCGImage, и эта функция заполнит поля для этой структуры. Настоящая проблема вашего кода.

var buffer:vImage_Buffer!

Над одним создайте необязательный, который имеет значение по умолчанию nil. И когда развернуть, это сообщает ноль. Потому что это ноль. Вы должны создать пустую структуру и передать ее функции. Попробуйте следующий.

    var buffer:vImage_Buffer = vImage_Buffer()
    ........
    vImageBuffer_InitWithCGImage(&buffer, &format, nil , sunset.CGImage, 0)
    ........

Итак, я не нашел способ сделать то, что я хотел, и использовать vImageBuffer_initWithCGImage, но благодаря хорошим людям здесь я сделал обходной путь, инициализировав полу vImage_Buffer вручную через CGImage. Вот как выглядит моя функция:

    func initvImageBufferwithUIImage (image:UIImage)-> vImage_Buffer{

    var CGImgRef:CGImageRef = image.CGImage
    var inProvider:CGDataProviderRef = CGImageGetDataProvider(CGImgRef)
    var inBitmapData:CFDataRef = CGDataProviderCopyData(inProvider)
    var buffer:vImage_Buffer = vImage_Buffer(data: &inBitmapData, height:
  CGImageGetHeight(CGImgRef), width: CGImageGetWidth(CGImgRef), rowBytes:
  CGImageGetBytesPerRow(CGImgRef))

    return buffer

}
Другие вопросы по тегам