您不是在CGImage 上绘图,而是在CGContext 上绘图。您要做的是创建一个位图上下文,绘制到位图上下文中,然后从上下文位图缓冲区创建一个图像。这是我在 Playground 中输入的示例。
导入 UIKit
// CGContexts like rowbytes that are multiples of 16.
func goodBytesPerRow(_ width: Int) -> Int {
return (((width * 4) + 15) / 16) * 16
}
func drawMyImage() -> CGImage? {
let bounds = CGRect(x: 0, y:0, width: 200, height: 200)
let intWidth = Int(ceil(bounds.width))
let intHeight = Int(ceil(bounds.height))
let bitmapContext = CGContext(data: nil,
width: intWidth, height: intHeight,
bitsPerComponent: 8,
bytesPerRow: goodBytesPerRow(intWidth),
space: CGColorSpace(name: CGColorSpace.sRGB)!,
bitmapInfo: CGImageAlphaInfo.premultipliedFirst.rawValue)
if let cgContext = bitmapContext {
cgContext.saveGState()
cgContext.setFillColor(gray: 0, alpha: 1.0)
cgContext.fill(bounds)
/* ... do other drawing here ... */
cgContext.restoreGState()
return cgContext.makeImage()
}
return nil
}
let image = drawMyImage()
这是使用 32 位 ARGB 值绘制的。
Core Graphics 最喜欢它的行字节数是 16 的倍数(或者至少在 2006 年我写一本 Quartz 2D 书时它是这样的)。所以goodBytesPerRow 为 32 位 ARGB 像素计算一个 rowBytes,它是给定宽度的 16 的倍数。
“bitmapInfo”是常量的组合,决定了像素格式CGImageAlphaInfo 和CGBitmapInfo 的更多细节。在这种情况下,我们说我们希望 Alpha 通道位于首位(因此是 ARGB 而不是 RGBA),并且我们希望使用颜色通道与 Alpha 值预乘的像素。
一旦你有了位图上下文,你就可以画出你喜欢的东西。您说您想在黑色背景上画一些线条 - 所以这只是给您黑色背景,并将线条作为练习留给读者。
最后,您使用makeImage 从上下文中获得CGImage。如果你想要一个UIImage,你可以用UIImage(cgImage:)构造一个
附:如果您想从原始内存块构建图像,或者通过从文件或其他来源中流式传输数据,您将使用CGImageProvider。它基本上告诉系统如何获取图像数据。
在这种情况下,当我们创建位图上下文时,我们传入“nil”作为要求操作系统为我们分配图像的帧缓冲区的数据。