0

Я пытаюсь создать маску изображения с помощью цветового пространства 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. Кто-нибудь может предложить что-то здесь.

Спасибо.

ответ

0

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

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

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

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

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

+0

Я попытался создать как растровый контекст, так и маску, используя 8 бит в дополнение. Это отлично работает на всех устройствах под iPhone 7. В iPhone 7 и 7+ непрозрачность изображения в результате почти неграмотна. Это почти прозрачно. – maven25

Смежные вопросы