【问题标题】:Bitmap context for wide color range宽颜色范围的位图上下文
【发布时间】:2017-02-01 05:57:31
【问题描述】:

我正在尝试使用 kCGColorSpaceDisplayP3 色彩空间创建一个图像蒙版,以支持 iPhone 7 的广泛色彩范围。

在使用 iOS 10 和更早版本的 iOS 的 iPhone 6 和更早版本的设备上使用 sRGB 色彩空间时,我能够正确创建图像蒙版。但是我不知道使用 kCGColorSpaceDisplayP3 创建色彩空间时哪里出错了:

CGColorSpaceRef colorSpace = CGColorSpaceCreateWithName(kCGColorSpaceDisplayP3);

CGContextRef context = CGBitmapContextCreate(NULL, 320.0, 320.0, 32, 320.0*16, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapFloatComponents);

CGFloat radius = 10.0;
CGFloat components[] = {1.0,1.0,1.0,1.0,   1.0,1.0,1.0,1.0,    1.0,1.0,1.0,1.0,     1.0,1.0,1.0,1.0,    1.0,1.0,1.0,0.5,    1.0,1.0,1.0,0.0};
CGFloat locations[] = {0.0, 0.1, 0.2, 0.8, 0.9, 1.0};
CGGradientRef gradient = CGGradientCreateWithColorComponents(colorSpace, components, locations, 6); //colorSpaceP3
CGPoint center = CGPointMake(100.0, 100.0);
CGContextDrawRadialGradient(context, gradient, center, 0.1, center, radius, 0);

CGGradientRelease(gradient);

CGImageRef imageHole = CGBitmapContextCreateImage(context);
CGImageRef maskHole = CGImageMaskCreate(CGImageGetWidth(imageHole), CGImageGetHeight(imageHole), CGImageGetBitsPerComponent(imageHole), CGImageGetBitsPerPixel(imageHole), CGImageGetBytesPerRow(imageHole), CGImageGetDataProvider(imageHole), NULL, FALSE);

CGImageRelease(imageHole);

CGImageRef image = [UIImage imageNamed:@"prosbo_hires.jpg"].CGImage;
CGImageRef masked = CGImageCreateWithMask(image, maskHole);

CGImageRelease(maskHole);
UIImage *img = [UIImage imageWithCGImage:masked];
CGImageRelease(masked);

CGContextRelease(context);
CGColorSpaceRelease(colorSpace);

日志说:

:CGImageMaskCreate:无效的掩码位/组件:32。

我对 Core Graphics 没有太多经验。任何人都可以在这里提出一些建议。

谢谢。

【问题讨论】:

    标签: objective-c core-graphics ios10 cgbitmapcontext cgimagemaskcreate


    【解决方案1】:

    CGImageMaskCreate()bitsPerComponent 参数的文档说:

    每个组件的图像掩码必须为 1、2、4 或 8 位。

    您正在传递CGImageGetBitsPerComponent(imageHole),即每个组件 32 位。根据文档和日志消息,这是无效的。

    这意味着图像掩码不支持浮点位图格式。

    应该可以使用每个组件 8 位来创建位图上下文和掩码。或多或少,请忽略kCGBitmapFloatComponents。我希望这会降低蒙版不透明度的粒度,但不会影响蒙版图像的颜色范围。

    【讨论】:

    • 我尝试使用每个补码 8 位来创建位图上下文和掩码。这适用于 iPhone 7 以下的所有设备。在 iPhone 7 和 7+ 中,生成的图像的不透明度几乎可以忽略不计。它几乎是透明的。
    【解决方案2】:

    这解决了我的问题:

    contextRef = CGBitmapContextCreate(
        m.data,
        m.cols,
        m.rows,
        8,
        m.step[0], 
        CGColorSpaceCreateDeviceRGB(),
        bitmapInfo);
    

    https://developer.apple.com/search/?q=CGColorSpaceCreate

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-24
      相关资源
      最近更新 更多