iOS实现头像选取(照相或者图片库)、大小等比缩放、生成圆形头像

<span class="comment">//弹出actionsheet。选择获取头像的方式</span>
<span class="comment">//从相册获取图片</span>
-(<span class="keyword">void</span>)takePictureClick:(UIButton *)sender
{
<span class="comment">//	/*注:使用,需要实现以下<a target=_blank target="_blank" title="与协议相关的所有文章" class="c_tag" href="http://www.lvtao.net/tag/%E5%8D%8F%E8%AE%AE" style="color: rgb(51, 102, 153); text-decoration: none;">协议</a>:UIImagePickerControllerDelegate,</span>
<span class="comment">//	 UINavigationControllerDelegate</span>
<span class="comment">//	 */</span>
<span class="comment">//	UIImagePickerController *picker = [[UIImagePickerController alloc]init];</span>
<span class="comment">//	//设置图片源(相簿)</span>
<span class="comment">//	picker.sourceType = UIImagePickerControllerSourceTypeSavedPhotosAlbum;</span>
<span class="comment">//	//设置代理</span>
<span class="comment">//	picker.delegate = self;</span>
<span class="comment">//	//设置可以编辑</span>
<span class="comment">//	picker.allowsEditing = YES;</span>
<span class="comment">//	//打开拾取器界面</span>
<span class="comment">//	[self presentViewController:picker animated:YES completion:nil];</span>
<span class="indent">  </span>UIActionSheet* actionSheet = [[UIActionSheet alloc]
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  initWithTitle:<span class="string">@"请选择文件来源"</span>
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  <span class="keyword">delegate</span>:self
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  cancelButtonTitle:<span class="string">@"取消"</span>
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  destructiveButtonTitle:nil
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>  otherButtonTitles:<span class="string">@"照相机"</span>,<span class="string">@"摄像机"</span>,<span class="string">@"本地相簿"</span>,<span class="string">@"本地视频"</span>,nil];
<span class="indent">  </span>[actionSheet showInView:self.view];
<span class="indent">  </span>
}
<span class="preprocessor">#<span class="keyword">pragma</span> mark -</span>
<span class="preprocessor">#<span class="keyword">pragma</span> UIActionSheet Delegate</span>
- (<span class="keyword">void</span>)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex
{
<span class="indent">  </span>NSLog(<span class="string">@"buttonIndex = [%d]"</span>,buttonIndex);
<span class="indent">  </span><span class="keyword">switch</span> (buttonIndex) {
<span class="indent">  </span><span class="indent">  </span><span class="keyword">case</span> <span class="number">0</span>:<span class="comment">//照相机</span>
<span class="indent">  </span><span class="indent">  </span>{
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.<span class="keyword">delegate</span> = self;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.allowsEditing = YES;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
<span class="comment">//			[self presentModalViewController:imagePicker animated:YES];</span>
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>[self presentViewController:imagePicker animated:YES completion:nil];
<span class="indent">  </span><span class="indent">  </span>}
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword">break</span>;
<span class="indent">  </span><span class="indent">  </span><span class="keyword">case</span> <span class="number">1</span>:<span class="comment">//摄像机</span>
<span class="indent">  </span><span class="indent">  </span>{
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.<span class="keyword">delegate</span> = self;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.allowsEditing = YES;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.videoQuality = UIImagePickerControllerQualityTypeLow;
<span class="comment">//			[self presentModalViewController:imagePicker animated:YES];</span>
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>[self presentViewController:imagePicker animated:YES completion:nil];
<span class="indent">  </span><span class="indent">  </span>}
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword">break</span>;
<span class="indent">  </span><span class="indent">  </span><span class="keyword">case</span> <span class="number">2</span>:<span class="comment">//本地相簿</span>
<span class="indent">  </span><span class="indent">  </span>{
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.<span class="keyword">delegate</span> = self;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.allowsEditing = YES;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
<span class="comment">//			[self presentModalViewController:imagePicker animated:YES];</span>
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>[self presentViewController:imagePicker animated:YES completion:nil];
<span class="indent">  </span><span class="indent">  </span>}
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword">break</span>;
<span class="indent">  </span><span class="indent">  </span><span class="keyword">case</span> <span class="number">3</span>:<span class="comment">//本地视频</span>
<span class="indent">  </span><span class="indent">  </span>{
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>UIImagePickerController *imagePicker = [[UIImagePickerController alloc] init];
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.<span class="keyword">delegate</span> = self;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.allowsEditing = YES;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;
<span class="comment">//			[self presentModalViewController:imagePicker animated:YES];</span>
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>[self presentViewController:imagePicker animated:YES completion:nil];
<span class="indent">  </span><span class="indent">  </span>}
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword">break</span>;
<span class="indent">  </span><span class="indent">  </span><span class="keyword">default</span>:
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span><span class="keyword">break</span>;
<span class="indent">  </span>}
}

<span class="preprocessor">#<span class="keyword">pragma</span> mark -</span>
<span class="preprocessor">#<span class="keyword">pragma</span> UIImagePickerController Delegate</span>
- (<span class="keyword">void</span>)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
<span class="indent">  </span><span class="keyword">if</span> ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:(__bridge NSString *)kUTTypeImage]) {
<span class="indent">  </span><span class="indent">  </span>UIImage *img = [info objectForKey:UIImagePickerControllerEditedImage];
<span class="indent">  </span><span class="indent">  </span>[self performSelector:@selector(saveImage:)  withObject:img afterDelay:<span class="number">0.5</span>];
<span class="indent">  </span>}
<span class="indent">  </span><span class="keyword">else</span> <span class="keyword">if</span> ([[info objectForKey:UIImagePickerControllerMediaType] isEqualToString:(__bridge NSString *)kUTTypeMovie]) {
<span class="indent">  </span><span class="indent">  </span>NSString *videoPath = [[info objectForKey:UIImagePickerControllerMediaURL] path];
<span class="indent">  </span><span class="indent">  </span>self.fileData = [NSData dataWithContentsOfFile:videoPath];
<span class="indent">  </span>}
<span class="comment">//	[picker dismissModalViewControllerAnimated:YES];</span>
<span class="indent">  </span>[picker dismissViewControllerAnimated:YES completion:nil];
}

- (<span class="keyword">void</span>)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
<span class="comment">//	[picker dismissModalViewControllerAnimated:YES];</span>
<span class="indent">  </span><span class="indent">  </span>[picker dismissViewControllerAnimated:YES completion:nil];
}

- (<span class="keyword">void</span>)saveImage:(UIImage *)image {
<span class="indent">  </span><span class="comment">//	NSLog(@"保存头像!");</span>
<span class="indent">  </span><span class="comment">//	[userPhotoButton setImage:image forState:UIControlStateNormal];</span>
<span class="indent">  </span>BOOL success;
<span class="indent">  </span>NSFileManager *fileManager = [NSFileManager defaultManager];
<span class="indent">  </span>NSError *error;
<span class="indent">  </span>
<span class="indent">  </span>NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
<span class="indent">  </span>NSString *documentsDirectory = [paths objectAtIndex:<span class="number">0</span>];
<span class="indent">  </span>NSString *imageFilePath = [documentsDirectory stringBy<a target=_blank target="_blank" title="与app相关的所有文章" class="c_tag" href="http://www.lvtao.net/tag/app" style="color: rgb(51, 102, 153); text-decoration: none;">app</a>endingPathComponent:<span class="string">@"selfPhoto.jpg"</span>];
<span class="indent">  </span>NSLog(<span class="string">@"imageFile->>%@"</span>,imageFilePath);
<span class="indent">  </span>success = [fileManager fileExistsAtPath:imageFilePath];
<span class="indent">  </span><span class="keyword">if</span>(success) {
<span class="indent">  </span><span class="indent">  </span>success = [fileManager removeItemAtPath:imageFilePath error:&error];
<span class="indent">  </span>}
<span class="comment">//	UIImage *smallImage=[self scaleFromImage:image toSize:CGSizeMake(80.0f, 80.0f)];//将图片尺寸改为80*80</span>
<span class="indent">  </span>UIImage *smallImage = [self thumbnailWithImageWithoutScale:image size:CGSizeMake(<span class="number">93</span>, <span class="number">93</span>)];
<span class="indent">  </span>[UIImageJPE<a target=_blank target="_blank" title="与grep相关的所有文章" class="c_tag" href="http://www.lvtao.net/tag/grep" style="color: rgb(51, 102, 153); text-decoration: none;">grep</a>resentation(smallImage, <span class="number">1.0</span>f) writeToFile:imageFilePath atomically:YES];<span class="comment">//写入文件</span>
<span class="indent">  </span>UIImage *selfPhoto = [UIImage imageWithContentsOfFile:imageFilePath];<span class="comment">//读取图片文件</span>
<span class="comment">//	[userPhotoButton setImage:selfPhoto forState:UIControlStateNormal];</span>
<span class="indent">  </span>self.img.image = selfPhoto;
}

<span class="comment">// 改变图像的尺寸,方便上传服务器</span>
- (UIImage *) scaleFromImage: (UIImage *) image toSize: (CGSize) size
{
<span class="indent">  </span>UIGraphicsBeginImageContext(size);
<span class="indent">  </span>[image drawInRect:CGRectMake(<span class="number">0</span>, <span class="number">0</span>, size.width, size.height)];
<span class="indent">  </span>UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
<span class="indent">  </span>UIGraphicsEndImageContext();
<span class="indent">  </span><span class="keyword">return</span> newImage;
}
2.保持原始图片的长宽比,生成需要尺寸的图片
<span class="comment">//2.保持原来的长宽比,生成一个缩略图</span>
- (UIImage *)thumbnailWithImageWithoutScale:(UIImage *)image size:(CGSize)asize
{
<span class="indent">  </span>UIImage *newimage;
<span class="indent">  </span><span class="keyword">if</span> (nil == image) {
<span class="indent">  </span><span class="indent">  </span>newimage = nil;
<span class="indent">  </span>}
<span class="indent">  </span><span class="keyword">else</span>{
<span class="indent">  </span><span class="indent">  </span>CGSize oldsize = image.size;
<span class="indent">  </span><span class="indent">  </span>CGRect rect;
<span class="indent">  </span><span class="indent">  </span><span class="keyword">if</span> (asize.width/asize.height > oldsize.width/oldsize.height) {
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.size.width = asize.height*oldsize.width/oldsize.height;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.size.height = asize.height;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.origin.x = (asize.width - rect.size.width)/<span class="number">2</span>;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.origin.y = <span class="number">0</span>;
<span class="indent">  </span><span class="indent">  </span>}
<span class="indent">  </span><span class="indent">  </span><span class="keyword">else</span>{
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.size.width = asize.width;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.size.height = asize.width*oldsize.height/oldsize.width;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.origin.x = <span class="number">0</span>;
<span class="indent">  </span><span class="indent">  </span><span class="indent">  </span>rect.origin.y = (asize.height - rect.size.height)/<span class="number">2</span>;
<span class="indent">  </span><span class="indent">  </span>}
<span class="indent">  </span><span class="indent">  </span>UIGraphicsBeginImageContext(asize);
<span class="indent">  </span><span class="indent">  </span>CGContextRef context = UIGraphicsGetCurrentContext();
<span class="indent">  </span><span class="indent">  </span>CGContextSetFillColorWithColor(context, [[UIColor clearColor] CGColor]);
<span class="indent">  </span><span class="indent">  </span>UIRectFill(CGRectMake(<span class="number">0</span>, <span class="number">0</span>, asize.width, asize.height));<span class="comment">//clear background</span>
<span class="indent">  </span><span class="indent">  </span>[image drawInRect:rect];
<span class="indent">  </span><span class="indent">  </span>newimage = UIGraphicsGetImageFromCurrentImageContext();
<span class="indent">  </span><span class="indent">  </span>UIGraphicsEndImageContext();
<span class="indent">  </span>}
<span class="indent">  </span><span class="keyword">return</span> newimage;
}
3.显示圆形头像
NSArray <span class="variable">*paths</span> = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
<span class="indent">  </span>NSString <span class="variable">*documentsDirectory</span> = [paths objectAtIndex:<span class="number">0</span>];
<span class="indent">  </span>NSString <span class="variable">*imageFilePath</span> = [documentsDirectory stringByAppendingPathComponent:<span class="variable">@"</span>selfPhoto.jpg<span class="string">"];
<span class="indent">  </span>NSLog(<span class="variable">@"</span>imageFile->><span class="variable">%@</span>"</span>,imageFilePath);
<span class="indent">  </span>UIImage <span class="variable">*selfPhoto</span> = [UIImage imageWithContentsOfFile:imageFilePath];<span class="regexp">//</span>
<span class="indent">  </span>self.img.image = selfPhoto;
<span class="indent">  </span>[self.img.layer setCornerRadius:CGRectGetHeight([self.img bounds]) / <span class="number">2</span>];  <span class="regexp">//</span>修改半径,实现头像的圆形化
<span class="indent">  </span>self.img.layer.masksToBounds = YES;

猜你喜欢

转载自blog.csdn.net/Remember29/article/details/45338577