我遇到创建上下文的问题..
我见过很多答案,但这些都不适合我。
我有以下代码。
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字节/行。
我不知道该怎么办。请帮忙
答案 0 :(得分:11)
您没有指定其中一个supported pixel formats。图像的色彩空间显然是RGB色彩空间。您正在指定kCGImageAlphaNone
。总之,这意味着每像素3个组件,没有填充。结合您指定的每个组件的8位,每像素提供24位。
所支持的像素格式都不允许每像素24位。这是另一种说法,它们都没有kCGImageAlphaNone
支持RGB。如果你没有或想要alpha,你需要使用kCGImageAlphaNoneSkipFirst
或kCGImageAlphaNoneSkipLast
,这意味着每个像素中有一个填充字节,最高可达每像素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
,还需要考虑比例。