CGBitmapContextCreate returns 某些像素的宽度和高度为 NULL

CGBitmapContextCreate returns NULL for some pixels of width and height

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

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 值。

.

有没有人可以帮助解决我的问题。谢谢

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

已更新:

您遇到的问题与图像大小无关,而是与位图 info/colorspace 和每个组件的位数的组合有关。这是我在系统日志中得到的,试图使用您提供的信息创建位图上下文:

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();