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