2014-09-27 57 views
2

我有创设情境的问题..CGBitmapContextCreate:不支持的参数组合:8整数位/组件的iOS

我已经看到了很多答案,但没有工作的这对我来说。

我有以下代码。

CGSize pixelSize = src_img.size; 
pixelSize.width = src_img.scale* src_img.size.width; 
pixelSize.height = src_img.scale*src_img.size.height; 

size_t d_bytesPerRow = pixelSize.width * 4; 
unsigned char *imgData = (unsigned char*)malloc(pixelSize.height * d_bytesPerRow); 
CGImageRef imageRef = src_img.CGImage; 

CGContextRef context = CGBitmapContextCreate(imgData, 
               (size_t)pixelSize.width, (size_t)pixelSize.height, 8, d_bytesPerRow, 
               CGImageGetColorSpace(imageRef), kCGImageAlphaNone); 

在控制台显示我的错误

CGBitmapContextCreate:不支持的参数的组合:8整数 位/分量; 24位/像素; 3分量色彩空间; kCGImageAlphaNone; 1754字节/行。

我不知道该怎么做。请帮助

回答

2

由于错误消息显示“1754字节/行”,并且您正在计算字节/行为4 * src_img.size.width,所以我可以解决src_img.size.width = 1754/4 = 438.5。你的位图中不能有半个像素。

我怀疑你有具有2的UIImage s尺寸一scale一个UIImage在点测得的,但CGBitmapContext的尺寸以像素为单位。要将UIImage的尺寸转换为像素,您需要乘以它的scale

CGSize pixelSize = src_img.size; 
pixelSize.width *= src_img.scale; 
pixelSize.height *= src_image.scale; 

size_t d_bytesPerRow = pixelSize.width * 4; 
unsigned char *imgData = (unsigned char*)malloc(pixelSize.height * d_bytesPerRow); 
CGImageRef imageRef = src_img.CGImage; 

CGContextRef context = CGBitmapContextCreate(imgData, 
    (size_t)pixelSize.width, (size_t)pixelSize.height, 8, d_bytesPerRow, 
    CGImageGetColorSpace(imageRef), kCGImageAlphaNone); 

您还需要采取规模考虑,如果你打算将图像绘制成的背景下,或许通过CGContextScaleCTM

+0

是的,我缩放CGContextScaleCTM(上下文,1.0,-1.0);但问题是,CGContextRef总是来零..我已经试过上面的代码,但不工作 – user3772344 2014-09-27 05:42:54

+0

什么是'src_image.scale'?你是否尝试用“scale”乘以尺寸?如果是这样,请编辑您的问题以包含修改后的代码。 – 2014-09-27 05:45:02

+0

我已更新我的问题,请检查 – user3772344 2014-09-27 05:50:04

11

您没有指定supported pixel formats之一。图像的色彩空间显然是RGB色彩空间。您正在指定kCGImageAlphaNone。总之,这意味着每像素3个组件,并且没有填充。结合您指定的每个组件8位,每像素提供24位。

没有支持的像素格式允许每像素24位。这是另一种说法,他们都不支持RGB与kCGImageAlphaNone。如果您没有或想要alpha,则需要使用kCGImageAlphaNoneSkipFirstkCGImageAlphaNoneSkipLast,这意味着每个像素中的填充字节会将其高达每像素32位。

此外,对于data参数指定NULL,并将bytesPerRow参数指定为0,则几乎总是更好。前者使内存管理更容易。后者不仅更容易,而且允许系统优化缓冲区的对齐。