对于某些宽度和高度的像素,CGBitmapContextCreate返回NULL

时间:2018-03-26 07:47:49

标签: ios objective-c core-graphics cgbitmapcontextcreate cgbitmapcontext

我有以下代码来创建新的位图图形上下文。

NSLog(@"newRect Width %f",newRect.size.width);
NSLog(@"newRect Height %f",newRect.size.height);
NSLog(@"imageRef %@",imageRef);

CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            CGImageGetBitsPerComponent(imageRef),
                                            0,
                                            CGImageGetColorSpace(imageRef),
                                            CGImageGetBitmapInfo(imageRef));

newRect.size.width是将UIImage的原始宽度除以2的结果。 newRect.size.height是将UIImage的原始高度除以2的结果。

但是对于一些大小为{3000,2002},{3024,4032},{4032,3024}的UIImages是可以的并且返回位图上下文。

但对于一些尺寸为{1242,2208}的UIImages。通常这些是来自我的设备的屏幕截图并返回NULL值。

This is the log for failed UIImageThis is the log for succeed UIImage

是否有人可以帮助解决我的问题。感谢。

1 个答案:

答案 0 :(得分:1)

我无法重现这个问题。 我建议记录所有传入的参数并将日志附加到您的问题。 另外看一下控制台日志,CGBitmapContextCreate可以在那里写一些可以提供有关问题的见解的东西。

<强>已更新

您面临的问题与图像大小无关,而是与位图信息/颜色空间和每个组件的位组合。这是我在系统日志中尝试使用您提供的信息创建位图上下文的原因:

CGBitmapContextCreate: unsupported parameter combination:
    16 bits/component; integer;
    64 bits/pixel;
    RGB color space model; kCGImageAlphaLast;
    kCGImageByteOrder16Little byte order;
    4992 bytes/row.
Valid parameters for RGB color space model are:
    16  bits per pixel,      5  bits per component,      kCGImageAlphaNoneSkipFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaNoneSkipLast
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedFirst
    32  bits per pixel,      8  bits per component,      kCGImageAlphaPremultipliedLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaPremultipliedLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaNoneSkipLast
    64  bits per pixel,      16 bits per component,      kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents
    64  bits per pixel,      16 bits per component,      kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents
    128 bits per pixel,      32 bits per component,      kCGImageAlphaPremultipliedLast|kCGBitmapFloatComponents
    128 bits per pixel,      32 bits per component,      kCGImageAlphaNoneSkipLast|kCGBitmapFloatComponents
See Quartz 2D Programming Guide (available online) for more information.

您可以尝试始终使用标准或失败的情况,例如

CGContextRef bitmap = CGBitmapContextCreate(NULL,
                                            newRect.size.width,
                                            newRect.size.height,
                                            8,
                                            0,
                                            CGColorSpaceCreateDeviceRGB(),
                                            kCGImageAlphaPremultipliedFirst | kCGBitmapByteOrder32Host));

或让系统为您选择合适的上下文:

   UIGraphicsBeginImageContextWithOptions(newRect.size, false, 1.0);
   CGContextRef bitmap = UIGraphicsGetCurrentContext();

   // Do your drawing here

   UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
   UIGraphicsEndImageContext();