iOS图片合成————(拍照换发)
一个简单的换发小程序,可以实现拍照,移动发型,放大缩小发型。
如图:
.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图片合成————(拍照换发)相关推荐
- iOS 图片合成(一)
需求:我们要将非固定的文本.图片等信息合成到一张图片上,例如我们要做一个分享的功能,有一张底图,在这底图上我们要把用户的头像和昵称放上去.这里我们用到Quart2D绘图之UIGraphicsBegin ...
- IOS 绘图 bitmap 滤镜 图片合成
CGSize size = CGSizeMake(800, 800);UIGraphicsBeginImageContextWithOptions(size, NO, 1);//1.获取bitmap上 ...
- iOS GIF合成有透明通道图片重叠问题
iOS GIF合成有透明通道图片重叠问题 项目中需要用到合成gif, 如果图片含有透明通道, 则会出现重叠现象, 设置 kCGImagePropertyGIFHasGlobalColorMap 为tr ...
- 图片合成gif_谈谈有哪些好用的制作GIF的方式
今天咱们谈谈计算机上几种制作 GIF 的方式,而且他们都是免费的,但可能需要你会一点计算机操作技能.本文会简单的介绍一些常用的GIF软件,比较一下功能和上手程度.常见的GIF录制方式大概有这么几种方式 ...
- Java 实现图片合成
2019独角兽企业重金招聘Python工程师标准>>> 图片合成 利用Java的绘图方法,实现图片合成 在开始之前,先定一个小目标,我们希望通过图片合成的方式,创建一个类似下面样式的 ...
- ios 图片加载内存尺寸_iOS内存分析上-图片加载内存分析
简介 对于大多数App来说,内存占用主要就是图片.本文将从实用的角度分析,iOS图片的内存占用.测量.优化等. iOS内存-有什么影响 在移动操作系统设备中,是不能像PC一样进行内存swap的,而随着 ...
- 百度飞桨AI抠图+图片合成
考虑到本科学校校庆即将到来,而又刚好学习了百度飞桨AI抠图以及图片合成的相关课程,因而想合成一张自己和本科学校的合照.(由于才疏学浅,略有翻车,请见谅) 使用工具:百度PaddleHub DeepLa ...
- android+照片合成,图片合成修图神器手机版
图片合成修图神器手机版由西西给大家带来,这款软件也是一个非常好用的修图软件,可以帮助大家制作各种的图片,而且模板滤镜也非常的多,喜欢的朋友赶紧来下载图片合成修图神器手机版吧! 图片合成修图神器介绍 [ ...
- 图片合成视频+php,将视频和图片合成到一个页面
2017-12-19 柒儿 15:53:09 柒儿 15:53:18 下载的软件安不上 怎么办 柒儿 15:54:46 在不? 柒儿 15:54:49 急 狸窝宝典 15:56:20 重启电脑试下 狸 ...
最新文章
- Windows10远程访问Jupyter notebook
- 自动驾驶出行,进入下半场
- C#多线程编程介绍——使用thread、threadpool、timer
- UOJ #584. 天天去哪吃
- 行走在消逝中[LoLi有三好]
- java里面的pai_Java - ZhangPai - 博客园
- python 求当前小时前n个小时
- d盾web查杀 linux,D盾Web查杀
- 我的大学--单片机高手郭天祥的学习心得体会
- Hadoop经典面试题
- Dynamics CRM 365零基础入门学习(一)Dynamics介绍以及开发工具配置
- 【C++】实现一个日期计算器
- 打雪仗java_【UER #8】打雪仗 - 题目 - Universal Online Judge
- xsim安装手记(转)
- 移动硬盘显示设备未就绪的文件寻回方法
- Vision.CascadeObjectDetector-VJ算法学习
- 扇贝python编程课_扇贝编程APP下载|扇贝编程python V1.1.35 安卓版下载 - 下载银行...
- 对于DFA、NFA理解
- 数电和计算机网络,数电计算机网络试卷2010A.doc
- MySQL 数据库 分组查询