LoginSignup
11
9

More than 3 years have passed since last update.

PencilKit で描いた絵から UIImage を取得する

Last updated at Posted at 2019-09-24

概要

  • PencilKit を使用して描いた絵から UIImage を取得するコードを書く
  • PKDrawing.image を使用して UIImage を取得する

今回の環境

  • Xcode 11.0
  • Swift 5.1

プロジェクトの作成

Xcode にてテンプレートから iOS + Single View App を選択する。

pencil-kit-1.png

以下のオプションを選択する。

  • Language: Swift
  • User Interface: Storyboard

pencil-kit-2.png

プロジェクトを作成すると AppDelegate.swift, SceneDelegate.swift, ViewController.swift という Swift のソースコードが用意される。

ソースコード

ViewController.swift を以下のコードに置き換える。

import UIKit
import PencilKit // PencilKit を使う

class ViewController: UIViewController {

    var canvasView: PKCanvasView? // 描画キャンバス
    var imageView: UIImageView? // UIImage表示領域

    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.

        // 横幅の1/4をビュー配置の基本サイズとする
        let unit = view.frame.width / 4

        // PKCanvasView: 描画キャンバス
        let canvasView = PKCanvasView(frame: CGRect(x: 0, y: 0, width: unit * 2, height: unit * 2))
        canvasView.tool = PKInkingTool(.pen, color: .black, width: 30)
        view.addSubview(canvasView)
        self.canvasView = canvasView

        // PKToolPicker: ドラッグして移動できるツールパレット (ペンや色などを選択できるツール)
        if let window = UIApplication.shared.windows.first {
            if let toolPicker = PKToolPicker.shared(for: window) {
                toolPicker.addObserver(canvasView)
                toolPicker.setVisible(true, forFirstResponder: canvasView)
                canvasView.becomeFirstResponder()
            }
        }

        // UIImage表示ボタン
        let button = UIButton(frame: CGRect(x: unit * 2, y: 0, width: unit, height: unit))
        button.setTitle("UIImage表示ボタン", for: .normal)
        button.setTitleColor(UIColor.green, for: .normal)
        button.setTitle("UIImage表示ボタン", for: .highlighted)
        button.setTitleColor(UIColor.brown, for: .highlighted)
        button.backgroundColor = UIColor.blue
        button.addTarget(self, action: #selector(ViewController.onClickButton(sender:)), for: .touchUpInside)
        view.addSubview(button)

        // UIImage表示領域
        let imageView = UIImageView(frame: CGRect(x: unit * 2, y: unit, width: unit, height: unit))
        view.addSubview(imageView)
        self.imageView = imageView
    }

    // UIImage表示ボタンがクリックされたときに呼び出される
    @objc internal func onClickButton(sender: UIButton) {
        let unit = self.view.frame.width / 4
        // PKDrawing.image で UIImage を取得する
        // UIImage として取得したい PKCanvasView の範囲を from に指定
        // 画像の拡大率を scale に指定
        let image = canvasView?.drawing.image(from: CGRect(x: 0, y: 0, width: unit * 2, height: unit * 2), scale: 1.0)
        DispatchQueue.main.async {
            self.imageView?.image = image
        }
    }
}

実機での実行結果

実機 (iPad Pro 11-inch + iPadOS 13.1) にインストールして実行してみる。
右上の「UIImage表示ボタン」を押すと、左側に描いた絵の UIImage を取得して、右下の領域に表示している。

PencilKit-UIImage.png

参考資料

11
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
11
9