酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

Swiftでマスク画像を使って切り抜く

Swiftでマスク画像を使って、UIImageの画像を切り抜きたい(マスキングしたい)と思います。

f:id:ch3cooh393:20190620133019p:plain

マスク画像を使って切り抜く

マスク画像を使って切り抜くのは昔からありますが、UIImageView#tintColorが使えるようになったこともあり、最近実装することがありませんでした。単色であればUIImageView#tintColorを使う方が楽です。

例図のように写真をベースに使いたい場合などに利用できます。

extension UIImage {
    
    // 指定したマスク画像を利用して元画像を切り抜く
    // マスク画像は非透過画像を利用する (輝度情報からマスクを作成している模様)
    func masking(maskImage: UIImage?) -> UIImage? {
        guard let maskImage = maskImage?.cgImage else {
            return nil
        }
        
        //マスクを作成する
        let mask = CGImage(maskWidth: maskImage.width,
                           height: maskImage.height,
                           bitsPerComponent: maskImage.bitsPerComponent,
                           bitsPerPixel: maskImage.bitsPerPixel,
                           bytesPerRow: maskImage.bytesPerRow,
                           provider: maskImage.dataProvider!,
                           decode: nil, shouldInterpolate: false)!
        
        //マスクを適用する
        guard let maskedImage = self.cgImage?.masking(mask) else {
            return nil
        }
        return UIImage(cgImage: maskedImage)
    }
}

実際に使ってみると下記のようになります。実際には元画像とマスク画像のサイズが一緒になっていることの方が稀でしょうから、元画像をリサイズしたりともう一手間が必要になります。

class ViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    
    override func viewDidLoad() {
        super.viewDidLoad()
        // Do any additional setup after loading the view.
        
        let sourceImage = UIImage(named: "pict")
        let maskImage = UIImage(named: "mask")
        
        //マスクで切り取って抜く
        imageView.image = sourceImage?.masking(maskImage: maskImage)
    }
}

関連記事

このほかにもiOSアプリ開発で見つけたネタや悩んだ内容など紹介しています。Tipsをまとめておりますのでこちらのページをご参照ください。