我正在尝试创建一个具有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。
我没有太多的核心图形经验。有没有人能给我提个建议。
谢谢。
发布于 2017-02-02 02:46:00
CGImageMaskCreate()的bitsPerComponent参数的文档是这样写的:
每个组件的
图像蒙版必须为1、2、4或8位。
您正在传递CGImageGetBitsPerComponent(imageHole),它是每个组件32位。根据文档和日志消息,这是无效的。
这意味着图像蒙版不支持浮点位图格式。
应该可以使用每个组件8位来创建位图上下文和掩码。或多或少,只要省略kCGBitmapFloatComponents即可。我预计这将导致蒙版的不透明度的粒度减小,但不会影响蒙版图像的颜色范围。
发布于 2019-12-06 19:37:29
这解决了我的问题:
contextRef = CGBitmapContextCreate(
m.data,
m.cols,
m.rows,
8,
m.step[0],
CGColorSpaceCreateDeviceRGB(),
bitmapInfo);https://stackoverflow.com/questions/41972877
复制相似问题