[英]How can I access the pixels data in SwiftUI Canvas
試圖訪問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
, 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
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.