【问题标题】:How to create an empty, coloured CGImage canvas in Swift如何在 Swift 中创建一个空的彩色 CGImage 画布
【发布时间】:2021-10-20 18:53:42
【问题描述】:

我想在空白的 CGImage 黑色画布上画一些线条。创建一个特定大小的空白 CGImage 应该是微不足道的,但我做不到。我试图扩展 CGImage init?使用所需信息调用 self.init(width:height:...bitmapInfo:provider:...) 但我对 CGBitmapInfo 和 CGDataProvider 了解不够。

关于如何创建这个空画布的任何帮助或指导?还有其他不使用 UIKit 的方法吗?

谢谢!

【问题讨论】:

    标签: swift image core-graphics


    【解决方案1】:

    您不是在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”是常量的组合,决定了像素格式CGImageAlphaInfoCGBitmapInfo 的更多细节。在这种情况下,我们说我们希望 Alpha 通道位于首位(因此是 ARGB 而不是 RGBA),并且我们希望使用颜色通道与 Alpha 值预乘的像素。

    一旦你有了位图上下文,你就可以画出你喜欢的东西。您说您想在黑色背景上画一些线条 - 所以这只是给您黑色背景,并将线条作为练习留给读者。

    最后,您使用makeImage 从上下文中获得CGImage。如果你想要一个UIImage,你可以用UIImage(cgImage:)构造一个

    附:如果您想从原始内存块构建图像,或者通过从文件或其他来源中流式传输数据,您将使用CGImageProvider。它基本上告诉系统如何获取图像数据。

    在这种情况下,当我们创建位图上下文时,我们传入“nil”作为要求操作系统为我们分配图像的帧缓冲区的数据。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-12
      相关资源
      最近更新 更多