сбой в функции преобразования vImage

Я хочу преобразовать плоское изображение в оттенках серого, где каждый пиксель хранится в 32-битных числах с плавающей запятой, в изображение XRGB в Mac OS X. vImage кажется наиболее подходящим инструментом. Я написал короткую функцию, которая делает это, но она падает при вызове vImage с ошибкой EXC_BAD_ACCESS. Вот мой код:

- (NSData *) convertToRGB_vImage {
size_t numRows = self.rows;
size_t numColumns = self.columns;
size_t height = numRows;
size_t width = numColumns;
size_t inRowBytes = width*sizeof(float);

size_t outRowBytes = byteAlign(inRowBytes, 64);
size_t destinationSize = outRowBytes * numRows;

void *outData = malloc(destinationSize);
void *inData = self.sourceData.mutableBytes; // source pixels in an NSMutableData

Pixel_8 alpha = 255; // fully opaque

vImage_Buffer red = { inData, width, height, inRowBytes };
vImage_Buffer green = { inData, width, height, inRowBytes };
vImage_Buffer blue = { inData, width, height, inRowBytes };

vImage_Buffer dest = { outData, width, height, outRowBytes }; // 3

Pixel_FFFF maxFloat = { 1.0, 1.0, 1.0, 1.0};
Pixel_FFFF minFloat = { 0.0, 0.0, 0.0, 0.0};

vImage_Flags flags = kvImageNoFlags;

vImage_Error error = vImageConvert_PlanarFToXRGB8888 (alpha, &red, &green, &blue, &dest, maxFloat, minFloat, flags);

if (error != 0) {
    NSLog(@"vImage error %zd", error);
}

NSMutableData *colorData = [[NSMutableData alloc] initWithBytesNoCopy:outData length:destinationSize];
return colorData;
}

Я попробовал несколько вариаций на ту же тему, но безуспешно. Что я сделал не так?


person Jean-Denis Muys    schedule 15.03.2016    source источник


Ответы (1)


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

Предполагая, что ваш компилятор позволяет это, использование именованных полей безопаснее:

vImage_Buffer b = (vImage_Buffer){
   .data = my_data,
   .width = the_width,
   .height = the_height,
   .rowBytes = ROUND_SIZE_UP( the_width * pixel_bytes, 64)
};
person JWWalker    schedule 15.03.2016