質問編集履歴

1

2022/01/27 04:01

投稿

Y_M
Y_M

スコア265

test CHANGED
File without changes
test CHANGED
@@ -1,181 +1,91 @@
1
1
  ###前提・実現したいこと
2
-
3
2
  `AVCaptureSession`を利用して撮影する際に、Viewを上に載せフレームとして撮影できる機能を考え中です。
4
-
5
3
  撮影画面の表示、ボタンでの撮影、撮影した画像の保存までは問題なく実装できました。
6
4
 
7
-
8
-
9
5
  しかし実際に撮影画面で撮影した画像と、保存されている画像ではフレームとして利用している画像が小さくなってしまいます。
10
-
11
6
  検証には`iPhone6`を用いているのですが、保存された画像が`1920×1080`になっています。
12
7
 
13
-
14
-
15
8
  撮影した画像のサイズを、端末の画面サイズと同じに出来れば綺麗に表示されると思うのですが、
16
-
17
9
  撮影する画像のサイズを指定する方法がわかりません。
18
-
19
-
20
10
 
21
11
  サイズを指定する方法、もしくは別の方法があるのか教えていただけませんか?
22
12
 
23
-
24
-
25
13
  ###該当のソースコード
26
-
27
14
  ```swift
28
-
29
15
  import UIKit
30
-
31
16
  import AVFoundation
32
17
 
33
-
34
-
35
18
  class ViewController: UIViewController {
36
-
37
19
 
38
-
39
20
  @IBOutlet weak var overlayView: UIImageView!
40
-
41
21
  @IBOutlet weak var overlayButton: UIButton!
42
-
43
22
 
44
-
45
23
  var mySession: AVCaptureSession!
46
-
47
24
  var myDevice: AVCaptureDevice!
48
-
49
25
  var myImageOutput: AVCaptureStillImageOutput!
50
-
51
26
 
52
-
53
27
  override func viewDidLoad() {
54
-
55
28
  super.viewDidLoad()
56
-
57
29
 
58
-
59
30
  startCaptureDevice()
60
-
61
31
  self.view.bringSubview(toFront: overlayView)
62
-
63
32
  self.view.bringSubview(toFront: overlayButton)
64
-
65
33
  }
66
-
67
34
 
68
-
69
35
  func startCaptureDevice() {
70
-
71
36
  mySession = AVCaptureSession()
72
-
73
37
 
74
-
75
38
  let devices = AVCaptureDevice.devices()
76
-
77
39
 
78
-
79
40
  for device in devices! {
80
-
81
41
  if (device as AnyObject).position == AVCaptureDevicePosition.back {
82
-
83
42
  myDevice = device as! AVCaptureDevice
84
-
85
43
  }
86
-
87
44
  }
88
-
89
45
 
90
-
91
46
  let videoInput = try! AVCaptureDeviceInput.init(device: myDevice)
92
-
93
47
  mySession.addInput(videoInput)
94
-
95
48
 
96
-
97
49
  myImageOutput = AVCaptureStillImageOutput()
98
-
99
50
 
100
-
101
51
  mySession.addOutput(myImageOutput)
102
-
103
52
 
104
-
105
53
  let myVideoLayer = AVCaptureVideoPreviewLayer.init(session: mySession)
106
-
107
54
  myVideoLayer?.frame = self.view.bounds
108
-
109
55
  myVideoLayer?.videoGravity = AVLayerVideoGravityResizeAspectFill
110
-
111
56
 
112
-
113
57
  self.view.layer.addSublayer(myVideoLayer!)
114
-
115
58
 
116
-
117
59
  mySession.startRunning()
118
-
119
60
  }
120
-
121
61
 
122
-
123
62
  func mixPicture(image: UIImage) {
124
-
125
63
  var cameraImage = image
126
-
127
- let ashikaradaLogo = #imageLiteral(resourceName: "logo")
64
+ let sampleLogo = #imageLiteral(resourceName: "logo")
128
-
129
65
 
130
-
131
66
  UIGraphicsBeginImageContext(CGSize(width: cameraImage.size.width, height: cameraImage.size.height))
132
-
133
67
  cameraImage.draw(at: CGPoint(x: 0, y: 0))
134
-
135
- ashikaradaLogo.draw(at: CGPoint(x: cameraImage.size.width / 2, y: cameraImage.size.height / 2))
68
+ sampleLogo.draw(at: CGPoint(x: cameraImage.size.width / 2, y: cameraImage.size.height / 2))
136
-
137
69
  cameraImage = UIGraphicsGetImageFromCurrentImageContext()!
138
-
139
70
  UIGraphicsEndImageContext()
140
-
141
71
 
142
-
143
72
  UIImageWriteToSavedPhotosAlbum(cameraImage, self, nil, nil)
144
-
145
73
  }
146
-
147
74
 
148
-
149
75
  @IBAction func onClickButton(_ sender: UIButton) {
150
-
151
76
  let myVideoConnection = myImageOutput.connection(withMediaType: AVMediaTypeVideo)
152
-
153
77
 
154
-
155
78
  self.myImageOutput.captureStillImageAsynchronously(from: myVideoConnection, completionHandler: { (imageDataBuffer, error) in
156
-
157
79
  if let e = error {
158
-
159
80
  print(e.localizedDescription)
160
-
161
81
  return
162
-
163
82
  }
164
-
165
83
 
166
-
167
84
  let myImageData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer)
168
-
169
85
  let myImage = UIImage(data: myImageData!)!
170
-
171
86
  self.mixPicture(image: myImage)
172
-
173
87
  })
174
-
175
88
  }
176
-
177
89
 
178
-
179
90
  }
180
-
181
91
  ```