一个简单的换发小程序,可以实现拍照,移动发型,放大缩小发型。

如图:

.h中实现:

#import <UIKit/UIKit.h>@interface ChangeHairVC : UIViewController<UINavigationControllerDelegate,UIActionSheetDelegate,UIImagePickerControllerDelegate,UIGestureRecognizerDelegate>
@property (strong, nonatomic) IBOutlet UIView *photoView;
@property (weak, nonatomic) IBOutlet UIImageView *personImage;
@property (weak, nonatomic) IBOutlet UIImageView *hairImage;//合并图片
- (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2;@end

.m中实现:

#define IsIOS7 ([[[[UIDevice currentDevice] systemVersion] substringToIndex:1] intValue]>=7)
#define IsIPHONE4 ([[UIScreen mainScreen] bounds].size.height < 500)#import "ChangeHairVC.h"@interface ChangeHairVC ()@end@implementation ChangeHairVC {CGSize imageSize;//图片的宽高CGPoint imagePoint;//图片的位置CGPoint startLocation;//移动起始位置CGPoint endLocation;//移动终止位置CGFloat lastScale;}- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];if (self) {// Custom initialization}return self;
}- (void)viewDidLoad
{[super viewDidLoad];// Do any additional setup after loading the view from its nib.self.view.backgroundColor = [UIColor colorWithRed:234/255.0 green:244/255.0 blue:235/255.0 alpha:1];self.photoView.frame = CGRectMake(0, (IsIOS7?20:0)-90, 320, 90);[self.view addSubview:self.photoView];self.personImage.clipsToBounds = YES;self.hairImage.clipsToBounds = YES;[self.hairImage setImage:[UIImage imageNamed:@"jiafa.png"]];//限定显示比例double n = 320/self.personImage.image.size.width;double m = 280/self.hairImage.image.size.width;self.personImage.frame = CGRectMake(0, 44+(IsIOS7?20:0), 320, self.personImage.image.size.height*n);self.hairImage.frame = CGRectMake(20, 64+(IsIOS7?20:0), 280, self.hairImage.image.size.height*m);imageSize.width = self.hairImage.frame.size.width;imageSize.height = self.hairImage.frame.size.height;imagePoint.x = self.hairImage.frame.origin.x;imagePoint.y = self.hairImage.frame.origin.y;//移动发型图片UIPanGestureRecognizer *panGestureRecognizer = [[UIPanGestureRecognizer alloc] initWithTarget:self action:@selector(handlePanGestures:)];panGestureRecognizer.minimumNumberOfTouches = 1;panGestureRecognizer.maximumNumberOfTouches = 1;[self.hairImage addGestureRecognizer:panGestureRecognizer];//放大缩小发型图片UIPinchGestureRecognizer *zoomRecognizer = [[UIPinchGestureRecognizer alloc]initWithTarget:self action:@selector(zoomGesture:)];[zoomRecognizer setDelegate:self];[self.hairImage addGestureRecognizer:zoomRecognizer];}
//合成图片按钮
- (IBAction)mixImage:(id)sender {[self addImage:self.personImage.image toImage:self.hairImage.image];
}//合并图片
- (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2{//设置合成后图片的大小UIGraphicsBeginImageContext(self.personImage.frame.size);[image1 drawInRect:CGRectMake(self.personImage.frame.origin.x, 0, self.personImage.frame.size.width, self.personImage.frame.size.height)];[image2 drawInRect:CGRectMake(self.hairImage.frame.origin.x, 19, self.hairImage.frame.size.width, self.hairImage.frame.size.height)];UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();self.hairImage.hidden = YES;//resultingImage即为合成之后的图片self.personImage.image = resultingImage;return resultingImage;}//放大缩小
-(void)zoomGesture:(UIPinchGestureRecognizer *)sender {//当手指离开屏幕时,将lastscale设置为1.0if(sender.state == UIGestureRecognizerStateEnded) {lastScale = 1.0;return;}if (self.hairImage.frame.origin.x > 0 || self.hairImage.frame.origin.x < [UIScreen mainScreen].bounds.size.width) {CGFloat scale = 1.0 - (lastScale - sender.scale);CGAffineTransform currentTransform = sender.view.transform;CGAffineTransform newTransform = CGAffineTransformScale(currentTransform, scale, scale);[sender.view setTransform:newTransform];lastScale = sender.scale;imageSize.width = self.hairImage.frame.size.width;imageSize.height = self.hairImage.frame.size.height;imagePoint.x = self.hairImage.frame.origin.x;imagePoint.y = self.hairImage.frame.origin.y;}}
#pragma mark - UIGestureRecognizerDelegate
- (BOOL)gestureRecognizer:(UIGestureRecognizer *)gestureRecognizer
shouldRecognizeSimultaneouslyWithGestureRecognizer:(UIGestureRecognizer *)otherGestureRecognizer {return ![gestureRecognizer isKindOfClass:[UIPanGestureRecognizer class]];
}
//移动图片
- (void) handlePanGestures:(UIPanGestureRecognizer*)paramSender{//图片宽高比double m = self.hairImage.frame.size.width/self.hairImage.image.size.width;if (paramSender.state == UIGestureRecognizerStateBegan){//通过使用 locationInView 这个方法,来获取到手势的坐标CGPoint location = [paramSender locationInView:paramSender.view.superview];//记录图片初始位置startLocation.x = location.x;startLocation.y = location.y;}if (paramSender.state == UIGestureRecognizerStateChanged) {CGPoint location = [paramSender locationInView:paramSender.view.superview];//记录图片终止位置endLocation.x = location.x;endLocation.y = location.y;double changeX = endLocation.x - startLocation.x;double changeY = endLocation.y - startLocation.y;//更改图片位置self.hairImage.frame = CGRectMake(imagePoint.x + changeX,  imagePoint.y + changeY,  self.hairImage.frame.size.width, self.hairImage.image.size.height*m);}}
//获取照片
#pragma mark photo
- (IBAction)takePhotoClick:(UIButton *)sender {[UIView animateWithDuration:0.3 animations:^{self.photoView.frame = CGRectMake(0, (IsIOS7?20:0), 320, 90);}completion:^(BOOL finished) {}];
}- (IBAction)photoBtnClick:(UIButton *)sender {if (sender.tag == 1) {[UIView animateWithDuration:0.3 animations:^{self.photoView.frame = CGRectMake(0, (IsIOS7?20:0)-90, 320, 90);self.hairImage.hidden = NO;}completion:^(BOOL finished) {}];if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]){UIImagePickerControllerSourceType sourceType = UIImagePickerControllerSourceTypeCamera;UIImagePickerController *picker = [[UIImagePickerController alloc] init];//初始化picker.delegate = self;picker.allowsEditing = YES;//设置可编辑picker.sourceType = sourceType;//创建叠加层UIView *overLayView=[[UIView alloc]initWithFrame:CGRectMake(0, 120, 320, 254)];//取景器的背景图片,该图片中间挖掉了一块变成透明,用来显示摄像头获取的图片;UIImage *overLayImag=[UIImage imageNamed:@"zhaoxiangdingwei.png"];UIImageView *bgImageView=[[UIImageView alloc]initWithImage:overLayImag];[overLayView addSubview:bgImageView];picker.cameraOverlayView=overLayView;picker.cameraDevice=UIImagePickerControllerCameraDeviceFront;[self presentViewController:picker animated:YES completion:^{}];}else {NSLog(@"无相机");}}else if (sender.tag == 2) {[UIView animateWithDuration:0.3 animations:^{self.photoView.frame = CGRectMake(0, (IsIOS7?20:0)-90, 320, 90);self.hairImage.hidden = NO;}completion:^(BOOL finished) {}];UIImagePickerController *pickerImage = [[UIImagePickerController alloc] init];if([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {pickerImage.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;pickerImage.mediaTypes = [UIImagePickerController availableMediaTypesForSourceType:pickerImage.sourceType];}pickerImage.delegate = self;pickerImage.allowsEditing = NO;[self presentViewController:pickerImage animated:YES completion:^{}];}else if (sender.tag == 3) {[UIView animateWithDuration:0.3 animations:^{self.photoView.frame = CGRectMake(0, (IsIOS7?20:0)-90, 320, 90);}completion:^(BOOL finished) {}];}
}//从相册选择图片后操作
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info {[picker dismissViewControllerAnimated:YES completion:^{}];//NSLog(@"%@",info);UIImage *image = [info objectForKey:UIImagePickerControllerOriginalImage];[self saveImage:image withName:@"currentImage.png"];}- (void)imagePickerControllerDidCancel:(UIImagePickerController *)picker {[picker dismissViewControllerAnimated:YES completion:^{}];
}#pragma mark - 保存图片至沙盒
- (void) saveImage:(UIImage *)currentImage withName:(NSString *)imageName
{NSData *imageData = UIImageJPEGRepresentation(currentImage, 0.5);// 获取沙盒目录NSString *fullPath = [[NSHomeDirectory() stringByAppendingPathComponent:@"Documents"] stringByAppendingPathComponent:imageName];// 将图片写入文件[imageData writeToFile:fullPath atomically:NO];NSLog(@"%@",fullPath);[self.personImage setImage:[UIImage imageWithContentsOfFile:fullPath] ];double n = 320/self.personImage.image.size.width;self.personImage.frame = CGRectMake(0, 44+(IsIOS7?20:0), 320, self.personImage.image.size.height*n);//将图片保存到disk//UIImageWriteToSavedPhotosAlbum(currentImage, nil, nil, nil);
}- (void)viewWillAppear:(BOOL)animated
{[super viewWillAppear:animated];}
- (void)didReceiveMemoryWarning
{[super didReceiveMemoryWarning];// Dispose of any resources that can be recreated.
}@end

完整DEMO下载地址:http://download.csdn.net/detail/u011918080/6975279

iOS图片合成————(拍照换发)相关推荐

  1. iOS 图片合成(一)

    需求:我们要将非固定的文本.图片等信息合成到一张图片上,例如我们要做一个分享的功能,有一张底图,在这底图上我们要把用户的头像和昵称放上去.这里我们用到Quart2D绘图之UIGraphicsBegin ...

  2. IOS 绘图 bitmap 滤镜 图片合成

    CGSize size = CGSizeMake(800, 800);UIGraphicsBeginImageContextWithOptions(size, NO, 1);//1.获取bitmap上 ...

  3. iOS GIF合成有透明通道图片重叠问题

    iOS GIF合成有透明通道图片重叠问题 项目中需要用到合成gif, 如果图片含有透明通道, 则会出现重叠现象, 设置 kCGImagePropertyGIFHasGlobalColorMap 为tr ...

  4. 图片合成gif_谈谈有哪些好用的制作GIF的方式

    今天咱们谈谈计算机上几种制作 GIF 的方式,而且他们都是免费的,但可能需要你会一点计算机操作技能.本文会简单的介绍一些常用的GIF软件,比较一下功能和上手程度.常见的GIF录制方式大概有这么几种方式 ...

  5. Java 实现图片合成

    2019独角兽企业重金招聘Python工程师标准>>> 图片合成 利用Java的绘图方法,实现图片合成 在开始之前,先定一个小目标,我们希望通过图片合成的方式,创建一个类似下面样式的 ...

  6. ios 图片加载内存尺寸_iOS内存分析上-图片加载内存分析

    简介 对于大多数App来说,内存占用主要就是图片.本文将从实用的角度分析,iOS图片的内存占用.测量.优化等. iOS内存-有什么影响 在移动操作系统设备中,是不能像PC一样进行内存swap的,而随着 ...

  7. 百度飞桨AI抠图+图片合成

    考虑到本科学校校庆即将到来,而又刚好学习了百度飞桨AI抠图以及图片合成的相关课程,因而想合成一张自己和本科学校的合照.(由于才疏学浅,略有翻车,请见谅) 使用工具:百度PaddleHub DeepLa ...

  8. android+照片合成,图片合成修图神器手机版

    图片合成修图神器手机版由西西给大家带来,这款软件也是一个非常好用的修图软件,可以帮助大家制作各种的图片,而且模板滤镜也非常的多,喜欢的朋友赶紧来下载图片合成修图神器手机版吧! 图片合成修图神器介绍 [ ...

  9. 图片合成视频+php,将视频和图片合成到一个页面

    2017-12-19 柒儿 15:53:09 柒儿 15:53:18 下载的软件安不上 怎么办 柒儿 15:54:46 在不? 柒儿 15:54:49 急 狸窝宝典 15:56:20 重启电脑试下 狸 ...

最新文章

  1. Windows10远程访问Jupyter notebook
  2. 自动驾驶出行,进入下半场
  3. C#多线程编程介绍——使用thread、threadpool、timer
  4. UOJ #584. 天天去哪吃
  5. 行走在消逝中[LoLi有三好]
  6. java里面的pai_Java - ZhangPai - 博客园
  7. python 求当前小时前n个小时
  8. d盾web查杀 linux,D盾Web查杀
  9. 我的大学--单片机高手郭天祥的学习心得体会
  10. Hadoop经典面试题
  11. Dynamics CRM 365零基础入门学习(一)Dynamics介绍以及开发工具配置
  12. 【C++】实现一个日期计算器
  13. 打雪仗java_【UER #8】打雪仗 - 题目 - Universal Online Judge
  14. xsim安装手记(转)
  15. 移动硬盘显示设备未就绪的文件寻回方法
  16. Vision.CascadeObjectDetector-VJ算法学习
  17. 扇贝python编程课_扇贝编程APP下载|扇贝编程python V1.1.35 安卓版下载 - 下载银行...
  18. 对于DFA、NFA理解
  19. 数电和计算机网络,数电计算机网络试卷2010A.doc
  20. MySQL 数据库 分组查询

热门文章

  1. sql查询数据库注释(表及表注释,字段及字段注释)
  2. 气传导耳机是不是智商税?气传导耳机值得不值得入手?一文带你看懂
  3. 啦啦外卖50.9全开源至尊版源码
  4. java项目如何启动tomcat服务器,Java web项目启动Tomcat报错解决方案
  5. Mac学习第一步——Mac OS X系统常用多点触摸板操作手势
  6. js获取当前年月日时间
  7. unity4.6 改变ui层的排序 sorting layer
  8. 东南融通 面试~~~ 对面试官近乎崇拜啦!
  9. 重塑矩阵(matlab reshape函数原理)
  10. iOS-字体UIFont的lineHeight与pointSize