"Неустранимая ошибка: неожиданно обнаружен ноль при развертывании необязательного значения" при использовании 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
}