CGBitmapContextCreate:不支持的参数组合:8个整数位/组件iOS

时间:2014-09-27 05:23:24

标签: ios objective-c

我遇到创建上下文的问题..

我见过很多答案,但这些都不适合我。

我有以下代码。

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 个答案:

答案 0 :(得分:11)

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

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

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

答案 1 :(得分:2)

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

我怀疑您的UIImage scale为2. 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,还需要考虑比例。