CGContextDrawImage以奇数宽度值崩溃

时间:2015-01-16 09:58:59

标签: objective-c image macos core-graphics cgimage

我尝试在Mac OSX Yosemite上使用CGContextDrawImage绘制CGImageRef。 当我的图像具有均匀宽度时,一切都运行良好,但是当它很奇怪时,即使一切看起来都正常(图像和位图文本在内存中),程序也会以EXC_BAD_ACCESS崩溃。

这是我的代码:

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 Crashed :: Dispatch queue:com.apple.main-thread 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

我认为这是一个行字节值问题,但每次尝试使用此值进行管理都会失败。 有没有人有同样的问题并解决了它?我错过了什么?

1 个答案:

答案 0 :(得分:0)

如果我理解正确你有一个名为image的图像,你要做的第一件事就是计算一行中的字节数。你应该从不自己做这件事!只有图像本身知道它用于行的字节数。 CGimage和朋友有自己的策略来定义这个数字,它可能(并且确实)从OS版本更改为下一个。直接询问图片

unsigned long rowBytes = CGImageGetBytesPerRow(image);

试试这个,看看你的代码和我的提示的结果是否不同。

如果这会杀死破碎机,我不会感到害羞。试一试。