自定义相机(二) -- 拍照

实现功能:

  相机拍照,把图像保持到系统相册。

运行环境:

  1.  XCODE 5.1.1

  2.  真机(IPHONE5  ,  IOS6.1.4)


#import <UIKit/UIKit.h>
#import <AVFoundation/AVFoundation.h> //导入 - "视频流"

@interface MCViewController : UIViewController

@property (strong, nonatomic) AVCaptureSession * captureSession; //AVCaptureSession实例
@property (strong, nonatomic) AVCaptureDeviceInput * videoInput; //持有视频输入实例

@property (strong, nonatomic) AVCaptureStillImageOutput * stillImageOutput; //持有静态图像输出实例

@end


//
// MCViewController.m
// MyCamera

#import "MCViewController.h"

@interface MCViewController ()

@end

@implementation MCViewController

#pragma mark - life cycle

- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];

//开始扑捉会话
[self.captureSession startRunning];
}

- (void)viewWillDisappear:(BOOL)animated
{
[super viewWillDisappear:animated];

//停止扑捉会话
[self.captureSession stopRunning];
}

- (void)viewDidLoad
{
[super viewDidLoad];

//初始化视频流
[self initAv];

//添加拍照按钮
[self addCaptureButton];
}

#pragma mark - 初始化视频流

- (void) initAv
{
//1.1 创建AVCaptureSession
self.captureSession = [[AVCaptureSession alloc] init];
//1.2 指定输入设备。这里使用后摄像头。
AVCaptureDevice * device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
//1.3 创建AVCaptureDeviceInput的实例,将所选设备作为扑捉会话的输入。
// 此外,在将是其添加到回话前请创建好输入,这里需要做个检查。
NSError * error = nil;
self.videoInput = [AVCaptureDeviceInput deviceInputWithDevice:device error:&error];
if (self.videoInput) {
[self.captureSession addInput:self.videoInput];
}
else
{
NSLog(@"input error : %@", error);
}

//2. 创建预览层
AVCaptureVideoPreviewLayer * previewLayer = [AVCaptureVideoPreviewLayer layerWithSession:self.captureSession];
UIView * aView = self.view;
previewLayer.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
[aView.layer addSublayer:previewLayer];

//3. 实现拍照
self.stillImageOutput = [[AVCaptureStillImageOutput alloc] init];
NSDictionary * stillImageOutputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey, nil];
[self.stillImageOutput setOutputSettings:stillImageOutputSettings];
[self.captureSession addOutput:self.stillImageOutput];

}

#pragma mark - 添加按钮 AND 点击按钮事件

- (void)addCaptureButton
{
CGRect frame = CGRectMake(0, 0, 100, 100);
UIButton * btn = [UIButton buttonWithType:UIButtonTypeRoundedRect];
btn.frame = frame;
[btn setTitle:@"拍照" forState:UIControlStateNormal];
btn.backgroundColor = [UIColor clearColor];
btn.tag = 1111;
[btn addTarget:self action:@selector(onClickCaptureButton:) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:btn];
}

-(IBAction)onClickCaptureButton:(id)sender
{
[self takePicture];
}

#pragma mark - 保持图像到相册

- (void)saveImageToPhotos:(UIImage*)savedImage
{
UIImageWriteToSavedPhotosAlbum(savedImage, self, @selector(image:didFinishSavingWithError:contextInfo:), NULL);
}

// 指定回调方法
- (void)image: (UIImage *) image didFinishSavingWithError: (NSError *) error contextInfo: (void *) contextInfo
{
NSString * msg = nil ;
if(error != NULL)
{
msg = @"保存图片失败" ;
}
else
{
msg = @"保存图片成功" ;
}

UIAlertView * alert = [[UIAlertView alloc] initWithTitle:@"保存图片结果提示"
message:msg
delegate:self
cancelButtonTitle:@"确定"
otherButtonTitles:nil];
[alert show];
}

#pragma mark - 拍照函数

//拍照
- (void) takePicture
{
//1.
AVCaptureConnection * stillImageConnection = [self.stillImageOutput.connections objectAtIndex:0];

if ([stillImageConnection isVideoOrientationSupported]) {
[stillImageConnection setVideoOrientation:AVCaptureVideoOrientationPortrait];
}

//2.
[self.stillImageOutput captureStillImageAsynchronouslyFromConnection:stillImageConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

if (imageDataSampleBuffer != NULL)
{
//图像数据类型转换
NSData * imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage * image = [[UIImage alloc] initWithData:imageData];

//保存图像
[self saveImageToPhotos:image];

}
else
{
NSLog(@"Error capturing still image %@", error);
}
}];

}

@end

自定义相机(二) -- 拍照

时间: 2024-12-20 18:02:37

自定义相机(二) -- 拍照的相关文章

Android—实现自定义相机倒计时拍照

这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的秒数的 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" androi

iOS开发笔记17:自定义相机拍照

之前用AVFoundation自定义相机做了拍照与视频相关的东西,为什么要自定义呢?主要是提供更个性化的交互设计,符合app主题,对于视频来说,也便于提供更多丰富有趣的功能.前段时间整理了下拍照部分的功能,主要分为以下五个部分 1.初始化,建立会话,获取摄像头 使用AVCaptureSessionPresetPhoto模式,输出的图片分辨率与系统相机输出的分辨率保持一致 添加后置摄像头与图片输出(默认采用后置摄像头拍摄) 2.嵌入实时预览层 获取实时预览画面,添加手势,初始化时默认在画面中心点对

【Android】自定义相机的实现(支持连续拍照、前后摄像头切换、连续对焦)

~转载请注明http://blog.csdn.net/u013015161/article/details/46921257 介绍 这几天,写了一个自定义照相机的demo,支持连续拍照和摄像头切换.由于自己以前没接触过相关的编程,也算是一个学习的过程,在这里做一下记录,同时也分享出来,并附上源码和工程. 效果如图: 左上角switch切换摄像头,右边snap按钮进行拍照. 一般流程 Android进行拍照,需要调用摄像头类android.hardware.Camera.而要进行预览,则需要用an

自定义相机(三) -- 视频流数据 AND 预览 拍照 变焦

实现功能: 1. 视频流数据 2. 预览和拍照变焦, 所见即所得. 运行环境: 1.  XCODE 5.1.1 2.  真机(IPHONE5  ,  IOS6.1.4) #import <UIKit/UIKit.h> #import <AVFoundation/AVFoundation.h> //导入 - "视频流" @interface MCViewController : UIViewController<AVCaptureVideoDataOutpu

Android Multimedia框架总结(十四)Camera框架初识及自定义相机案例

转载请把头部出处链接和尾部二维码一起转载,本文出自逆流的鱼yuiop:http://blog.csdn.net/hejjunlin/article/details/52738492 前言:国庆节告一段落,又是新一月,上月主要是围绕MediaPlayer相关展开,从今天开始,开始分析多媒体框架中的Camera模块,看下今天的Agenda: Camera拍照 Camera录像 新API android.hardware.camera2 新旧API特点对比 Camera自定义相机 新API andro

Android调用系统相机、自定义相机、处理大图片

Android调用系统相机和自定义相机实例 本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显示出来,该例子也会涉及到Android加载大图片时候的处理(避免OOM),还有简要提一下有些人SurfaceView出现黑屏的原因. Android应用拍照的两种方式,下面为两种形式的Demo展示出来的效果.    知识点: 一.调用系统自带的相机应用 二.自定义我们自己的拍照界面 三.关于计算机解析图片原理(如何正确加载图片到Android应用中) 所需

Android 手把手带你玩转自定义相机

概述 相机几乎是每个APP都要用到的功能,万一老板让你定制相机方不方?反正我是有点方.关于相机的两天奋斗总结免费送给你. 启动相机的两种方式 1.直接启动系统相机 Intent intent = new Intent(); intent.setAction(MediaStore.ACTION_IMAGE_CAPTURE); startActivity(intent); 或者指定返回图片的名称mCurrentPhotoFile Intent intent = new Intent(MediaSto

iOS使用AVCaptureSession自定义相机

转自:http://www.2cto.com/kf/201409/335951.html 关于iOS调用摄像机来获取照片,通常我们都会调用UIImagePickerController来调用系统提供的相机来拍照,这个控件非常好 用.但是有时UIImagePickerController控件无法满足我们的需求,例如我们需要更加复杂的OverlayerView,这时候我们就 要自己构造一个摄像机控件了. 这需要使用AVFoundation.framework这个framework里面的组件了,所以我

android开发——自定义相机开发总结

最近这段时间我一直在开发自定义相机,谷歌了些网上的demo,发现有很多各种各样的问题.最终还是从API的camera类开始学习,进行改进.下面对之前的实现进行一些总结. 官方camera API: http://developer.android.com/guide/topics/media/camera.html 中文翻译: http://www.cnblogs.com/over140/archive/2011/11/16/2251344.html 自定义相机大致实现流程: 预览Camera这