Fel*_*udi 1 image core-graphics swift
我想在空的 CGImage 黑色画布上画一些线。创建特定大小的空白 CGImage 应该是一件微不足道的事情,但我做不到。我尝试过扩展 CGImage init?使用所需信息调用 self.init(width:height:...bitmapInfo:provider:...) 但我对 CGBitmapInfo 和 CGDataProvider 知之甚少。
关于如何创建这个空画布有任何帮助或指导吗?还有其他不使用 UIKit 的方法吗?
谢谢!
你不是在 a 上画画CGImage,而是在 a 上画画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()
Run Code Online (Sandbox Code Playgroud)
这是使用 32 位 ARGB 值进行绘制。Core Graphics 最喜欢它的行字节是 16 的倍数(或者至少在 2006 年我写一本 Quartz 2D 书时是这样)。因此goodBytesPerRow,对于 32 位 ARGB 像素,计算给定宽度的 rowBytes 是 16 的倍数。
“bitmapInfo”是常量的组合,确定像素格式CGImageAlphaInfo和的更多细节CGBitmapInfo。在本例中,我们希望将 alpha 通道放在第一位(因此使用 ARGB 而不是 RGBA),并且希望使用颜色通道预乘以 alpha 值的像素。
一旦获得位图上下文,您就可以绘制您喜欢的内容。您说您想在黑色背景上画一些线条 - 所以这只是为您提供黑色背景并将线条留给读者作为练习。
最后,您可以CGImage使用从上下文中获得 a makeImage。如果你想要一个UIImage,你可以用UIImage(cgImage:)
CGImageProviderPS如果您想从原始内存块构建图像,或者通过从文件或其他来源流式传输数据,则可以使用。它基本上告诉系统如何获取图像数据。
在这种情况下,当我们创建位图上下文时,我们传入“nil”作为数据,要求操作系统为我们的图像分配帧缓冲区。
| 归档时间: |
|
| 查看次数: |
926 次 |
| 最近记录: |