前提・実現したいこと
度々失礼いたします。
現在、DKImagePickerControllerを導入し4枚の画像を1枚に結合する(コラージュする)機能を作成中です。
コラージュ機能はopenCV(collageImageメソッド)で実装しており、
imageArray[0]に格納されている画像→左上
imageArray[1]に格納されている画像→右上
imageArray[2]に格納されている画像→左下
imageArray[3]に格納されている画像→右下
に配置されるように作っております。
上のスクショのように、取り込む順番を考え4枚の画像を選択して実行したところ
意図した配置となりませんでした。
結果として、
imageArray[0]に4番目に選択した画像
imageArray[1]に1番目に選択した画像
imageArray[2]に3番目に選択した画像
imageArray[3]に2番目に選択した画像
が格納されてしまったということです。
おそらく
self.imageArray.append(image!)
あたりの書き方が問題だと思うのですが、修正すべきか分かりません。
どのようにすれば、選択した順番通りに配列に画像を格納できるでしょうか。
どうかご教授のほど、よろしくお願いします。
該当のソースコード
swift
1// 2// ViewController.swift 3// 4 5import UIKit 6import CropViewController 7import AVFoundation 8import DKImagePickerController 9 10class ViewController: UIViewController, UINavigationControllerDelegate { 11 12 let kGradientLayerName = "Gradient" 13 14 var viewModel: ViewModel = ViewModel() 15 //フラグ 0:加工 1:コラージュ 16 var retouchFlug: Int = 0 17 18 //base 19 @IBOutlet weak var imageSizeLabel: UILabel! 20 @IBOutlet weak var baseView: UIView! 21 @IBOutlet weak var sourceImageView: UIImageView! 22 @IBOutlet weak var sampleImageView: UIImageView! 23 @IBOutlet weak var cropImageView: UIImageView! 24 @IBOutlet weak var retouchSegment: UISegmentedControl! 25 26 //collage 27 var imageArray:[UIImage] = [] 28 29 override func viewDidLoad() { 30 super.viewDidLoad() 31 //略 32 } 33 34///1. 画像取得 35extension ViewController { 36 37 //コラージュボタンを押下したときの処理 38 @IBAction func collageButtonDidtap(sender: AnyObject) { 39 //フラグを1に 40 self.retouchFlug = 1 41 self.pickImages() 42 // imageArrayの要素が4になるまで待ちます 43 wait( { self.imageArray.count < 4 } ) { 44 // 取得しました 45 print("finish") 46 DispatchQueue.global(qos: .default).async { 47 let resultImg = OpenCVManager.shared()?.collageImage(self.imageArray[0], image2: self.imageArray[1], image3: self.imageArray[2], image4: self.imageArray[3]) 48 DispatchQueue.main.async { 49 self.doneRetouch(image: resultImg) 50 } 51 } 52 } 53 } 54 55 // 写真を選択する 56 func pickImages() { 57 let picker = DKImagePickerController() 58 //選択できる写真の最大数を指定 59 picker.maxSelectableCount = 4 60 //カメラモード、写真モードの選択 61 picker.sourceType = .photo 62 //キャンセルボタンの有効化 63 picker.showsCancelButton = true 64 //UIのカスタマイズ 65 picker.UIDelegate = CustomUIDelegate() 66 picker.didSelectAssets = { (assets: [DKAsset]) in 67 for asset in assets { 68 asset.fetchFullScreenImage(completeBlock: { (image, info) in 69 self.imageArray.append(image!) 70 }) 71 } 72 } 73 // 74 self.present(picker, animated: true, completion: nil) 75 } 76 77 /// 条件をクリアするまで待つ関数 78 /// 79 /// - Parameters: 80 /// - waitContinuation: 待機条件 81 /// - compleation: 通過後の処理 82 private func wait(_ waitContinuation: @escaping (()->Bool), compleation: @escaping (()->Void)) { 83 var wait = waitContinuation() 84 // 0.01秒周期で待機条件をクリアするまで待ちます。 85 let semaphore = DispatchSemaphore(value: 0) 86 DispatchQueue.global().async { 87 while wait { 88 DispatchQueue.main.async { 89 wait = waitContinuation() 90 semaphore.signal() 91 } 92 semaphore.wait() 93 Thread.sleep(forTimeInterval: 0.01) 94 } 95 // 待機条件をクリアしたので通過後の処理を行います。 96 DispatchQueue.main.async { 97 compleation() 98 } 99 } 100 } 101 102} 103//略 104} 105
補足情報(FW/ツールのバージョンなど)
Xcode Version 11.4.1
Swift Version 5.0.1
iOS 12.4.7
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/06/03 00:33