很久没有写博客了,今天特地写了这个,也是一边仿照别人写的demo,注释部分都是需要的。需要的同学可以参考一下。

@IBAction func headImageBtnPage(){  //上传头像

//        let actionSheet = UIAlertController(title: "上传头像", message: nil, preferredStyle: .ActionSheet)

//        let cancelBtn = UIAlertAction(title: "取消", style: .Cancel, handler: nil)

//

//

//        let takePhotos = UIAlertAction(title: "拍照", style: .Destructive, handler: {

//            (action: UIAlertAction) -> Void in

//            //判断是否能进行拍照,可以的话打开相机

//            if UIImagePickerController.isSourceTypeAvailable(.Camera) {

//                let picker = UIImagePickerController()

//                picker.sourceType = .Camera

//                picker.delegate = self

//                picker.allowsEditing = true

//                self.presentViewController(picker, animated: true, completion: nil)

//

//            }

//            else

//            {

//                print("模拟其中无法打开照相机,请在真机中使用");

//            }

//

//        })

//        let selectPhotos = UIAlertAction(title: "相册选取", style: .Default, handler: {

//            (action:UIAlertAction)

//            -> Void in

//            //调用相册功能,打开相册

//            let picker = UIImagePickerController()

//            picker.sourceType = .PhotoLibrary

//            picker.delegate = self

//            picker.allowsEditing = true

//            self.presentViewController(picker, animated: true, completion: nil)

//

//        })

//        actionSheet.addAction(cancelBtn)

//        actionSheet.addAction(takePhotos)

//        actionSheet.addAction(selectPhotos)

//        self.presentViewController(actionSheet, animated: true, completion: nil)

//

}

}

//MARK: imagePickerController代理

func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {

let type: String = (info[UIImagePickerControllerMediaType] as! String)

//当选择类型是图片

if type == "head_icon_demo" {

//修正图片的位置

let image = fixOrientation((info[UIImagePickerControllerOriginalImage] as! UIImage))

//先把图片转成NSData

let data = UIImageJPEGRepresentation(image, 0.5)

//图片保存的路径

//这里将图片放在沙盒的documents文件夹中

//Home目录

let homeDirectory = NSHomeDirectory()

let documentPath = homeDirectory + "/Documents"

//文件管理器

let fileManager: NSFileManager = NSFileManager.defaultManager()

//把刚刚图片转换的data对象拷贝至沙盒中 并保存为image.png

do {

try fileManager.createDirectoryAtPath(documentPath, withIntermediateDirectories: true, attributes: nil)

}

catch _ {

}

fileManager.createFileAtPath(documentPath.stringByAppendingString("/image.png"), contents: data, attributes: nil)

//得到选择后沙盒中图片的完整路径

let filePath: String = String(format: "%@%@", documentPath, "/image.png")

print("filePath:" + filePath)

//发送请求上传头像的网络请求

//            Alamofire.upload(.POST, "http://192.168.3.16:9060/client/updateHeadUrl", multipartFormData: { multipartFormData in

//                let lastData = NSData(contentsOfFile: filePath)

//

//                multipartFormData.appendBodyPart(data: lastData!, name: "image")

//

//                }, encodingCompletion: { response in

//                    picker.dismissViewControllerAnimated(true, completion: nil)

//                    switch response {

//                    case .Success(let upload, _, _):

//                        upload.responseJSON(completionHandler: { (response) in

//                            print(response)

//                            self.imageView.image = UIImage(data: data!)

//

//                        })

//

//                    case .Failure(let encodingError):

//                        print(encodingError)

//                    }

//                })

}

}

func fixOrientation(aImage: UIImage) -> UIImage { //处理头像图片角度问题

// No-op if the orientation is already correct

if aImage.imageOrientation == .Up {

return aImage

}

// We need to calculate the proper transformation to make the image upright.

// We do it in 2 steps: Rotate if Left/Right/Down, and then flip if Mirrored.

var transform: CGAffineTransform = CGAffineTransformIdentity

switch aImage.imageOrientation {

case .Down, .DownMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height)

transform = CGAffineTransformRotate(transform, CGFloat(M_PI))

case .Left, .LeftMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)

transform = CGAffineTransformRotate(transform, CGFloat(M_PI_2))

case .Right, .RightMirrored:

transform = CGAffineTransformTranslate(transform, 0, aImage.size.height)

transform = CGAffineTransformRotate(transform, CGFloat(-M_PI_2))

default:

break

}

switch aImage.imageOrientation {

case .UpMirrored, .DownMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.width, 0)

transform = CGAffineTransformScale(transform, -1, 1)

case .LeftMirrored, .RightMirrored:

transform = CGAffineTransformTranslate(transform, aImage.size.height, 0)

transform = CGAffineTransformScale(transform, -1, 1)

default:

break

}

// Now we draw the underlying CGImage into a new context, applying the transform

// calculated above.

//这里需要注意下CGImageGetBitmapInfo,它的类型是Int32的,CGImageGetBitmapInfo(aImage.CGImage).rawValue,这样写才不会报错

let ctx: CGContextRef = CGBitmapContextCreate(nil, Int(aImage.size.width), Int(aImage.size.height), CGImageGetBitsPerComponent(aImage.CGImage), 0, CGImageGetColorSpace(aImage.CGImage), CGImageGetBitmapInfo(aImage.CGImage).rawValue)!

CGContextConcatCTM(ctx, transform)

switch aImage.imageOrientation {

case .Left, .LeftMirrored, .Right, .RightMirrored:

// Grr...

CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.height, aImage.size.width), aImage.CGImage)

default:

CGContextDrawImage(ctx, CGRectMake(0, 0, aImage.size.width, aImage.size.height), aImage.CGImage)

}

// And now we just create a new UIImage from the drawing context

let cgimg: CGImageRef = CGBitmapContextCreateImage(ctx)!

let img: UIImage = UIImage(CGImage: cgimg)

return img

}

swift上传头像的更多相关文章

  1. html5 上传头像的裁剪

    本示例使用HTML5 canvas,简单的编写了上传头像的裁剪效果,移动端支持拖拽后裁剪, 虽然样式不好看,但是功能还算全: 下图为裁剪后的效果: html部分: <!DOCTYPE html& ...

  2. 完美实现类似QQ的自拍头像、上传头像功能!(Demo 源码)

    现在很多下载客户端程序都需要设定自己头像的功能,而设定头像一般有两种方式:使用摄像头自拍头像,或者选择一个图片的某部分区域作为自己的头像. 一.相关技术 若要实现上述的自拍头像和上传头像的功能,会碰到 ...

  3. Jcrop+uploadify+php实现上传头像预览裁剪

    最近由于项目需要,所以做了一个上传头像预览并且可以预览裁剪的功能,大概思路是上传的图片先保存到服务器,然后通过ajax从服务器获取到图片信息,再利用Jcrop插件进行裁剪,之后通过PHP获取到的四个裁 ...

  4. asp.net mvc上传头像加剪裁功能介绍

    正好项目用到上传+剪裁功能,发上来便于以后使用. 我不能告诉你们其实是从博客园扒的前台代码,哈哈. 前端是jquery+fineuploader+jquery.Jcrop 后台是asp.net mvc ...

  5. 上传头像,界面无跳转,php+js

    上传头像,界面无跳转的方式很多,我用的是加个iframe那种.下面直接上代码. html: //route 为后端接口//upload/avatar 为上传的头像的保存地址//imgurl=/uplo ...

  6. php实现手机拍照上传头像功能

    现在手机拍照很火,那么如何使用手机拍照并上传头像呢?原因很简单,就是数据传递,首先手机传递照片信息,这个就不是post传递 也不是get函数传递, 这个另外一种数据格式传递,使用的是$GLOBALS ...

  7. Android基础之——startActivityForResult启动界面并返回数据,上传头像

    在android应用的开发过程中,常常会出现启动一个界面后填写部分内容后带着数据返回启动前的界面,最典型的应用就是登录过程.在非常多应用程序的模块中,都有"我的"这个模块,在未登录 ...

  8. asp.net mvc上传头像加剪裁功能

    原文:asp.net mvc上传头像加剪裁功能 正好项目用到上传+剪裁功能,发上来便于以后使用. 我不能告诉你们其实是从博客园扒的前台代码,哈哈. 前端是jquery+fineuploader+jqu ...

  9. mvc上传头像加剪裁功能

    asp.net mvc上传头像加剪裁功能 正好项目用到上传+剪裁功能,发上来便于以后使用. 我不能告诉你们其实是从博客园扒的前台代码,哈哈. 前端是jquery+fineuploader+jquery ...

随机推荐

  1. e.target.files[0]层层剖析

    因为我现在拿到的一个功能是上传时过滤掉很大尺寸的图片,所以需要来拿到上传时选择图片的size,所以有了这篇博文 不多说 上代码 $('input').change(function(e){ 1️⃣.c ...

  2. 【翻译】jQuery是有害的

    原文:http://lea.verou.me/2015/04/jquery-considered-harmful/**(第一次翻译,望大家多批评指正) jQuery是有害的 嗨,我总想写一个“X”是有 ...

  3. SharePoint 2013 激活标题字段外的Menu菜单

    前言 SharePoint 有个很特别的字段,就是标题(Title)字段,无论想要链接到项目,还是弹出操作项目的菜单,都是通过标题字段,一直以来需要的时候,都是通过将标题字段改名进行的. 其实,Sha ...

  4. ASP.NET MVC3 Razor 调试与预加载

    目录(?)[-] 获取服务器信息 FormsAuthenticationSlidingExpiration 属性 MVC3预加载   在ASP.NET MVC3开发中,调试中怎么也是不可缺少的,那对于 ...

  5. 47个过程(PMBOK2008)

    项目管理过程 知识领域 过程组 含义 之前应完成 之后要进行 制定项目章程 整合 启动 编写一份正式批准项目并授权项目经理使用组织资源的文件的过程 无 制定项目管理计划 制定项目管理计划 整合 规划 ...

  6. [MySQL Reference Manual]14 InnoDB存储引擎

    14 InnoDB存储引擎 14 InnoDB存储引擎 14.1 InnoDB说明 14.1.1 InnoDB作为默认存储引擎 14.1.1.1 存储引擎的趋势 14.1.1.2 InnoDB变成默认 ...

  7. Python之路:堡垒机实例

    堡垒机前戏 开发堡垒机之前,先来学习Python的paramiko模块,该模块机遇SSH用于连接远程服务器并执行相关操作 SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接: 1 ...

  8. 0027 Java学习笔记-面向对象-(非静态、静态、局部、匿名)内部类

    内部类 内部类就是把一个类写在另一个类的内部 用途: 如果一个类只希望它被某一个类访问,那么可以把它定义在另一个类的内部,并用private修饰 内部类可以访问它所在外部类的private成员:但所在 ...

  9. 设计模式C#实现(十四)——责任链模式

    意图 0 适用性 1 结构 2 实现 3 效果 4 参考 5 意图 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿着这条链传递该请求,直到有一个对象 ...

  10. Shell十三问[转]

    Shell十三问 转载于网络,稍加整理. (一) 为何叫做Shell? 我们知道计算机的运作不能离开硬件,但使用者却无法直接对硬件作驱动,硬件的驱动只能透过一个称为"操作系统(Operati ...