swift - 如何访问 SwiftUI Canvas 中的像素数据
问题描述
试图访问 a 上的像素数据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)
}
}
}
}
}
}
解决方案
我想这是之前讨论过的,请看这里
首先,如果您的上下文为空,请查看此处,仔细检查您的配置Supported Pixel Formats。对于 8 bitsPerComponent 和 RGB 颜色空间,您只有几个有效的 alpha 选项:
其次,请使用CGBITMAP_CONTEXT_LOG_ERRORS
环境。运行时方案中的变量来调试它。
由于您正在使用core graphics
,构建一个扩展,然后从那里获取,从这里pixeldata
归功于 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
}
}
推荐阅读
- delphi - 当节点获得焦点时,哪个选项会影响 TVirtualStringTree 滚动到视图中?
- android - 如何将 Gradle 的外部依赖项存储在我的 Android Studio 项目的 SVN 中?
- javascript - javascript 创建一个数组
- function - 嵌套 IIF/查找
- java - 使用 Jackson CSV 将 CSV 解析为 POJO 列表
- react-native - 关于 react-native 中的图表
- r - 给定一个有限的调色板,如何从热到冷排序,即发散
- xpages - ViewScope 变量变为空,keepsessionalive 不起作用?
- c# - 在 Outlook 365 中创建电子邮件草稿,然后将其打开以进行编辑
- c# - 可以找到错误 CS1061 “...不包含定义和扩展方法...接受类型的第一个参数”