簡體   English   中英

寬顏色范圍的位圖上下文

[英]Bitmap context for wide color range

我正在嘗試使用 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。

我對核心圖形沒有太多經驗。 任何人都可以在這里提出建議。

謝謝。

CGImageMaskCreate()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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM