Open churabou opened 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
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のように変換したい
マスクをするときalpha値の0-1を使うか、グレイスケールの0-1を使うか