質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

Q&A

0回答

638閲覧

カメラ画像に画像を重ねて保存するアプリについて

shsw228

総合スコア20

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

Swift

Swiftは、アップルのiOSおよびOS Xのためのプログラミング言語で、Objective-CやObjective-C++と共存することが意図されています

0グッド

0クリップ

投稿2018/09/05 09:57

現在カメラ画像に対して透過PNGを重ねて保存する,ARカメラのようなものを書いています.
重ねる画像は今の所,iphoneXであればナビゲーションバーを貫通する最下部に接地,左右に触れるように拡大する配置,また撮影は縦画面のみ考えています.

勉強中でひとまず検索して見つけたコードをどうにか形にしたような段階です.的外れなことを言っていたら申し訳ありません.


質問事項は大まかに3つあります
0. プレビュー表示に用いたViewを直接画像に書き出せないのは正しいか
0. 重ねる画像のサイズ指定について
0. Autolayoutのコードでの拘束について

コードのほぼすべてを下に示しております.手探りで無駄,足りないなどツッコミどころが多いと思われます.

自分がコードを読んでいて,
カメラの画像と載せる画像をプレビューで表示するためのViewと,それとは別に保存するために再描画しないといけないと思っていましたがこれは正しいでしょうか?
また,再描画の時点でUIImageViewの位置は使えないのでしょうか?

swift

1frame_image.draw(in:CGRect(x: 0, y: 523, width: self.view.bounds.width, height:289))

暫定的に重ねる画像のyを523とベタ打ち(Autolayoutで配置した際の数値)していますがおそらく自分の環境でしかキレイに出ないことは想像できます.
下基準での画像高さは,画像のサイズ比を出す→画面横幅に掛けて縦を出す→代入が正しい手順でしょうか?

  


最後にAutolayoutについてですが,今回のようにUIImageViewが画面サイズとピッタリ揃う値を代入しているような場合にも拘束は必要なのでしょうか.

一応動いてしまっているのもあり何が良くない書き方なのかがわかりません.
まだ気にするような域でないかもとも思いますが,回答お待ちしております.


対象:ios11.0~
テスト機:iPhoneX iOS 12.0

swift

1import UIKit 2import AVFoundation 3import CoreImage 4 5 6class ViewController: UIViewController,UIGestureRecognizerDelegate, AVCapturePhotoCaptureDelegate { 7 @IBOutlet weak var imageView:UIImageView! 8 var input:AVCaptureDeviceInput! 9 var output:AVCapturePhotoOutput! 10 var session:AVCaptureSession! 11 var preView:UIView! 12 var camera:AVCaptureDevice! 13 let frame_image:UIImage = UIImage(named: "Assetsに登録している素材")! 14 private var photoData: Data? 15 16 17 override func viewDidLoad() { 18 super.viewDidLoad() 19 20 // 画面タップでシャッターを切るための設定 21 let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer( 22 target: self, action: #selector(ViewController.tapped(_:))) 23 // デリゲートをセット 24 tapGesture.delegate = self; 25 // Viewに追加. 26 self.view.addGestureRecognizer(tapGesture) 27 28 imageView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant:0.0).isActive = true 29 imageView.leadingAnchor.constraint(equalTo: view.leadingAnchor,constant:0.0).isActive = true 30 imageView.trailingAnchor.constraint(equalTo: view.trailingAnchor,constant:0.0).isActive = true 31 32 } 33 34 override func viewWillAppear(_ animated: Bool) { 35 // スクリーン設定 36 setupDisplay() 37 // カメラの設定 38 setupCamera() 39 } 40 41 override func viewDidDisappear(_ animated: Bool) { 42 // camera stop メモリ解放 43 session.stopRunning() 44 45 for output in session.outputs { 46 //session.removeOutput((output as? AVCaptureOutput)!) 47 session.removeOutput(output) 48 } 49 50 for input in session.inputs { 51 //session.removeInput((input as? AVCaptureInput)!) 52 session.removeInput(input) 53 } 54 session = nil 55 camera = nil 56 } 57 58 func setupDisplay(){ 59 //スクリーンの幅 60 let screenWidth = UIScreen.main.bounds.size.width; 61 //スクリーンの高さ 62 let screenHeight = UIScreen.main.bounds.size.height; 63 //透過画像定義 64 // プレビュー用のビューを生成 65 preView = UIView(frame: CGRect(x: 0.0, y: 0.0, 66 width: screenWidth, height: screenHeight)) 67 68 69 70 } 71 72 // camera initialize 73 func setupCamera(){ 74 // セッション 75 session = AVCaptureSession() 76 77 // 背面・前面カメラの選択 78 camera = AVCaptureDevice.default( 79 AVCaptureDevice.DeviceType.builtInWideAngleCamera,for: AVMediaType.video,position: .back) 80 // position: .front 81 82 // カメラからの入力データ 83 do { 84 input = try AVCaptureDeviceInput(device: camera) 85 86 } catch let error as NSError { 87 print(error) 88 } 89 90 // 入力をセッションに追加 91 if(session.canAddInput(input)) { 92 session.addInput(input) 93 } 94 95 // 静止画出力のインスタンス生成 96 output = AVCapturePhotoOutput() 97 98 // 出力をセッションに追加 99 if(session.canAddOutput(output)) { 100 session.addOutput(output) 101 } 102 103 // セッションからプレビューを表示を 104 let previewLayer = AVCaptureVideoPreviewLayer(session: session) 105 106 previewLayer.frame = preView.frame 107 previewLayer.videoGravity = AVLayerVideoGravity.resizeAspectFill 108 109 // 画像によってimageviewのサイズを変更 110 imageView.image = frame_image 111 let scale = self.view.bounds.width/frame_image.size.width 112 imageView.translatesAutoresizingMaskIntoConstraints = true 113 imageView.frame = CGRect( 114 x: imageView.frame.minX, 115 y: imageView.frame.minY, 116 width: self.view.bounds.width, 117 height: scale * frame_image.size.height 118 ) 119 120 121 // レイヤーをViewに設定 122 123 self.view.layer.addSublayer(previewLayer) 124 self.view.addSubview(imageView) 125 session.startRunning() 126 } 127 128 129 // タップイベント. 130 @objc func tapped(_ sender: UITapGestureRecognizer){ 131 print("タップ") 132 takeStillPicture() 133 } 134 135 136 func takeStillPicture(){ 137 138 let photoSettings = AVCapturePhotoSettings() 139 photoSettings.flashMode = .auto 140 photoSettings.isAutoStillImageStabilizationEnabled = true 141 photoSettings.isHighResolutionPhotoEnabled = false 142 143 output?.capturePhoto(with: photoSettings, delegate: self) 144 } 145 146 func photoOutput(_ output: AVCapturePhotoOutput,didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) { 147 148 let imageData = photo.fileDataRepresentation() 149 let PhotoData:UIImage? = UIImage(data: imageData!) 150 151 UIGraphicsBeginImageContext(view.frame.size) 152 153 PhotoData?.draw(in:CGRect(origin: CGPoint.zero, size: view.frame.size)) 154 frame_image.draw(in:CGRect(x: 0, y: 523, width: self.view.bounds.width, height:289)) 155 156 let compositedImage = UIGraphicsGetImageFromCurrentImageContext() 157 UIGraphicsEndImageContext() 158 159 160 UIImageWriteToSavedPhotosAlbum(compositedImage!, self, nil, nil) 161 } 162 163 164} 165

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問