ios uiimagepickercontroller 选择相册或者拍照上传
首先需要实现UIImagePickerControllerDelegate 代理 实现其imagePickerController 方法 这里用于选择图片或的拍照回调
//调用相机拍照 或者 图库选择
let picker = UIImagePickerController()
picker.sourceType = .camera //图库 .photoLibrary
picker.delegate = self
picker.allowsEditing = true #开启图片编辑裁剪 会有正方形的选框显示
UIApplication.shared.keyWindow?.rootViewController?.present(picker, animated: true, completion: nil) //图片回调方法
func imagePickerController(_ picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [UIImagePickerController.InfoKey : Any]) {
// 获取选择的裁剪后的图片 fixOrientation 处理旋转不正常问题 并压缩到300*300
let pickedImage = (info[UIImagePickerController.InfoKey.editedImage] as! UIImage).fixOrientation().scaleToSize(size: CGSize(width: 300, height: 300))
// 是否支持相册
if UIImagePickerController.isValidImagePickerType(type: UIImagePickerType.UIImagePickerTypePhotoLibrary) { // 相册
} else if (UIImagePickerController.isValidImagePickerType(type: UIImagePickerType.UIImagePickerTypeCamera)){ // 相机
// 图片保存到相册
UIImageWriteToSavedPhotosAlbum(pickedImage, self, Selector(("imageSave:error:contextInfo:")), nil)
}
//这里是个回调结构体 在使用的地方实现这个结构体即可获取到处理好的图片
if self.selectedImageBlock != nil {
self.selectedImageBlock!(pickedImage)
}
picker.dismiss(animated: true) {
}
} //取消图片选择框
func imagePickerControllerDidCancel(_ picker: UIImagePickerController) {
picker.dismiss(animated: true, completion: nil)
}
相关定义的方法
extension UIImage {
/// 修复图⽚旋转
func fixOrientation() -> UIImage {
if self.imageOrientation == .up {
return self
}
var transform = CGAffineTransform.identity
switch self.imageOrientation {
case .down, .downMirrored:
transform = transform.translatedBy(x: self.size.width, y: self.size.height)
transform = transform.rotated(by: .pi)
break
case .left, .leftMirrored:
transform = transform.translatedBy(x: self.size.width, y: 0)
transform = transform.rotated(by: .pi / 2)
break
case .right, .rightMirrored:
transform = transform.translatedBy(x: 0, y: self.size.height)
transform = transform.rotated(by: -.pi / 2)
break
default:
break
}
switch self.imageOrientation {
case .upMirrored, .downMirrored:
transform = transform.translatedBy(x: self.size.width, y: 0)
transform = transform.scaledBy(x: -1, y: 1)
break
case .leftMirrored, .rightMirrored:
transform = transform.translatedBy(x: self.size.height, y: 0);
transform = transform.scaledBy(x: -1, y: 1)
break
default:
break
}
let ctx = CGContext(data: nil, width: Int(self.size.width), height:
Int(self.size.height), bitsPerComponent: self.cgImage!.bitsPerComponent,
bytesPerRow: 0, space: self.cgImage!.colorSpace!, bitmapInfo:
self.cgImage!.bitmapInfo.rawValue)
ctx?.concatenate(transform)
switch self.imageOrientation {
case .left, .leftMirrored, .right, .rightMirrored:
ctx?.draw(self.cgImage!, in: CGRect(x: CGFloat(0), y: CGFloat(0), width:
CGFloat(size.height), height: CGFloat(size.width)))
break
default:
ctx?.draw(self.cgImage!, in: CGRect(x: CGFloat(0), y: CGFloat(0), width:
CGFloat(size.width), height: CGFloat(size.height)))
break
}
let cgimg: CGImage = (ctx?.makeImage())!
let img = UIImage(cgImage: cgimg)
return img
} //将图⽚裁剪成指定⽐例(多余部分⾃动删除)
func crop(ratio: CGFloat) -> UIImage {
//计算最终尺⼨
var newSize:CGSize!
if size.width/size.height > ratio {
newSize = CGSize(width: size.height * ratio, height: size.height)
}else{
newSize = CGSize(width: size.width, height: size.width / ratio)
} ////图⽚绘制区域
var rect = CGRect.zero
rect.size.width = size.width
rect.size.height = size.height
rect.origin.x = (newSize.width - size.width ) / 2.0
rect.origin.y = (newSize.height - size.height ) / 2.0 //绘制并获取最终图⽚
UIGraphicsBeginImageContext(newSize)
draw(in: rect)
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage!
} //压缩图⽚宽⾼
func scaleToSize(size:CGSize) -> UIImage{
UIGraphicsBeginImageContext(size)
self.draw(in: CGRect(x: 0, y: 0, width: size.width, height: size.height))
let scaledImage = UIGraphicsGetImageFromCurrentImageContext()
UIGraphicsEndImageContext()
return scaledImage!
}
}
// 相机相关扩展类⽅法
import UIKit
import Photos
/// 相⽚选择器类型:相册 PhotoLibrary,图库 SavedPhotosAlbum,相机Camera,前置摄像头 Front,后置摄像头 Rear
public enum UIImagePickerType:Int {
/// 相册 PhotoLibrary
case UIImagePickerTypePhotoLibrary = 1
/// 图库 SavedPhotosAlbum
case UIImagePickerTypeSavedPhotosAlbum = 2
/// 相机 Camera
case UIImagePickerTypeCamera = 3
/// 前置摄像头 Front
case UIImagePickerTypeCameraFront = 4
/// 后置摄像头 Rear
case UIImagePickerTypeCameraRear = 5
}
extension UIImagePickerController {
// MARK: - 设备使⽤有效性判断
// 相册 PhotoLibrary,图库 SavedPhotosAlbum,相机 Camera,前置摄像头Front,后置摄像头 Rear
public class func isValidImagePickerType(type
imagePickerType:UIImagePickerType) -> Bool {
switch imagePickerType {
case .UIImagePickerTypePhotoLibrary:
if self.isValidPhotoLibrary {
return true
}
return false
case .UIImagePickerTypeSavedPhotosAlbum:
if self.isValidSavedPhotosAlbum {
return true
}
return false
case .UIImagePickerTypeCamera:
if self.isValidCameraEnable && self.isValidCamera {
return true
}
return false
case .UIImagePickerTypeCameraFront:
if self.isValidCameraEnable && self.isValidCameraFront {
return true
}
return false
case .UIImagePickerTypeCameraRear:
if self.isValidCamera && self.isValidCameraRear {
return true
}
return false
}
} /// 相机设备是否启⽤
public class var isValidCameraEnable:Bool{
get {
let cameraStatus =
AVCaptureDevice.authorizationStatus(for: AVMediaType.audio)
if cameraStatus == AVAuthorizationStatus.denied {
return false
}
return true
}
} /// 相机Camera是否可⽤(是否有摄像头)
public class var isValidCamera:Bool{
get {
if
UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.Sourc
eType.camera){
return true
}
return false
}
} /// 前置相机是否可⽤
public class var isValidCameraFront:Bool{
get {
if
UIImagePickerController.isCameraDeviceAvailable(UIImagePickerController.Ca
meraDevice.front){
return true
}
return false
}
} /// 后置相机是否可⽤
public class var isValidCameraRear:Bool{
get {
if
UIImagePickerController.isCameraDeviceAvailable(UIImagePickerController.Ca
meraDevice.rear){
return true
}
return false
}
} /// 相册PhotoLibrary是否可⽤
public class var isValidPhotoLibrary:Bool{
get {
if
UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.Sourc
eType.photoLibrary) {
return true
}
return false
}
} /// 图库SavedPhotosAlbum是否可⽤
public class var isValidSavedPhotosAlbum:Bool {
get {
if
UIImagePickerController.isSourceTypeAvailable(UIImagePickerController.Sourc
eType.savedPhotosAlbum) {
return true
}
return false
}
} // MARK: - 属性设置
func setImagePickerStyle(bgroundColor:UIColor?, titleColor:UIColor?,
buttonTitleColor:UIColor?) {
// 改navigationBar背景⾊
if let bgroundColor:UIColor = bgroundColor {
self.navigationBar.barTintColor = bgroundColor
} // 改navigationBar标题⾊
if let titleColor:UIColor = titleColor {
self.navigationBar.titleTextAttributes =
[NSAttributedString.Key.foregroundColor: titleColor]
} // 改navigationBar的button字体⾊
if let buttonTitleColor:UIColor = buttonTitleColor {
self.navigationBar.tintColor = buttonTitleColor
}
}
}
//拿到图片后我们使用ALamofire上传
//url 上传url地址
//image 需要上传的uiimage
//execute 回调函数
func upload(_ url:String,image:UIImage,execute:@escaping (Int,JSON) -> Void){
let headers:HTTPHeaders = [
"headerkey": "headerVal",
]
//Alamofire.upload(image.jpegData(compressionQuality: 0.5)!, to: url)
Alamofire.upload(multipartFormData: {(data) in
data.append(image.jpegData(compressionQuality: 0.6)!, withName: "file",fileName: "\(Date().timeIntervalSince1970).jpg",mimeType: "image/jpeg")
},to: url as URLConvertible,method: .post,headers: headers, encodingCompletion: {(result) in
switch result{
case .success(let upload,_,_):
upload.responseJSON{response in
guard let result = response.result.value else { return }
print("json:\(result)")
let json = JSON(result)
execute(json["code"].intValue,,nil)
}
break
case .failure(let err):
print(err)
execute(-1,nil)
break
}
print(result)
})
}
ios uiimagepickercontroller 选择相册或者拍照上传的更多相关文章
- 相册选择头像或者拍照 上传头像以NSData 图片二进制格式 表单上传
一.点击头像图片 或者按钮 在相册选择照片返回img,网络上传头像要用data表单上传 (1)上传头像属性 // 图片二进制格式 表单上传 @property (nonatomic, strong) ...
- ios系统下,html5拍照上传的压缩处理
http://gokercebeci.com/dev/canvasresize 通过canvas和base64的处理方式实现大尺寸照片的压缩和上传 介绍: https://github.com/zev ...
- Android选择系统相册或拍照上传
PhotoUtils.rar
- 微信JS-SDK选择相册或拍照并上传PHP实现
理解:微信上传接口是拍照,或者选择本地照片,上传到微信的服务器,获取到一个id,通过token与这个id获取到图片,保存到服务器即可. 效果 通过微信js接口,调用底层程序. 需要引入js文件,并进行 ...
- iOS拍照上传后,在web端显示旋转 Swift+OC版解决方案
问题描述: 手机头像上传,遇到一个怪现象,就是拍照上传时,手机端显示头像正常,但在web端查看会有一个左旋90度的问题. 并且照片竖怕才会有此问题,横拍不存在. 原因分析: 手机拍照时,用相机拍摄出来 ...
- webAPP如何实现移动端拍照上传(Vue组件示例)?
摘要:使用HTML5编写移动Web应用,主要是为了尝试一下“一套代码多处运行”,一个webapp几乎可以不加修改的运行在PC/Android/iOS等上面运行.但是写到现在觉得虽然这种方式弊大于利,不 ...
- 【Demo】HTML5 拍照上传
本文主要讲解 手机浏览器 如何拍照 为什么会有这个需求 最近做一个项目要用到拍照然后上传照片,但是网页拍照一般都是用Flash做的,而我们主要是H5页面,如果在微信里面有权限就可以通过JSSDK调起摄 ...
- Android仿微信图片上传,可以选择多张图片,缩放预览,拍照上传等
仿照微信,朋友圈分享图片功能 .可以进行图片的多张选择,拍照添加图片,以及进行图片的预览,预览时可以进行缩放,并且可以删除选中状态的图片 .很不错的源码,大家有需要可以下载看看 . 微信 微信 微信 ...
- Android与js交互拍照上传资料
应用场景:h5通知android端拍照,选相册,然后将图片路径上传成功之后,获取到网络路径,将此路径返还给h5界面,并展示出来. android与js快速交互 效果图如下: 1.在Activity ...
随机推荐
- (21)Laplance
这个算法还是用来进行边缘检测的 =============================== #include <opencv2/opencv.hpp> #include <ios ...
- junit基础学习之-多线程测试(6)
步骤: 1.定义单个TestRunner 2.重载单个TestRunner的runTest() 3.定义TestRunner数组,并添加多个TestRunner 4.MultiThreadedTest ...
- [BJDCTF2020]ZJCTF,不过如此
0x00 知识点 本地文件包含伪协议 ?text=php://input //执行 post: I have a dream ?file=php://filter/read/convert.base6 ...
- Webpack - 把json文件打包进js文件
把html文件打包进index.js 1 新建文件 typings.d.ts declare module "*.html" { const content: st ...
- Java算法练习——整数反转
题目链接 题目描述 给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转. 备注 注意: 假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 $[−2^{31}, 2^ ...
- Atomic系列类整体介绍
本博客系列是学习并发编程过程中的记录总结.由于文章比较多,写的时间也比较散,所以我整理了个目录贴(传送门),方便查阅. 并发编程系列博客传送门 本文是转载文章,原文请见此博客,文章主要对java.ut ...
- React + umi +antd+antv/g6 实现力图
官方示例效果:http://antv.alipay.com/zh-cn/g6/2.x/demo/net/2017-link-data.html 改编效果: 实现步骤: 环境:nodejs.yarn/n ...
- n以内的素数
/* 问题描述: 质数又称素数.一个大于1的自然数,除了1和它自身外, 不能被其他自然数整除的数叫做质数: 问题分析: 素数只能被1和自身整除的数.判断一个数是不是素数, 是用2和这个数之间的所有的数 ...
- c++ 正则表达式查找
C++ 正则表达式的使用 需求: 字符串含有除[0-9a-z]之外的字符,均返回失败! #include<regex> smatch result; string reg_str = &q ...
- JavaWeb之搭建自己的MVC框架(二)
1. 前言 在 JavaWeb之搭建自己的MVC框架(一) 中我们完成了URL到JAVA后台方法的最基本跳转.但是实际操作中会发现有一个不方便的地方,现在在com.mvc.controller包中只有 ...