2015-01-16 4 views
0

Я пытаюсь нарисовать CGImageRef с CGContextDrawImage на Mac OSX Yosemite. Когда мое изображение имеет ширину, все работает хорошо, но когда это странно, программа вылетает с EXC_BAD_ACCESS, даже если все кажется ОК (изображение и растровое изображение в памяти).CGContextDrawImage падает с нечетным значением ширины

Вот мой код:

unsigned long rowBytes = ((CGImageGetBitsPerPixel(image) * CGImageGetWidth(image)) + 15) & ~15; 

/* TRIED THIS WITH SAME RESULTS 
unsigned long rowBytes = CGImageGetWidth(image) * 4; 

if (rowBytes % 16) { 

    rowBytes = ((rowBytes/16) + 1) * 16; 

} 
*/ 

void *baseAddress = valloc(CGImageGetHeight(image) * rowBytes); 

if (baseAddress == NULL) { 

    CGImageRelease(image); 

    return nil; 

} 

CGContextRef bitmapContext = CGBitmapContextCreate(baseAddress, 
                CGImageGetWidth(image), 
                CGImageGetHeight(image), 
                8, 
                rowBytes, 
                [context colorSpace], 
                kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host); 


if (bitmapContext == NULL) { 

    free(baseAddress); 
    CGImageRelease(image); 

    return nil; 

} 


CGRect bounds = CGRectMake(0, 0, CGImageGetWidth(image), CGImageGetHeight(image)); 
CGContextClearRect(bitmapContext, bounds); 
CGContextDrawImage(bitmapContext, bounds, image); 

При появлении аварии, библиотека libRIP, кажется, связаны с этими сообщениями:

Thread 0 Разбился :: Очередь отправки: com.apple. Основной-нить 0
com.apple.CoreGraphics 0x00007fff8124aaa0 decode_byte_8bpc_3 + 375 1 com.apple.CoreGraphics 0x00007fff8123a2af decode_data + 19394 2 com.apple.CoreGraphics 0x00007fff81234c84 img_decode_read + 380 3 com.apple.CoreGraphics
0x00007fff812349ff img_colormatch_read + 379 4
com.apple.CoreGraphics 0x00007fff8121a40d img_data_lock + 8512 5 com.apple.CoreGraphics 0x00007fff8121726e CGSImageDataLock + 151 6 libRIP.A.dylib 0x00007fff8c8d52d2 ripc_AcquireImage + 906 7 libRIP .A.dylib
0x00007fff8c8d3df5 ripc_DrawImage + 1037 8 com.apple.CoreGraphics
0x00007fff81216e27 CGContextDrawImage + 457

Я думал, что это был ряд проблем байт значение, но каждая попытка справиться с этим значением не удается. Кто-нибудь имел такую ​​же проблему и разрешил ее? Что мне не хватает?

+0

Ваше текущее вычисление '((CGImageGetBitsPerPixel (изображение) * CGImageGetWidth (изображение)) + 15) & ~ 15' вычисляет ** бит ** - за строку, а не байты. В любом случае, если вы не пытаетесь заставить определенные байты за строку, вы должны передать 'NULL' для параметра' data' и 0 для параметра 'bytesPerRow'' CGBitmapContextCreate() ', чтобы он управлял буфера и вычисляет оптимальные байты за строку. Наконец, из трассировки стека я подозреваю, что проблема связана с исходным изображением, а не с растровым контекстом. CG может отложить использование данных для этого до тех пор, пока оно не будет составлено, поэтому тогда возникнет проблема. –

ответ

0

Если вы правильно поняли, у вас есть изображение с именем image, и первое, что вы делаете, это вычислить числа байтов в строке. Вы должны никогда сделайте это самостоятельно! Только само изображение знает, сколько байтов оно использует для строки. CGimage, и у друзей есть своя стратегия определения этого числа, и он может (и это сделал) измениться от версии ОС к другой. Попросите изображение непосредственно:

unsigned long rowBytes = CGImageGetBytesPerRow(image); 

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

Я не уверен, если это убьет дробилку. Попробуйте.

+0

Я думал, что байты в строке должны быть кратными 16 ... Ну, получение байтов на строку непосредственно из изображения не делает его ни одним из них. –