Преобразование рисунка в изображение с помощью PencilKit в SwiftUI

У меня есть этот простой View в SwiftUI, и я реализовал PencilKit для подписи пользователя. У меня вопрос, как я могу создать изображение из рисунка пользователя.

import SwiftUI
import PencilKit




struct ContentView : View {

    var body: some View {
        VStack {
            Text ("Sign here:")
            PenKitRepre()
                .frame(height: 80.0)
                .border(/*@START_MENU_TOKEN@*/Color.black/*@END_MENU_TOKEN@*/, width: 10)
            Button(action: {


            }) {
                Text("Save")
            }
        }

    }
}
struct PenKitRepre : UIViewRepresentable {
    func makeUIView(context: Context) -> PKCanvasView {
        return PKCanvasView();
    }

    func updateUIView(_ uiView: PKCanvasView, context: Context) {

    }
}

Изображение не должно сохраняться в фотопленке.

2 ответа

You can get the image of the user drawings like this, for example:

let imgRect = CGRect(width: 400, height: 80) 
let image = canvasView.drawing.image(from: imgRect, scale: 1.0)

В большинстве случаев предпочтительный размер изображения должен включать всю область рисования. Для этого создайте размер рисунка и используйте его для установки размера изображения и размера содержимого холста.

Создайте размер чертежа:

      @State var drawingSize: CGSize = CGSize(width: 350, height: 80)

Установите размер изображения, используя этот размер рисунка, а затем сохраните изображение:

      let imgRect = CGRect(origin: CGPoint.zero, size: drawingSize)
image = canvasView.drawing.image(from: imgRect, scale: 1.0)

Установите размер контента:

      canvasView.contentSize = drawingSize

Чтобы отобразить полное изображение в правильном аспекте:

          Image(uiImage: image)
        .resizable()
        .aspectRatio(drawingSize, contentMode: .fit)

Это пример сохраняемой подписи:

Улучшенный пример кода:

      import SwiftUI
import PencilKit

struct ContentView : View {
    
    @State var canvasView = PKCanvasView()
    @State var drawingSize: CGSize = CGSize(width: 350, height: 80)
    @State var image: UIImage = UIImage()
    
    var body: some View {
        VStack {
            Image(uiImage: image)
                .resizable()
                .aspectRatio(drawingSize, contentMode: .fit)
                .frame(height: 100)
            
            Text ("Sign here:")
            PenKitRepre(canvasView: $canvasView, drawingSize: $drawingSize)
                .frame(width: drawingSize.width, height: drawingSize.height)
                .border(/*@START_MENU_TOKEN@*/Color.black/*@END_MENU_TOKEN@*/, width: 10)
            
            Button(action: {
                let imgRect = CGRect(origin: CGPoint.zero, size: drawingSize)
                image = canvasView.drawing.image(from: imgRect, scale: 1.0)
            }) {
                Text("Save")
            }
        }
    }
}


struct PenKitRepre : UIViewRepresentable {
    @Binding var canvasView: PKCanvasView
    @Binding var drawingSize: CGSize
    
    func makeUIView(context: Context) -> PKCanvasView {
        canvasView.tool = PKInkingTool(.pen, color: .black, width: 3)
        canvasView.drawingPolicy = .anyInput
        canvasView.contentSize = drawingSize
        return canvasView
    }
    
    func updateUIView(_ uiView: PKCanvasView, context: Context) {
        
    }
}
Другие вопросы по тегам