0

iPhone 7のワイドカラー範囲をサポートするために、kCGColorSpaceDisplayP3 colorspaceでイメージマスクを作成しようとしています。ワイドカラー範囲のビットマップコンテキスト

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に多くの経験があります。誰でもここに何か提案してもらえますか?

ありがとうございました。

答えて

0

CGImageMaskCreate()bitsPerComponentパラメータのドキュメントは言う:

イメージマスクは成分ごとに1、2、4、または8ビットでなければなりません。

コンポーネントあたり32ビットであるCGImageGetBitsPerComponent(imageHole)を渡しています。ドキュメントとログメッセージの両方によると、それは無効です。

イメージマスクは浮動小数点ビットマップフォーマットをサポートしていないということです。

ビットマップコンテキストとマスクは、コンポーネントごとに8ビットを使用して作成する必要があります。多かれ少なかれ、ただ外してくださいkCGBitmapFloatComponents。私は、マスクの不透明度の細かさが低下すると予想しますが、マスクされた画像の色範囲には影響しません。

+0

ビットマップコンテキストとマスクの両方を8ビット補数で作成しようとしました。これはiPhone 7の下のすべてのデバイスで正常に動作します。iPhone 7および7+では、結果として得られる画像の不透明度はほとんど無視できます。ほぼ透明です。 – maven25