我尝试在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
我认为这是一个行字节值问题,但每次尝试使用此值进行管理都会失败。 有没有人有同样的问题并解决了它?我错过了什么?
答案 0 :(得分:0)
如果我理解正确你有一个名为image
的图像,你要做的第一件事就是计算一行中的字节数。你应该从不自己做这件事!只有图像本身知道它用于行的字节数。 CGimage
和朋友有自己的策略来定义这个数字,它可能(并且确实)从OS版本更改为下一个。直接询问图片:
unsigned long rowBytes = CGImageGetBytesPerRow(image);
试试这个,看看你的代码和我的提示的结果是否不同。
如果这会杀死破碎机,我不会感到害羞。试一试。