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
色彩空间值。使用合理的值,我得到nil
从...回来CGContext.init?()
。我的翻译是:
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
Q: 合适的值是多少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.
对于更多背景故事,上下文用于查找 a 中单个像素的 alpha 值UIImage
通过以下方式:
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,但为了不影响遗留代码,我想保持这种方式。)