churabou / iOS-develop-blog

0 stars 0 forks source link

5月3月(木) #19

Open churabou opened 6 years ago

churabou commented 6 years ago

マスクをするときalpha値の0-1を使うか、グレイスケールの0-1を使うか

churabou commented 6 years ago

    func create(size: CGSize, center: CGPoint, radius: CGFloat, scale: CGFloat) {

        UIGraphicsBeginImageContextWithOptions(size, false, scale)

        let ctx = UIGraphicsGetCurrentContext()!

        ctx.setFillColor(UIColor.black.cgColor)
        ctx.fill(CGRect(origin: .zero, size: size))

        ctx.setFillColor(UIColor.white.cgColor)
        ctx.fillEllipse(in: CGRect(x: center.x-radius,
                                   y: center.y-radius,
                                   width: radius*2,
                                   height: radius*2))

        let image = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()
        editor.imageView.image = image!
    }

size = (1920.0, 1440.0)

実行時間: 0.00875198841094971
実行時間: 0.837202072143555

size = (1920.0, 1440.0)の 1/3

実行時間: 0.00301599502563477
実行時間: 0.0705080032348633

contextは共有される ので初回はcontextの生成に時間がかかり

実行時間: 0.10290801525116
実行時間: 2.0327810049057
churabou commented 6 years ago

class DrawableView: UIImageView {

    override init(frame: CGRect) {
        super.init(frame: frame)
        isUserInteractionEnabled = true
        let panGesture = UIPanGestureRecognizer(target: self, action: #selector(actionPan))
        addGestureRecognizer(panGesture)
    }

    convenience init() {
        self.init(frame: .zero)
    }

    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }

    private var strokeWidth: CGFloat = 30
    private var drawingImage = UIImage() {
        didSet {
            image = drawingImage
        }
    }

    private var preLocation: CGPoint = .zero
    @objc private func actionPan(_ sender: UIPanGestureRecognizer) {

        let location = sender.location(in: self)
        if sender.state == .began {
            preLocation = location
        }
        drawLine(from: preLocation, to: location)
        preLocation = location
    }

    func drawLine(from: CGPoint, to: CGPoint){

        UIGraphicsBeginImageContextWithOptions(bounds.size, false, 0.0)

        guard let ctx = UIGraphicsGetCurrentContext() else {
            fatalError("context is nil")
        }

        ctx.setFillColor(UIColor.blue.cgColor)
        ctx.fill(CGRect(origin: .zero, size: bounds.size))
        drawingImage.draw(at: CGPoint.zero)

        ctx.setLineWidth(strokeWidth)
        ctx.setLineCap(.round)
        ctx.setStrokeColor(UIColor.red.cgColor)
        ctx.move(to: from)
        ctx.addLine(to: to)
        ctx.strokePath()

        drawingImage = UIGraphicsGetImageFromCurrentImageContext()!
        UIGraphicsEndImageContext()
    }
}

一応お絵かきできる。 背景を黒くして、白い線を描くことでグレースケールのマスク画像を作成できる。 しかしこれだとalphaマスクに対応できない。 1、透明な線を描く 2、alphaを白 -> 0 黒 -> 1のように変換したい