Растровый контекст для широкого цветового диапазона

Я пытаюсь создать маску изображения с цветовым пространством kCGColorSpaceDisplayP3 для поддержки широкой цветовой гаммы iPhone 7.

Я могу правильно создать маску изображения при использовании цветового пространства sRGB на iPhone 6 и более ранних устройствах, использующих iOS 10 и более ранние версии iOS. Но я понятия не имею, где я ошибаюсь при создании цветового пространства с использованием 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. Может кто-нибудь, пожалуйста, предложить что-то здесь.

Благодарю.

1 ответ

Документация для bitsPerComponent параметр CGImageMaskCreate() говорит:

Маски изображения должны составлять 1, 2, 4 или 8 бит на компонент.

Вы проходите CGImageGetBitsPerComponent(imageHole), что составляет 32 бита на компонент. Как в документации, так и в журнале сообщений, это недействительно.

Это означает, что маски изображений не поддерживают растровые форматы с плавающей точкой.

Должно быть возможно создать растровый контекст и маску, используя 8 бит на компонент. Более или менее, просто пропустите kCGBitmapFloatComponents, Я ожидаю, что это приведет к снижению степени детализации непрозрачности маски, но не повлияет на цветовую гамму маскируемых изображений.

Это устранило мою проблему:

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

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

Другие вопросы по тегам