前提・実現したいこと
Swiftで画像のマスク、背景合成を行いたいのですが、方法がわからず困っております。
ネットで調べサンプルなどを見ながら、マスク画像と元画像より切り抜いた画像の作成は行えたのですが、背景(別画像)との
合成の方法がわかりません。
また、切り抜いた画像をUIImageViewに表示、その後カメラロールに保存して見ると、切り抜く前のオリジナルの画像となってしまいます。
該当のソースコード
swift
1 @IBAction func combinedTap(_ sender: Any) { 2 let si = UIImage.init(named: "org.jpg") 3 let mi = UIImage.init(named: "mask.jpg") 4 self.displayView.image = si?.masking(maskImage: mi) 5 6// 7// 本来はここで背景を読みこんんで合成を行いたいです 8// 9 10// 確認用にカメラロールへ保存 11 //タップしたUIImageViewを取得 12 let targetImageView = self.displayView 13 // その中の UIImage を取得 14 let targetImage = targetImageView!.image! 15 //保存するか否かのアラート 16 let alertController = UIAlertController(title: "保存", message: "この画像を保存しますか?", preferredStyle: .alert) 17 //OK 18 let okAction = UIAlertAction(title: "OK", style: .default) { (ok) in 19 //ここでフォトライブラリに画像を保存 20 UIImageWriteToSavedPhotosAlbum(targetImage, self, #selector(self.showResultOfSaveImage(_:didFinishSavingWithError:contextInfo:)), nil) 21 } 22 //CANCEL 23 let cancelAction = UIAlertAction(title: "CANCEL", style: .default) { (cancel) in 24 alertController.dismiss(animated: true, completion: nil) 25 } 26 //OKとCANCELを表示追加し、アラートを表示 27 alertController.addAction(cancelAction) 28 alertController.addAction(okAction) 29 present(alertController, animated: true, completion: nil) 30 31 } 32 33extension UIImage { 34 func masking(maskImage: UIImage?) -> UIImage? { 35 guard let maskImage = maskImage?.cgImage else { 36 return nil 37 } 38 let mask = CGImage(maskWidth: maskImage.width, 39 height: maskImage.height, 40 bitsPerComponent: maskImage.bitsPerComponent, 41 bitsPerPixel: maskImage.bitsPerPixel, 42 bytesPerRow: maskImage.bytesPerRow, 43 provider: maskImage.dataProvider!, 44 decode: nil, shouldInterpolate: false)! 45 46 guard let maskedImage = self.cgImage?.masking(mask) else { 47 return nil 48 } 49 return UIImage(cgImage: maskedImage) 50 }
self.displayView.image = si?.masking(maskImage: mi)
の後にself.displayView.imageをカメラロールに保存しているのですが、オリジナルの画像が保存され、切り抜き画像の保存が行えません。画面での見た目は、切り抜かれた画像(犬)が表示されています。
切り抜き画像の保存方法と切り抜き画像と別に用意した背景画像の合成方法をお教えいただけませんでしょうか。
追記
CIFilterを使用し、合成を行うことができました。
Swift
1 let si = UIImage.init(named: "org.jpg") 2 let mi = UIImage.init(named: "mask.jpg") 3 let bi = UIImage.init(named: "photo.jpg") 4 5 let sci = CIImage(image: si!) 6 let mci = CIImage(image: mi!) 7 let bci = CIImage(image: bi!) 8 9 let compositeImage = CIFilter(name: "CIBlendWithMask", parameters: [ 10 kCIInputImageKey: sci, 11 kCIInputBackgroundImageKey:bci, 12 kCIInputMaskImageKey:mci])?.outputImage 13 self.displayView.image = UIImage(ciImage: compositeImage!)
ただ、合成後の画像がカメラロールに保存できないです。
保存完了のメッセージは出るのですが、カメラロールに存在しません。
何か確認すべき点などございませんでしょうか。
追記2
CIIImageからUIImageへの変換を一旦、CGImageに変換しUIImageに変換することで保存出来ました
swift
1 let context = CIContext() 2 let cgImage = context.createCGImage(compositeImage!,from: compositeImage!.extent) 3 let image2 = UIImage(cgImage: cgImage!) 4 self.displayView.image = image2
回答1件
あなたの回答
tips
プレビュー