咱们在写代码的时候常常会将头像进行上传服务器,上传头像图片我试过两种方式
一种方式就是使用base64字符串上传图片,这种形式我我的认为比较适合上传图片数量比较少的,好比上传头像,上传图片数量多的话,速度会慢些
另外一种方式是使用二进制流进行上传图片,这种方式上传图片少或者数量多都不要紧,速度也很快
demo地址:
https://github.com/tuwanli/PictureHead
选择头像效果:
程序以下:
ViewController.h
#import
@interface ViewController :
UIViewController
@property (weak,
nonatomic) IBOutlet
UIImageView *headIcon;
- (IBAction)changeIconAction:(UITapGestureRecognizer *)sender;
@end
ViewController.m
#import "ViewController.h"
#import "AFHTTPRequestOperationManager.h"
@interface
ViewController ()
{
UIImagePickerController *pickerController;
AFHTTPRequestOperationManager *manager;
}
@end
@implementation ViewController
- (void)viewDidLoad {
[super
viewDidLoad];
//初始化头像控件
[self
initHeadIcon];
//初始化pickController
[self
createData];
}
- (void)initHeadIcon
{
self.view.backgroundColor = [UIColor
lightGrayColor];
self.headIcon.layer.cornerRadius
= self.headIcon.frame.size.height/2;
self.headIcon.clipsToBounds =
YES;
self.headIcon.layer.borderColor
= [UIColor whiteColor].CGColor;
self.headIcon.layer.borderWidth
= 3;
}
- (void)createData
{
//初始化pickerController
pickerController = [[UIImagePickerController
alloc]init];
pickerController.view.backgroundColor = [UIColor
orangeColor];
pickerController.delegate =
self;
pickerController.allowsEditing =
YES;
}
- (IBAction)changeIconAction:(UITapGestureRecognizer *)sender {
UIActionSheet *actionSheet = [[UIActionSheet
alloc]initWithTitle:@"选择头像"
delegate:self
cancelButtonTitle:@"取消"
destructiveButtonTitle:nil
otherButtonTitles:@"拍照",@"相册",@"图库",
nil];
[actionSheet showInView:[UIApplication
sharedApplication].keyWindow];
}
- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex ==
0) {//相机
if([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera])
{
NSLog(@"支持相机");
[self
makePhoto];
}else{
UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"提示"
message:@"请在设置-->隐私-->相机,中开启本应用的相机访问权限!!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"我知道了",
nil];
[alert
show];
}
}else
if (buttonIndex ==
1){//相片
if([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary])
{
NSLog(@"支持相册");
[self
choosePicture];
}else{
UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"提示"
message:@"请在设置-->隐私-->照片,中开启本应用的相机访问权限!!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"我知道了",
nil];
[alert
show];
}
}else
if (buttonIndex ==
2){//图册
if ([UIImagePickerController
isSourceTypeAvailable:UIImagePickerControllerSourceTypeSavedPhotosAlbum])
{
NSLog(@"支持图库");
[self
pictureLibrary];
// [self presentViewController:picker animated:YES completion:nil];
}else{
UIAlertView *alert = [[UIAlertView
alloc]initWithTitle:@"提示"
message:@"请在设置-->隐私-->照片,中开启本应用的相机访问权限!!"
delegate:self
cancelButtonTitle:@"取消"
otherButtonTitles:@"我知道了",
nil];
[alert
show];
}
}else
if (buttonIndex ==
3){
}
}
//跳转到imagePicker里
- (void)makePhoto
{
pickerController.sourceType =
UIImagePickerControllerSourceTypeCamera;
[self
presentViewController:pickerController
animated:YES
completion:nil];
}
//跳转到相册
- (void)choosePicture
{
pickerController.sourceType =
UIImagePickerControllerSourceTypeSavedPhotosAlbum;
[self
presentViewController:pickerController
animated:YES
completion:nil];
}
//跳转图库
- (void)pictureLibrary
{
pickerController.sourceType =
UIImagePickerControllerSourceTypePhotoLibrary;
[self
presentViewController:pickerController
animated:YES
completion:nil];
}
//用户取消退出picker时候调用
- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
NSLog(@"%@",picker);
[pickerController
dismissViewControllerAnimated:YES
completion:^{
}];
}
//用户选中图片以后的回调
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary
*)info
{
NSLog(@"%s,info == %@",__func__,info);
UIImage *userImage = [self
fixOrientation:[info
objectForKey:@"UIImagePickerControllerOriginalImage"]];
userImage = [self
scaleImage:userImage
toScale:0.3];
//保存图片
// [self saveImage:userImage name:@"某个特定标示"];
[pickerController
dismissViewControllerAnimated:YES
completion:^{
}];
[self.headIcon
setImage:userImage];
self.headIcon.contentMode
= UIViewContentModeScaleAspectFill;
self.headIcon.clipsToBounds =
YES;
//照片上传
[self
upDateHeadIcon:userImage];
}
- (void)upDateHeadIcon:(UIImage *)photo
{
//两种方式上传头像
/*方式一:使用NSData数据流传图片*/
NSString *imageURl =
@"";
manager.responseSerializer = [AFHTTPResponseSerializer
serializer];
manager.responseSerializer.acceptableContentTypes =[NSSet
setWithObject:@"text/html"];
[manager
POST:imageURl parameters:nil
constructingBodyWithBlock:^(id formData) {
[formData appendPartWithFileData:UIImageJPEGRepresentation(photo,
1.0)
name:@"text"
fileName:@"test.jpg"
mimeType:@"image/jpg"];
}
success:^(AFHTTPRequestOperation *operation,
id responseObject) {
}
failure:^(AFHTTPRequestOperation *operation,
NSError *error) {
}];
/*方式二:使用Base64字符串传图片*/
NSData *data =
UIImageJPEGRepresentation(photo, 1.0);
NSString *pictureDataString=[data
base64Encoding];
NSDictionary * dic =
@{@"verbId":@"modifyUserInfo",@"deviceType":@"ios",@"userId":@"",@"photo":pictureDataString,@"mobileTel":@""};
[manager
POST:@""
parameters:dic success:^(AFHTTPRequestOperation *operation,
id responseObject) {
if ([[responseObject
objectForKey:@"flag"]
intValue] == 0) {
}else{
}
}
failure:^(AFHTTPRequestOperation *operation,
NSError *error) {
}];
}
//保存照片到沙盒路径(保存)
- (void)saveImage:(UIImage *)image name:(NSString *)iconName
{
NSArray *paths =
NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask,
YES);
//写入文件
NSString *icomImage = iconName;
NSString *filePath = [[paths
objectAtIndex:0]
stringByAppendingPathComponent:[NSString
stringWithFormat:@"%@.png", icomImage]];
//
保存文件的名称
// [[self getDataByImage:image] writeToFile:filePath atomically:YES];
[UIImagePNGRepresentation(image)writeToFile: filePath
atomically:YES];
}
//缩放图片
- (UIImage *)scaleImage:(UIImage *)image toScale:(float)scaleSize
{
UIGraphicsBeginImageContext(CGSizeMake(image.size.width*scaleSize,image.size.height*scaleSize));
[image
drawInRect:CGRectMake(0,
0, image.size.width * scaleSize, image.size.height *scaleSize)];
UIImage *scaledImage =
UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSLog(@"%@",NSStringFromCGSize(scaledImage.size));
return scaledImage;
}
//修正照片方向(手机转90度方向拍照)
- (UIImage *)fixOrientation:(UIImage *)aImage {
// No-op if the orientation is already correct
if (aImage.imageOrientation ==
UIImageOrientationUp)
return aImage;
CGAffineTransform transform =
CGAffineTransformIdentity;
switch (aImage.imageOrientation) {
case
UIImageOrientationDown:
case
UIImageOrientationDownMirrored:
transform =
CGAffineTransformTranslate(transform, aImage.size.width, aImage.size.height);
transform =
CGAffineTransformRotate(transform,
M_PI);
break;
case
UIImageOrientationLeft:
case
UIImageOrientationLeftMirrored:
transform =
CGAffineTransformTranslate(transform, aImage.size.width,
0);
transform =
CGAffineTransformRotate(transform,
M_PI_2);
break;
case
UIImageOrientationRight:
case
UIImageOrientationRightMirrored:
transform =
CGAffineTransformTranslate(transform,
0, aImage.size.height);
transform =
CGAffineTransformRotate(transform, -M_PI_2);
break;
default:
break;
}
switch (aImage.imageOrientation) {
case
UIImageOrientationUpMirrored:
case
UIImageOrientationDownMirrored:
transform =
CGAffineTransformTranslate(transform, aImage.size.width,
0);
transform =
CGAffineTransformScale(transform, -1,
1);
break;
case
UIImageOrientationLeftMirrored:
case
UIImageOrientationRightMirrored:
transform =
CGAffineTransformTranslate(transform, aImage.size.height,
0);
transform =
CGAffineTransformScale(transform, -1,
1);
break;
default:
break;
}
// Now we draw the underlying CGImage into a new context, applying the transform
// calculated above.
CGContextRef ctx =
CGBitmapContextCreate(NULL, aImage.size.width, aImage.size.height,
CGImageGetBitsPerComponent(aImage.CGImage),
0,
CGImageGetColorSpace(aImage.CGImage),
CGImageGetBitmapInfo(aImage.CGImage));
CGContextConcatCTM(ctx, transform);
switch (aImage.imageOrientation) {
case
UIImageOrientationLeft:
case
UIImageOrientationLeftMirrored:
case
UIImageOrientationRight:
case
UIImageOrientationRightMirrored:
CGContextDrawImage(ctx,
CGRectMake(0,0,aImage.size.height,aImage.size.width),
aImage.CGImage);
break;
default:
CGContextDrawImage(ctx,
CGRectMake(0,0,aImage.size.width,aImage.size.height),
aImage.CGImage);
break;
}
CGImageRef cgimg =
CGBitmapContextCreateImage(ctx);
UIImage *img = [UIImage
imageWithCGImage:cgimg];
CGContextRelease(ctx);
CGImageRelease(cgimg);
return img;
}