iOS给一张照片美颜

之前我的一篇笔记iOS实时美颜并获取原图里面写了如何实现实时的美颜滤镜,本篇作为补充说下如何给一张图片美颜。 还是使用之前提到的GPUImageBeautifyFilter // 原图 UIImage * sourceImage = [UIImage imageNamed:@"notBeauty.png"]; GPUImageBeautifyFilter *beautyFilter = [[GPUImageBeautifyFilter alloc] init]; //设置要渲染的区域 [beautyFilter forceProcessingAtSize:sourceImage.size]; [beautyFilter useNextFrameForImageCapture]; //获取数据源 GPUImagePicture *stillImageSource = [[GPUImagePicture alloc]initWithImage:sourceImage]; //添加上滤镜 [stillImageSource addTarget:beautyFilter]; //开始渲染 [stillImageSource processImage]; //获取滤镜后的图片 UIImage *beautyImage = [beautyFilter imageFromCurrentFramebuffer]; [beautyFilter removeAllTargets]; [stillImageSource removeAllTargets]; 根据以上代码,UIImage *beautyImage存储的就是美颜后的图片。…

iOS实现实时美颜滤镜并获取原图

实时美颜 在iOS里面进行实时美颜,我使用的是GPUImageBeautifyFilter, 具体原理可以看作者的文章。 具体使用方法如下: 1.在项目的Podfile里面引入GPUImage target 'TestBeauty' do pod 'GPUImage' end 2.将GPUImageBeautyFilter.h和GPUImageBeautyFilter.m添加到项目中 3.编写相关代码 在ViewController.m里面实现如下代码: #import "ViewController.h" #import <GPUImage/GPUImage.h> #import "GPUImageBeautifyFilter.h" @interface ViewController () @property (nonatomic, strong) GPUImageVideoCamera *videoCamera; @property (nonatomic, strong) GPUImageView *filterView; @end…

iOS调用UIImagePickerController相机拍照图片旋转了90度

以前遇到过iOS调用相机拍照图片旋转了90度的问题,照片显示在UIImageView里面是正常的,但是传输到服务器之后发现不是正的。 要解决上面这个问题,在发送图片到服务器之前,要对图片方向进行纠正。一般有两种方法进行纠正。 方法一、使用CGAffineTransform + CGBitmapContextCreateImage UIImage+fixOrientation.h文件 // UIImage+fixOrientation.h文件 #import <UIKit/UIKit.h> @interface UIImage (fixOrientation) - (UIImage *)fixOrientation; @end UIImage+fixOrientation.m 文件 // UIImage+fixOrientation.m 文件 @implementation UIImage (fixOrientation) - (UIImage *)fixOrientation { // No-op if the orientation is already correct…

安装cocoapods

很久没有碰xcode了,都有点忘记怎么在工程里面使用cocoapods了,下面主要是为了以后方便,在此做下记录。 1.确认是否需要使用cocoapods 假如说从github上下了一个项目,看里面是否有xxx.xcworkspace文件或者Podfile文件,有就是需要使用cocoapods 2.如何使用cocoapods 2.1 确认你已经安装了pod工具 在terminal里面输入命令pod --version,查看是否已经安装pod工具 如果没有安装,则按照以下步骤进行安装: gem update --system升级ruby环境 替换ruby镜像 gem sources --remove https://rubygems.org/ gem source -a https://gems.ruby-china.org/ 安装cocoapods gem install cocoapods pod setup 3.给已有的项目添加cocoapod 假如说你用Xcode新建了一个项目叫TestProject,放在桌面。那么给项目安装cocoapods的步骤如下: 进入项目目录,cd…

iOS-记一次因内存泄露引起的崩溃

最近玩儿了一下百度人脸识别的功能,申请了iOS SDK放到了测试的app里面。 本来都运行得挺好的,把人脸识别的界面放在那儿,中午出去吃个饭回来发现app崩溃了!!! 这就要找一下原因了,肯定不是什么每次都必现的bug,不然不可能一开始好好的,后来却崩溃了。 一、查看设备上面的日志 把设备连上电脑,打开Xcode -> Windows -> Devices and Simulators,找到相应的设备,点击View Device Logs。 看了一下,只有一些前几天的crash日志,和一些unkown的没有日期的日志。 这条路是看不出什么了。 二、集成SDK统计崩溃信息 我先是集成了百度移动统计的SDK,QA帮忙测了一会儿说又崩溃了,打开移动统计后台,什么崩溃信息也没有!!! 三、查看内存使用 上面两条路走不通之后,我想着就试试是不是内存的原因。 本来想打开Instrument看一下内存是情况,但是一运行就崩溃。。。。没事儿不纠结,反正还可以在Xcode里面看 测试过程中,启动了app之后只占20MB的内存,但是一打开人脸识别功能,瞬间飙到了190MB。但是190MB还不足以触发didReceiveMemoryWarning。 试了一会儿,…

iOS keychain

用户名密码不能保存在NSUserDefault里面,这个应该是共识。一般是把重要的东西存在keychain里面,keychain是可以被破解的,最好不要明文存储。 keychain里的东西是存在于每个app的沙盒之外的,所以keychain里保存的信息不回因app卸载而丢失。 使用Keychain需要引入Security.framework框架 苹果官方有个GenericKeychain示例代码,不过它不是ARC的,用的时候在Building Phases-> Compile Sources里面找到KeychainItemWrapper.m,给它添加上标志-fno-objc-arc。 假如说你只是要保存个用户名密码,那么使用KeychainItemWrapper就够了,具体的用法如下: 1.首先创建一个KeychainItemWrapper对象 KeychainItemWrapper * wrapper = [[KeychainItemWrapper alloc] initWithIdentifier:@"myKeychainIdentifier" accessGroup:nil]; 其中设置accessGroup为nil,表示不在应用之间共享。 2.假如说你要保存用户名和密码,那么就可以调用 [wrapper setObject:username forKey:(id)kSecAttrAccount]; [wrapper setObject:password forKey:(id)kSecValueData]…

使用performSelector或者NSInvocation调用方法

有时候,写程序的时候会用到自己以前写的东西,但某些接口是不对外开放的,只有我自己知道。这个时候,可以使用如下方法来调用那些实际存在但被藏起来的方法。 objc_msgSend 根据objective-c的运行时特性,向某个对象或对象的实例发送消息,最终调用的其实是objc_msgSend。 objc_msgSend(receiver, selector, arg1, arg2, …); 第一个参数为方法的接收对象,第二个参数为SEL,后面是方法需要的参数。 performSelector 最多带两个参数,且参数为object,不能是int之类的基础类型 新建一个工程,在ViewController.m里面定义一些方法 - (void)function0 { NSLog(@"no par"); } - (void)function1:(NSString *)first { NSLog(@"one par,=%@",first); } - (void)function2:…

sort array of dictionary

对存放着字典的数组排序 其实是类似于给excel表格排序。NSArray里面有一些元素,这些元素都是NSDictionary,每个元素的keys都是一样的,想要对这样的数据来排序,可以使用到NSSortDescriptor 我先是看到NSHipster上的这篇文章,它是新构造一个类,每个key都是这个类的一个属性,使用如下代码来排序: @interface Person : NSObject @property NSString *firstName; @property NSString *lastName; @property NSNumber *age; @end @implementation Person - (NSString *)description { return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; } @end NSArray *firstNames = @[ @"Alice", @"Bob", @"Charlie"…