这是我的相机应用程序的代码。
ViewController.swift
import UIKit
import AVFoundation
class ViewController: UIViewController, UIGestureRecognizerDelegate {
var input:AVCaptureDeviceInput!
var output:AVCaptureStillImageOutput!
var session:AVCaptureSession!
var preView:UIView!
var camera:AVCaptureDevice!
override func viewDidLoad() {
super.viewDidLoad()
// 画面タップでシャッターを切るための設定
let tapGesture:UITapGestureRecognizer = UITapGestureRecognizer(target: self, action: "tapped:")
// デリゲートをセット
tapGesture.delegate = self;
// Viewに追加.
self.view.addGestureRecognizer(tapGesture)
}
// メモリ管理のため
override func viewWillAppear(animated: Bool) {
// スクリーン設定
setupDisplay()
// カメラの設定
setupCamera()
}
// メモリ管理のため
override func viewDidDisappear(animated: Bool) {
// camera stop メモリ解放
session.stopRunning()
for output in session.outputs {
session.removeOutput(output as? AVCaptureOutput)
}
for input in session.inputs {
session.removeInput(input as? AVCaptureInput)
}
session = nil
camera = nil
}
func setupDisplay(){
//スクリーンの幅
let screenWidth = UIScreen.mainScreen().bounds.size.width;
//スクリーンの高さ
let screenHeight = UIScreen.mainScreen().bounds.size.height;
// プレビュー用のビューを生成
preView = UIView(frame: CGRectMake(0.0, 0.0, screenWidth, screenHeight))
}
func setupCamera(){
// セッション
session = AVCaptureSession()
for caputureDevice: AnyObject in AVCaptureDevice.devices() {
// 背面カメラを取得
if caputureDevice.position == AVCaptureDevicePosition.Back {
camera = caputureDevice as? AVCaptureDevice
}
// 前面カメラを取得
//if caputureDevice.position == AVCaptureDevicePosition.Front {
// camera = caputureDevice as? AVCaptureDevice
//}
}
// カメラからの入力データ
do {
input = try AVCaptureDeviceInput(device: camera) as AVCaptureDeviceInput
} catch let error as NSError {
print(error)
}
// 入力をセッションに追加
if(session.canAddInput(input)) {
session.addInput(input)
}
// 静止画出力のインスタンス生成
output = AVCaptureStillImageOutput()
// 出力をセッションに追加
if(session.canAddOutput(output)) {
session.addOutput(output)
}
// セッションからプレビューを表示を
let previewLayer = AVCaptureVideoPreviewLayer(session: session)
previewLayer.frame = preView.frame
// previewLayer.videoGravity = AVLayerVideoGravityResize
// previewLayer.videoGravity = AVLayerVideoGravityResizeAspect
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill
// レイヤーをViewに設定
// これを外すとプレビューが無くなる、けれど撮影はできる
self.view.layer.addSublayer(previewLayer)
session.startRunning()
}
// タップイベント.
func tapped(sender: UITapGestureRecognizer){
print("タップ")
takeStillPicture()
}
func takeStillPicture(){
// ビデオ出力に接続.
if let connection:AVCaptureConnection? = output.connectionWithMediaType(AVMediaTypeVideo){
// ビデオ出力から画像を非同期で取得
output.captureStillImageAsynchronouslyFromConnection(connection, completionHandler: { (imageDataBuffer, error) -> Void in
// 取得画像のDataBufferをJpegに変換
let imageData:NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer)
// JpegからUIImageを作成.
let image:UIImage = UIImage(data: imageData)!
// アルバムに追加.
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil)
})
}
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
这个应用程序只需拍照并自动保存,不做任何其他事情。要显示刚刚在屏幕上显示的图片,您需要编写什么代码???
答案 0 :(得分:0)
这一行之后:
UIImageWriteToSavedPhotosAlbum(image, self, nil, nil);
使用imageView(从故事板中删除它或通过代码手动添加),然后使用:
设置图像imageView.image = image;