Created
October 6, 2015 04:47
-
-
Save chansuke/f0ab88ec6c3960b2af18 to your computer and use it in GitHub Desktop.
Swiftカメラサンプル
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import UIKit | |
import AVFoundation | |
class MSCameraViewController: UIViewController ,AVCaptureMetadataOutputObjectsDelegate { | |
var input:AVCaptureDeviceInput! | |
var output:AVCaptureStillImageOutput! | |
var session:AVCaptureSession! | |
var camera:AVCaptureDevice! | |
var cameraPosition:NSInteger! // 0 = back, 1 = front | |
var previewLayer:AVCaptureVideoPreviewLayer! | |
let x: CGFloat = 0 | |
let y: CGFloat = 0 | |
let width: CGFloat = 350 | |
let height: CGFloat = 350 | |
//var resizedImage: UIImage? | |
@IBOutlet weak var previewView: UIView! | |
@IBOutlet weak var timer: UILabel! | |
@IBOutlet weak var switchCamera: UIView! | |
@IBAction func buttonSwitch(sender:AnyObject) { | |
if self.cameraPosition == 0 { | |
self.cameraPosition = 1 | |
} | |
else { | |
self.cameraPosition = 0 | |
} | |
stopCamera() | |
setupCamera() | |
} | |
var count = 60 | |
override func viewDidLoad() { | |
super.viewDidLoad() | |
self.cameraPosition = 0; | |
setupDisplay() | |
//previewViewのみautolayoutを解除 | |
view.translatesAutoresizingMaskIntoConstraints = true | |
//previewViewのサイズを変更 | |
//CGRectMake(x,y,width,height)を定数で持たせる | |
previewView.frame = CGRectMake(x, y, width, height) | |
//UIGraphicsBeginImageContextWithOptions(previewView.frame.size, false, 0.0) | |
//let context = UIGraphicsGetCurrentContext(); | |
//self.layer.renderInContext(context) | |
//let image = UIGraphicsGetImageFromCurrentImageContext(); | |
//UIGraphicsEndImageContext(); | |
setupCamera() | |
var timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("update"), userInfo: nil, repeats: true) | |
} | |
override func viewDidDisappear(animated: Bool) { | |
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 | |
} | |
override func didReceiveMemoryWarning() { | |
super.didReceiveMemoryWarning() | |
// Dispose of any resources that can be recreated. | |
} | |
func stopCamera() { | |
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 | |
previewLayer.removeFromSuperlayer() | |
} | |
func setupDisplay() { | |
} | |
func setupCamera() { | |
session = AVCaptureSession() | |
for captureDevice: AnyObject in AVCaptureDevice.devices() { | |
if self.cameraPosition == 0 { | |
if captureDevice.position == AVCaptureDevicePosition.Back { | |
camera = captureDevice as? AVCaptureDevice | |
} | |
} | |
else { | |
if captureDevice.position == AVCaptureDevicePosition.Front { | |
camera = captureDevice as? AVCaptureDevice | |
} | |
} | |
} | |
input = try? AVCaptureDeviceInput(device: camera) | |
if session.canAddInput(input) { | |
session.addInput(input); | |
} | |
output = AVCaptureStillImageOutput(); | |
if session.canAddOutput(output) { | |
session.addOutput(output); | |
} | |
let previewLayer : AVCaptureVideoPreviewLayer = AVCaptureVideoPreviewLayer.init(session: session) | |
// previewLayer.frame = self.view.bounds | |
// previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill | |
previewLayer.frame = previewView.frame | |
previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill | |
previewView.layer.insertSublayer(previewLayer, atIndex: 0) | |
session.startRunning(); | |
} | |
func update() { | |
if(count >= 0) | |
{ | |
timer.text = String(count--) | |
} | |
} | |
func takeStillPicture() { | |
if var connection:AVCaptureConnection? = output.connectionWithMediaType(AVMediaTypeVideo) { | |
output.captureStillImageAsynchronouslyFromConnection(connection, completionHandler: { (imageDataBuffer, error) -> Void in | |
let imageData:NSData = AVCaptureStillImageOutput.jpegStillImageNSDataRepresentation(imageDataBuffer) | |
//previeViewと同じ大きさ | |
let image:UIImage = UIImage(data: imageData)! | |
let imageView = UIImageView(image: image) | |
imageView.contentMode = UIViewContentMode.ScaleAspectFill | |
imageView.clipsToBounds = true | |
// | |
/* | |
let resizedSize = CGSizeMake(350, 350) | |
UIGraphicsBeginImageContext(resizedSize) | |
image.drawInRect(CGRectMake(0, 0, resizedSize.height, resizedSize.width)) | |
let resizedImage = UIGraphicsGetImageFromCurrentImageContext(); | |
UIGraphicsEndImageContext() | |
//imageはUIImageのこと | |
UIImageWriteToSavedPhotosAlbum(resizedImage!, self, nil, nil) | |
*/ | |
//self.performSegueWitdhIdentifier("ResultViewController", sender: nil) | |
self.performSegueWithIdentifier("ResultViewController", sender: imageView.image!) | |
}) | |
} | |
} | |
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?){ | |
let secondViewController:MSResultViewController = segue.destinationViewController as! MSResultViewController | |
//secondViewController.resultImageView?.image = self.resizedImage! | |
secondViewController.resultimg = sender as! UIImage | |
print("cont\(secondViewController.resultImageView)") | |
} | |
@IBAction func takePhoto(sender: AnyObject) { | |
takeStillPicture() | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment