【问题标题】:How can I access the pixels data in SwiftUI Canvas如何访问 SwiftUI Canvas 中的像素数据
【发布时间】:2023-04-08 16:04:02
【问题描述】:

试图访问Canvas 上的像素数据,我想几乎就在那里?但我错过了一些细节?这可以编译,但 cgContext.data 似乎没有设置为我可以在此处提取的值?

line 变量指的是已发布的点数组。

class Lines:ObservableObject {
  @Published var coordinates:[CGPoint] = []
}

struct ContentView: View {
  @ObservedObject var line = Lines()
  @GestureState var foo = CGPoint.zero
  var body: some View {
  ZStack(alignment: .center) {
    Color.yellow
    .opacity(0.1)

  Canvas { context, size in
    context.withCGContext { cgContext in
      cgContext.setStrokeColor(UIColor.red.cgColor)
      cgContext.setLineWidth(12)
      if line.coordinates.count > 2 {
        cgContext.move(to: line.coordinates[0])
        for p in 1..<line.coordinates.count {
          cgContext.move(to: line.coordinates[p - 1])
          cgContext.addLine(to: line.coordinates[p])
          cgContext.drawPath(using: .eoFillStroke)
        }
        if cgContext.data != nil {
          let rawData:UnsafeMutableRawPointer = cgContext.data!
          let opaquePtr = OpaquePointer(rawData)
          let contextPtr = UnsafeMutablePointer<UInt32>(opaquePtr)
          let pixels = UnsafeMutableBufferPointer<UInt32>(start: contextPtr, count: 256 * 256)
          print("pixels ",pixels.count)
        }
      }
    }
  }
}
}

【问题讨论】:

  • Philip,感谢您抽出宝贵时间尝试回答。遗憾的是,我无法接受您的回复,因为我离答案并不近。

标签: swift canvas swiftui core-graphics


【解决方案1】:

我想这个之前讨论过,请看here


首先,如果您的上下文为空,请查看此处,仔细检查您的配置Supported Pixel Formats。对于 8 bitsPerComponent 和 RGB 颜色空间,您只有几个有效的 alpha 选项:

其次,请使用CGBITMAP_CONTEXT_LOG_ERRORS env。在运行时你的方案中的变量来调试它。


由于您使用的是core graphics,因此构建一个扩展程序,然后从那里获取pixeldata,感谢来自here 的Anna。

只需在此处重复使用您的CGContext,看看是否可行。

extension UIImage {
    func pixelData() -> [UInt8]? {
        let size = self.size
        let dataSize = size.width * size.height * 4
        var pixelData = [UInt8](repeating: 0, count: Int(dataSize))
        let colorSpace = CGColorSpaceCreateDeviceRGB()
        let context = CGContext(data: &pixelData,
                                width: Int(size.width),
                                height: Int(size.height),
                                bitsPerComponent: 8,
                                bytesPerRow: 4 * Int(size.width),
                                space: colorSpace,
                                bitmapInfo: CGImageAlphaInfo.noneSkipLast.rawValue)
        guard let cgImage = self.cgImage else { return nil }
        context?.draw(cgImage, in: CGRect(x: 0, y: 0, width: size.width, height: size.height))

        return pixelData
    }
 }

【讨论】:

    猜你喜欢
    • 2015-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-06
    • 2023-01-12
    • 1970-01-01
    • 2021-07-02
    • 2011-11-24
    相关资源
    最近更新 更多