返回顶部
首页 > 资讯 > 移动开发 >iOS自定义相机功能
  • 949
分享到

iOS自定义相机功能

2024-04-02 19:04:59 949人浏览 泡泡鱼
摘要

大多数app都会涉及到上传照片这个功能,图片来源无非是从相册获取或者相机拍摄。如果不是特别要求,调用系统已经满足需求。但对于特殊需求,就需要自定义相机拍摄界面了。 对于无需定制的相机

大多数app都会涉及到上传照片这个功能,图片来源无非是从相册获取或者相机拍摄。如果不是特别要求,调用系统已经满足需求。但对于特殊需求,就需要自定义相机拍摄界面了。

对于无需定制的相机,使用系统的UIKit库里的UIImagePickerController类,几行代码,几个代理方法就可满足所需。但如果要深度定制,就要系统库AVFoundation内部的相关类。

创建自己的相机管理类CameraManager(继承于NSObject)

.h文件

#import <Foundation/Foundation.h>
#import <AVFoundation/AVFoundation.h>
//拍照后的回调,传递拍摄的照片
typedef void(^DidCapturePhotoBlock)(UIImage *stillImage);

@interface PXCameraManager : NSObject

@property (nonatomic, strong) AVCaptureSession *session;//AVCaptureSession对象来执行输入设备和输出设备之间的数据传递

@property (nonatomic, strong) AVCaptureVideoPreviewLayer *previewLayer;//预览图层,来显示照相机拍摄到的画面

@property (nonatomic, strong) AVCaptureDeviceInput *deviceInput;//AVCaptureDeviceInput对象是输入流

@property (nonatomic, strong) AVCaptureStillImageOutput *stillImageOutput;//照片输出流对象

@property (nonatomic, assign) CGRect previewLayerFrame;//拍照区域



//设置拍照区域 (其中targetView为要展示拍照界面的view)
- (void)configureWithtargetViewLayer:(UIView *)targetView previewRect:(CGRect)preivewRect;

//拍照成功回调
- (void)takePicture:(DidCapturePhotoBlock)block;

//添加/移除相机浮层(如果有需求要在相机拍照区域添加浮层的时候使用)
- (void)addCoverImageWithImage:(UIImage *)image;
- (void)removeCoverImageWithImage:(UIImage *)image;

//前后摄像头切换
- (void)switchCameras;

//闪光灯切换
- (void)confiGCameraFlashlight;


@end

.m文件

@property (nonatomic, strong) UIView *preview;//展现拍照区域的view
@property (nonatomic, strong) UIImageView *coverImageView;//拍照区域浮层

@property (nonatomic, assign) BOOL isCaremaBack;
@property (nonatomic, assign) AVCaptureFlashMode flashMode;

//初始化的时候设置自己想要的默认属性
- (instancetype)init{

    self = [super init];
    if (self) {

        self.isCaremaBack = YES;//默认后置摄像头
        self.flashMode = AVCaptureFlashModeAuto;//默认自动闪光灯
    }
    return  self;
}

实现接口的方法

1、准备相关硬件

- (void)configureWithTargetViewLayer:(UIView *)targetView previewRect:(CGRect)preivewRect{

    self.preview = targetView;

    //开始一些相机相关硬件配置    
    [self addSession];//创建session

    [self addVideoPreviewLayerWithRect:preivewRect];//用session 创建 创建layer

    [self addvideoInputBackCamera:self.isCaremaBack];//给session 配置摄像头

    [self addVideoFlashlightWithFlashModel:self.flashMode];//配置闪光灯

    [self addStillImageOutput];//给session 配置输出
}

2、拍照

#pragma mark - 
- (void)takePicture:(DidCapturePhotoBlock)block{

    AVCaptureConnection *captureConnection = [self findCaptureConnection];

    [captureConnection setVideoScaleAndCropFactor:1.0f];

    [_stillImageOutput captureStillImageAsynchronouslyFromConnection:captureConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {

        NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];

        UIImage *image = [UIImage imageWithData:imageData];
        //这里可以根据不同需求对拍摄到的照片做一些压缩或者裁剪的处理,这里我就偷懒不弄了。
        if (block) {
            block(image);
        }
    }];

}

3、切换摄像头

- (void)switchCameras{
    if (!_deviceInput) {
        return;
    }
    [_session beginConfiguration];

    [_session removeInput:_deviceInput];
    self.isCaremaBack = !self.isCaremaBack;
    [self addvideoInputBackCamera:self.isCaremaBack];

    [_session commitConfiguration];
}

4、切换闪光灯

- (void)configCameraFlashlight{

    switch (self.flashMode) {
        case AVCaptureFlashModeAuto:
        {
            self.flashMode = AVCaptureFlashModeOff;
        }
            break;
        case AVCaptureFlashModeOff:
        {
            self.flashMode = AVCaptureFlashModeOn;
        }
            break;
        case AVCaptureFlashModeOn:
        {
            self.flashMode = AVCaptureFlashModeAuto;
        }
            break;
        default:
            break;
    }

    [self addVideoFlashlightWithFlashModel:self.flashMode];

 }

添加/移除 浮层

- (void)addCoverImageWithImage:(UIImage *)image{

    _coverImageView.image = image;
}
- (void)removeCoverImageWithImage:(UIImage *)image{

    _coverImageView.image = nil;

}

下面是配置硬件里的几个方法实现

- (void)addSession{

    if (!self.session) {
        AVCaptureSession *session = [[AVCaptureSession alloc]init];
        self.session = session;
    }
}
- (void)addVideoPreviewLayerWithRect:(CGRect)previewRect{

    if (!self.previewLayer) {
        AVCaptureVideoPreviewLayer *previewLayer = [[AVCaptureVideoPreviewLayer alloc]initWithSession:_session];
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;

        self.previewLayer = previewLayer;

        [self.preview.layer addSublayer:self.previewLayer];

    }

    self.previewLayer.frame = previewRect;
}
- (void)addvideoInputBackCamera:(BOOL)back{

    NSArray *devices = [AVCaptureDevice devices];

    AVCaptureDevice *frontCamera;
    AVCaptureDevice *backCamera;
    //获取 前、后 摄像头
    for (AVCaptureDevice *device in devices) {

        if ([device hasMediaType:AVMediaTypeVideo]) {

            if ([device position] == AVCaptureDevicePositionBack) {

                backCamera = device;

            }else if([device position] == AVCaptureDevicePositionFront){

                frontCamera = device;

            }
        }
    }

    NSError *error = nil;


    if(back){
        AVCaptureDeviceInput *backCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:backCamera error:&error];
        if (!error) {

            if ([_session canAddInput:backCameraDeviceInput]) {

                [_session addInput:backCameraDeviceInput];
                 self.deviceInput = backCameraDeviceInput;

            }else{
                NSLog(@"出错啦");
            }
        }

    }else{

        AVCaptureDeviceInput *frontCameraDeviceInput = [AVCaptureDeviceInput deviceInputWithDevice:frontCamera error:&error];
        if (!error) {

            if ([_session canAddInput:frontCameraDeviceInput]) {

                [_session addInput:frontCameraDeviceInput];
                 self.deviceInput = frontCameraDeviceInput;

            }else{
                NSLog(@"出错啦");
            }
        }
    }


}
- (void)addVideoFlashlightWithFlashModel:(AVCaptureFlashMode )flashModel{

    AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    [device lockForConfiguration:nil];

    if ([device hasFlash]) {
        device.flashMode = self.flashMode;
    }

    [device unlockForConfiguration];
}
- (void)addStillImageOutput{

    if (!self.stillImageOutput) {

        AVCaptureStillImageOutput *stillImageOutput = [[AVCaptureStillImageOutput alloc]init];
        NSDictionary *outPutSettingDict = [[NSDictionary alloc]initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey, nil];
        stillImageOutput.outputSettings = outPutSettingDict;

        [_session addOutput:stillImageOutput];

        self.stillImageOutput = stillImageOutput;
    }


}
- (AVCaptureConnection *)findCaptureConnection{


    AVCaptureConnection *videoConnection;

    for (AVCaptureConnection *connection in _stillImageOutput.connections ) {
        for (AVCaptureInputPort *port in connection.inputPorts) {

            if ([[port mediaType] isEqual:AVMediaTypeVideo]) {

                videoConnection = connection;

                return videoConnection;
            }
        }
    }

    return nil;

}

到此,一个自定义相机的类就有了,要使用的时候,尽管调用吧。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程网。

--结束END--

本文标题: iOS自定义相机功能

本文链接: https://lsjlt.com/news/164782.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • iOS自定义相机功能
    大多数app都会涉及到上传照片这个功能,图片来源无非是从相册获取或者相机拍摄。如果不是特别要求,调用系统已经满足需求。但对于特殊需求,就需要自定义相机拍摄界面了。 对于无需定制的相机...
    99+
    2024-04-02
  • iOS 10自定义相机功能
    本文实例为大家分享了iOS 10自定义相机功能的具体代码,供大家参考,具体内容如下 直接上代码 // // TGCameraVC.swift // TGPhotoPicker /...
    99+
    2022-05-19
    iOS 10 相机
  • iOS开发技巧之自定义相机
    最近公司的项目中用到了相机,由于不用系统的相机,UI给的相机切图,必须自定义才可以。就花时间简单研究了一下相机的自定义。 相机属于系统硬件,这就需要我们来手动调用iPhone的相机硬...
    99+
    2022-05-19
    iOS 相机
  • Android自定义相机实现定时拍照功能
    这篇博客为大家介绍Android自定义相机,并且实现倒计时拍照功能。 首先自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: activity_...
    99+
    2022-06-06
    相机 Android
  • iOS自定义相机实现拍照、录制视频
    本文实例为大家分享了iOS自定义相机实现拍照、录制视频的具体代码,供大家参考,具体内容如下 使用AVFoundation框架。 这里是Demo 首先声明以下对象: #import...
    99+
    2022-05-25
    iOS 拍照 录制视频
  • uniapp怎么自定义相机
    这篇文章主要介绍“uniapp怎么自定义相机”,在日常操作中,相信很多人在uniapp怎么自定义相机问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”uniapp怎么自定义相机”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-07-05
  • Android 用 camera2 API 自定义相机
    前言 笔者因为项目需要自定义相机,所以了解了一下 Android 关于 camera 这块的 API。Android SDK 21(LOLLIPOP) 开始已经弃用了之前的 C...
    99+
    2022-06-06
    自定义 相机 api Android
  • Android自定义照相机详解
    几乎每个APP都会用的相机功能,下面小编把内容整理分享到编程网平台,供大家参考,感兴趣的朋友一起学习吧! 启动相机的两种方式 1.直接启动系统相机 <code clas...
    99+
    2022-06-06
    相机 Android
  • Android中怎么自定义相机
    本篇文章给大家分享的是有关Android中怎么自定义相机,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。使用Android 系统相机的方法:要想让应用有相机的action,咱们就...
    99+
    2023-05-30
    android
  • Android自定义闹钟功能
    Android闹钟alarmManager+PendingIntent的使用方法,供大家参考,具体内容如下 这次给大家分享两种闹钟: 第一种是当到达闹钟时间后执行一次相应的操...
    99+
    2022-06-06
    闹钟 Android
  • Android自定义照相机的实例
    Android自定义照相机实现近期小巫在学校有一个创新项目,也不是最近,是一个拖了很久的项目,之前一直没有去搞,最近因为要中期检查,搞得我跟小组成员一阵忙活,其实开发一款照相机软件并不太难,下面就是通过自定义的方式来实现手机照相的功能。创建...
    99+
    2023-05-31
    android自定义 照相机 roi
  • iOS自定义滑杆效果
    本文实例为大家分享了iOS自定义滑杆的具体代码,供大家参考,具体内容如下 先让我们看看效果: 主要实现的代码: UIImage *thumbWithLevel(float aLev...
    99+
    2024-04-02
  • iOS自定义日期选择器
    前言 封装了一个日期选择器,解决两个问题: 1、点击textField,键盘弹出和日期选择器弹出的逻辑处理; 2、同一个界面需要多次用到日期选择器时,判断点击的textField...
    99+
    2022-05-30
    iOS 日期选择器
  • iOS自定义身份证键盘
    本文实例为大家分享了iOS自定义身份证键盘的具体代码,供大家参考,具体内容如下 项目中有需要需要身份证的输入框, 用自带的输入切换很麻烦(如果最后一位带X), 所以自定义一个身份证输...
    99+
    2022-05-27
    iOS 身份证键盘
  • iOS自定义UITabBar中间按钮
    iOS自定义UITabBar中间按钮的具体代码,供大家参考,具体内容如下 自定义YLTbaBar继承自UITabBar git地址 YLTbaBar.h // // YLTab...
    99+
    2022-05-25
    iOS UITabBar 按钮
  • Android自定义照相机倒计时拍照
    自定义拍照会用到SurfaceView控件显示照片的预览区域,以下是布局文件: 两个TextView是用来显示提示信息和倒计时的秒数的 相关教程:Android开发从相机或...
    99+
    2022-06-06
    倒计时 相机 Android
  • Android自定义相机、预览区域裁剪
    本文实例为大家分享了Android自定义相机,预览区域裁剪的具体代码,供大家参考,具体内容如下 写法一: 预览区域裁剪,方法调用: //按照比例进行裁剪头像区域 Bitmap   ...
    99+
    2024-04-02
  • Android自定义View实现相机对焦框
    前言 在相机APP中,手动对焦时都会出现一个对焦框,告诉用户相机正在对焦。那么这种对焦框是怎么实现的呢?最近项目中有几个需求,实现手动对焦,自动对焦和对焦框。总体来说不是很复杂,在这...
    99+
    2024-04-02
  • uniapp自定义相机实现示例详解
    目录自定义相机起因利用livePusher实现使用效果图拓展实现多种自定义相机水印相机身份证相机人像相机自定义相机 起因 由于最近用uniapp调用原生相机容易出现闪退问题,找了很...
    99+
    2023-03-09
    uniapp自定义相机 uniapp 相机实现
  • Android自定义录制视频功能
    Android录制视频MediaRecorder+SurfaceView的使用方法,供大家参考,具体内容如下 先看效果图: <1>将视频动画显示到Surfac...
    99+
    2022-06-06
    Android
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作