欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

IOS打开系统相机的闪光灯

程序员文章站 2022-03-02 15:08:43
ios有两种的拍照和视频的方式: 1.直接使用uiimagepickercontroller,这个类提供了一个简单便捷的拍照与选择图片库里图片的功能。 2.另一种是通过...

ios有两种的拍照和视频的方式:

1.直接使用uiimagepickercontroller,这个类提供了一个简单便捷的拍照与选择图片库里图片的功能。

2.另一种是通过avfoundation.framework框架完全自定义拍照的界面和选择图片库界面。我只做了第一种,就先给大家介绍第一种做法:

一、首先调用接口前,我们需要先判断当前设备是否支持uiimagepickercontroller,用issourcetypeavailable:来判断是否可用

二、查看符合的媒体类型,这个时候我们调用availablemediatypeforsourcetype:判断

在调用uiimagepickercontroller时我们需要加入他的两个代理方法:

uinavigationcontrollerdelegate和uiimagepickercontrollerdelegate,在调用摄像头的时候还可以调闪光灯,一会代码里有。

要调用闪光灯需要先建一个avcapturesession类的实例对象:

复制代码 代码如下:

//  created by 张茫原 on 13-1-23.
//  copyright (c) 2013年 张茫原. all rights reserved.
//
 
#import <uikit/uikit.h>
//调用闪光灯调用框架
#import <avfoundation/avfoundation.h>
 
@interface cameraviewcontroller : uiviewcontroller<uinavigationcontrollerdelegate, uiimagepickercontrollerdelegate>
{
    avcapturesession * _avsession;//调用闪光灯的时候创建的类
}
 
@property(nonatomic,retain)avcapturesession * avsession;
 
@end

在.m的- (void)viewdidload里建立4button,camera调用相机、library调用图片库、flashlight打开闪光灯、close关闭闪光灯,这里创建button的代码我就不再写了。

复制代码 代码如下:

//打开相机
-(void)addcarema
{
    //判断是否可以打开相机,模拟器此功能无法使用
    if ([uiimagepickercontroller issourcetypeavailable:uiimagepickercontrollersourcetypecamera]) {
        
        uiimagepickercontroller * picker = [[uiimagepickercontroller alloc]init];
        picker.delegate = self;
        picker.allowsediting = yes;  //是否可编辑
        //摄像头
        picker.sourcetype = uiimagepickercontrollersourcetypecamera;
        [self presentmodalviewcontroller:picker animated:yes];
        [picker release];
    }else{
        //如果没有提示用户
        uialertview *alert = [[uialertview alloc] initwithtitle:@"error" message:@"你没有摄像头" delegate:nil cancelbuttontitle:@"drat!" otherbuttontitles:nil];
        [alert show];
    }
}

打开相机后,然后需要调用uiimagepickercontrollerdelegate里的方法,拍摄完成后执行的方法和点击cancel之后执行的方法:

复制代码 代码如下:

//拍摄完成后要执行的方法
-(void)imagepickercontroller:(uiimagepickercontroller *)picker didfinishpickingmediawithinfo:(nsdictionary *)info
{
    //得到图片
    uiimage * image = [info objectforkey:uiimagepickercontrolleroriginalimage];
    //图片存入相册
    uiimagewritetosavedphotosalbum(image, nil, nil, nil);
    [self dismissmodalviewcontrolleranimated:yes];
}
//点击cancel按钮后执行方法
-(void)imagepickercontrollerdidcancel:(uiimagepickercontroller *)picker
{
    [self dismissmodalviewcontrolleranimated:yes];
}

调用相机照片和保存到图片库已经完成。

接着介绍打开照片库:

复制代码 代码如下:

-(void)openpiclibrary
{
    //相册是可以用模拟器打开的
    if ([uiimagepickercontroller issourcetypeavailable:uiimagepickercontrollersourcetypephotolibrary]) {
        uiimagepickercontroller * picker = [[uiimagepickercontroller alloc]init];
        picker.delegate = self;
        picker.allowsediting = yes;//是否可以编辑
        //打开相册选择照片
        picker.sourcetype = uiimagepickercontrollersourcetypephotolibrary;
        [self presentmodalviewcontroller:picker  animated:yes];
        [picker release];
    }else{
        uialertview *alert = [[uialertview alloc] initwithtitle:@"error" message:@"你没有摄像头" delegate:nil cancelbuttontitle:@"drat!" otherbuttontitles:nil];
        [alert show];
    }
}
//选中图片进入的代理方法
-(void)imagepickercontroller:(uiimagepickercontroller *)picker didfinishpickingimage:(uiimage *)image editinginfo:(nsdictionary *)editinginfo
{
    [self dismissmodalviewcontrolleranimated:yes];
}

调用闪光灯的代码,由于我也不是很理解,所以没法加注释,但是已经亲测可用,但是调闪光灯时有一个算是bug吧,闪光灯会闲一下,然后再一直亮

复制代码 代码如下:

-(void)openflashlight
{
    avcapturedevice * device = [avcapturedevice defaultdevicewithmediatype:avmediatypevideo];
    if (device.torchmode == avcapturetorchmodeoff) {
        //create an av session
        avcapturesession * session = [[avcapturesession alloc]init];
        // create device input and add to current session
        avcapturedeviceinput * input = [avcapturedeviceinput deviceinputwithdevice:device error:nil];
        [session addinput:input];
        // create video output and add to current session
        avcapturevideodataoutput * output = [[avcapturevideodataoutput alloc]init];
        [session addoutput:output];
        // start session configuration
        [session beginconfiguration];
        [device lockforconfiguration:nil];
        // set torch to on
        [device settorchmode:avcapturetorchmodeon];
        [device unlockforconfiguration];
        [session commitconfiguration];
        // start the session
        [session startrunning];
        // keep the session around
        [self setavsession:self.avsession];
        [output release];
    }
}
-(void)closeflashlight
{
    [self.avsession stoprunning];
    [self.avsession release];
}

以上所述就是本文的全部内容了,希望大家能够喜欢。