【发布时间】:2018-01-10 20:47:15
【问题描述】:
TL;DR:在旧版 Obj-C 代码中,颜色空间参数值为 NULL。这在 Swift 等效项中是不允许的。使用什么值?
我继承了如下代码:
unsigned char pixel[1] = {0};
CGContextRef context = CGBitmapContextCreate(
pixel,1, 1, 8, 1, NULL, (CGBitmapInfo)kCGImageAlphaOnly
);
到 Swift 4 CGContext 的端口很简单,除了 NULL 色彩空间值。使用一个合理的值,我从CGContext.init?() 得到了nil。我的翻译是:
var pixelValue = UInt8(0)
var pixel = Data(buffer: UnsafeBufferPointer(start:&pixelValue, count:1))
let context = CGContext(
data : &pixel,
width : 1,
height : 1,
bitsPerComponent: 8,
bytesPerRow : 1,
space : CGColorSpace(name:CGColorSpace.genericRGBLinear)!,
bitmapInfo : CGImageAlphaInfo.alphaOnly.rawValue
)! // Returns nil; unwrapping crashes
问:space 的适当值是多少? (我提供的值没有返回 nil;它是 CGContext() 调用本身。
设置环境变量CGBITMAP_CONTEXT_LOG_ERRORS 会产生如下错误日志:
Assertion failed: (0), function get_color_model_name,
file /BuildRoot/Library/Caches/com.apple.xbs/Sources/Quartz2D_Sim/
Quartz2D-1129.2.1/CoreGraphics/API/CGBitmapContextInfo.c, line 210.
对于更多背景故事,上下文用于通过以下方式查找 UIImage 中单个像素的 alpha 值:
unsigned char pixel[1] = {0};
CGContextRef context = CGBitmapContextCreate(pixel,1, 1, 8, 1, NULL, (CGBitmapInfo)kCGImageAlphaOnly);
UIGraphicsPushContext(context);
[image drawAtPoint:CGPointMake(-point.x, -point.y)];
UIGraphicsPopContext();
CGContextRelease(context);
CGFloat alpha = pixel[0]/255.0;
(我确实有可能的替代方法来寻找 alpha,但为了不影响遗留代码,我希望保持这种方式。)
【问题讨论】:
-
试试
linearGray色彩空间。 -
@DonMag,我确实阅读了文档。这就是我找到
ColorSpace名称的方式。如上所示,我在通话中确实使用了它。 -
@rmaddy,谢谢,这确实允许初始化 CGContext。唉,(其余)代码的 Swift 4 版本为每个 alpha 计算 0。但我相信你回答了我的问题。
-
@AndrewDuncan,你有没有找到解决错误 alpha 计算的方法?
标签: ios swift core-graphics