UIImage类方法总结及UIImage生成方法对比
http://mp.weixin.qq.com/s/A900w0Y5pGjuaB4j9Os9ww1、UIImage 生成方法的对比
Apple官方的文档为生成一个UIImage对象提供了两种方法:
1. imageNamed,其参数为图片的名字;优点:加载时会缓存图片,用于图片的频繁使用;缺点:占用内存,直到应用结束
2. imageWithContentsOfFile,其参数也是图片文件的路径。优点:仅加载图片,不会缓存,用于价值次数较少的情况,降低内存消耗
那么两种有什么区别吗?
肯定是有的。根据Apple的官方文档:
imageNamed: 这个方法用一个指定的名字在系统缓存中查找并返回一个图片对象如果它存在的话。如果缓存中没有找到相应的图片,这个方法从指定的文档中加载然后缓存并返回这个对象。因此imageNamed的优点是当加载时会缓存图片。所以当图片会频繁的使用时,那么用imageNamed的方法会比较好。例如:你需要在 一个TableView里的TableViewCell里都加载同样一个图标,那么用imageNamed加载图像效率很高。系统会把那个图标Cache到内存,在TableViewCell里每次利用那个图 像的时候,只会把图片指针指向同一块内存。正是因此使用imageNamed会缓存图片,即将图片的数据放在内存中,iOS的内存非常珍贵并且在内存消耗过大时,会强制释放内存,即会遇到memory warnings。而在iOS系统里面释放图像的内存是一件比较麻烦的事情,有可能会造成内存泄漏。例如:当一 个UIView对象的animationImages是一个装有UIImage对象动态数组NSMutableArray,并进行逐帧动画。当使用imageNamed的方式加载图像到一个动态数组NSMutableArray,这将会很有可能造成内存泄露。原因很显然的。
imageWithContentsOfFile:仅加载图片,图像数据不会缓存。因此对于较大的图片以及使用情况较少时,那就可以用该方法,降低内存消耗。
下面列举出两种方法的详细用法:
- NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
- UIImage *image = [UIImage imageWithContentsOfFile:path];
以及:
- NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:“png”];
- NSData *image = [NSData dataWithContentsOfFile:filePath];
- UIImage *image = [UIImage imageWithData:image]; //or = [UIImage imageWithContentsOfFile:filePath];
IOS中对图片的处理 UIImage相信做项目时肯定会有用到 UIImage 这个类,那我们就来看一下这个类中都有什么内容。其实这篇文章就是在看文档的时候想记录一下文档中得方法。UIImage 继承于NSObject下面介绍一下UIImage中的方法首先是我们最常用的通过图片的文件名来获取这个图片+ (UIImage *)imageNamed:(NSString *)name//要注意的是这个方法适用于已经导入到工程中的图片创建新图片1、+ (UIImage *)imageWithContentsOfFile:(NSString *)path//通过文件加载指定路径下的文件内容获得新图片2、+ (UIImage *)imageWithData:(NSData *)data//通过一个NSData对象来获得图片3、+ (UIImage *)imageWithData:(NSData *)data scale:(CGFloat)scale//同上,只是再加上一个图片大小比例,用来改变图片的大小4、+ (UIImage *)imageWithCGImage:(CGImageRef)cgImage//使用Quartz 2D对象创建UIImage5、+ (UIImage *)imageWithCGImage:(CGImageRef)imageRef scale:(CGFloat)scale orientation:(UIImageOrientation)orientation//制定图片的比例和方向,其中方向是个枚举类。6、+ (UIImage *)imageWithCIImage:(CIImage *)ciImage//用一个Core Image 对象创建图像7、+ (UIImage *)imageWithCIImage:(CIImage *)ciImage scale:(CGFloat)scale orientation:(UIImageOrientation)orientation//再加上比例和图片方向8、- (UIImage *)imageWithAlignmentRectInsets:(UIEdgeInsets)alignmentInsets//返回指定矩形区域内的图像9、+ (UIImage *)animatedImageNamed:(NSString *)name duration:(NSTimeInterval)duration//创建一个动态图片,动态图片持续的时间为duration10、+ (UIImage *)animatedImageWithImages:(NSArray *)images duration:(NSTimeInterval)duration//用一组图片创建一个动态图片,动态持续时间duration11、+ (UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets duration:(NSTimeInterval)duration//创建一个在可变大小的图片上指定矩形区域内的动态图片12、+ (UIImage *)animatedResizableImageNamed:(NSString *)name capInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode duration:(NSTimeInterval)duration//同上,只是多了一个图片变化的方式,具体来说就是平铺或者拉伸13、- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets//用制定矩形区域创建图像14、- (UIImage *)resizableImageWithCapInsets:(UIEdgeInsets)capInsets resizingMode:(UIImageResizingMode)resizingMode//同上,指定图片变化方式初始化图片 方法的作用在从上面的一些方法中都能找到原型,这里就不一一注释了1、– initWithContentsOfFile: //从文件加载图片2、– initWithData: //用NSData对象初始化图片3、– initWithData:scale: //用NSData对象,指定的比例,初始化图片4、– initWithCGImage:5、– initWithCGImage:scale:orientation:6、– initWithCIImage:7、– initWithCIImage:scale:orientation:绘画图片1、– drawAtPoint://在指定的点开始绘画图片,这个点就是图片的做上角顶点2、- (void)drawAtPoint:(CGPoint)point blendMode:(CGBlendMode)blendMode alpha:(CGFloat)alpha//在指定的点绘制整个图片,并使用自定义图片复合模式,并设置透明度3、– drawInRect://在指定区域内绘制图片,可根据需要缩放图片4、– drawInRect:blendMode:alpha://参照上面第二条5、– drawAsPatternInRect://在指定区域内,平铺图片image的属性 imageOrientation //图片的方向 size //图片的大小size scale //图片的比例 resizingMode //图片变化方式 CGImage //潜在的Quartz image CIImage //潜在的Core Image images //返回一个由图片组成的数组,针对于由一组图片生成的动态图片 duration //返回动态图片持续的时间(即动态图片播放一遍的时间) capInsets //图片上选定的区域 alignmentRectInsets //图片平铺的区域iOS自带的提供了一个API如下[html] view plaincopyNSData *UIImageJPEGRepresentation(UIImage *image, CGFloat compressionQuality); 在Iphone上有两种读取图片数据的简单方法: UIImageJPEGRepresentation和UIImagePNGRepresentation. UIImageJPEGRepresentation函数需要两个参数:图片的引用和压缩系数.而UIImagePNGRepresentation只需要图片引用作为参数.通过在实际使用过程中,比较发现: UIImagePNGRepresentation(UIImage* image) 要比UIImageJPEGRepresentation(UIImage* image, 1.0) 返回的图片数据量大很多.譬如,同样是读取摄像头拍摄的同样景色的照片, UIImagePNGRepresentation()返回的数据量大小为199K ,而 UIImageJPEGRepresentation(UIImage* image, 1.0)返回的数据量大小只为140KB,比前者少了50多KB.如果对图片的清晰度要求不高,还可以通过设置 UIImageJPEGRepresentation函数的第二个参数,大幅度降低图片数据量.譬如,刚才拍摄的图片, 通过调用UIImageJPEGRepresentation(UIImage* image, 1.0)读取数据时,返回的数据大小为140KB,但更改压缩系数后,通过调用UIImageJPEGRepresentation(UIImage* image, 0.5)读取数据时,返回的数据大小只有11KB多,大大压缩了图片的数据量 ,而且从视角角度看,图片的质量并没有明显的降低.因此,在读取图片数据内容时,建议优先使用UIImageJPEGRepresentation,并可根据自己的实际使用场景,设置压缩系数,进一步降低图片数据量大小。[html] view plaincopyUIImage *imageNew = [info objectForKey:@"UIImagePickerControllerOriginalImage"]; imageNew = [self imageWithImage:imageNew scaledToSize:CGSizeMake(100, 100)]; NSData *imageData = UIImageJPEGRepresentation(imageNew, 0.0001); m_selectImage = [UIImage imageWithData:imageData]; .h具体code [html] view plaincopy#import <Foundation/Foundation.h> @interface UIImage (UIImageExt) - (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size; - (UIImage *)imageByScalingAndCroppingForSize:(CGSize)targetSize; @end .m具体code[html] view plaincopy#import "UIImageExt.h" @implementation UIImage (UIImageExt) - (UIImage *)scaleToSize:(UIImage *)img size:(CGSize)size{ // 创建一个bitmap的context // 并把它设置成为当前正在使用的context UIGraphicsBeginImageContext(size); // 绘制改变大小的图片 [img drawInRect:CGRectMake(0, 0, size.width, size.height)]; // 从当前context中创建一个改变大小后的图片 UIImage* scaledImage = UIGraphicsGetImageFromCurrentImageContext(); // 使当前的context出堆栈 UIGraphicsEndImageContext(); // 返回新的改变大小后的图片 return scaledImage; } - (UIImage*)imageByScalingAndCroppingForSize:(CGSize)targetSize { UIImage *sourceImage = self; UIImage *newImage = nil; CGSize imageSize = sourceImage.size; CGFloat width = imageSize.width; CGFloat height = imageSize.height; CGFloat targetWidth = targetSize.width; CGFloat targetHeight = targetSize.height; CGFloat scaleFactor = 0.0; CGFloat scaledWidth = targetWidth; CGFloat scaledHeight = targetHeight; CGPoint thumbnailPoint = CGPointMake(0.0,0.0); if (CGSizeEqualToSize(imageSize, targetSize) == NO) { CGFloat widthFactor = targetWidth / width; CGFloat heightFactor = targetHeight / height; if (widthFactor > heightFactor) scaleFactor = widthFactor; // scale to fit height else scaleFactor = heightFactor; // scale to fit width scaledWidth = width * scaleFactor; scaledHeight = height * scaleFactor; // center the image if (widthFactor > heightFactor) { thumbnailPoint.y = (targetHeight - scaledHeight) * 0.5; } else if (widthFactor < heightFactor) { thumbnailPoint.x = (targetWidth - scaledWidth) * 0.5; } } UIGraphicsBeginImageContext(targetSize); // this will crop CGRect thumbnailRect = CGRectZero; thumbnailRect.origin = thumbnailPoint; thumbnailRect.size.width = scaledWidth; thumbnailRect.size.height = scaledHeight; [sourceImage drawInRect:thumbnailRect]; newImage = UIGraphicsGetImageFromCurrentImageContext(); if(newImage == nil) NSLog(@"could not scale image"); //pop the context to get back to the default UIGraphicsEndImageContext(); return newImage; } <br>/** 返回一张经过处理的图片*/<br>+ (UIImage *)createCompressesImageWithName:(NSString *)imageName<br>{<br> <br> UIImage *newImage = [UIImage imageWithImageSimple:[UIImage imageWithName:imageName] scaledToSize:[UIImage imageWithName:imageName].size];<br><br> return newImage;<br>}<br>@endUIImage类方法总结及UIImage生成方法对比的更多相关文章
- 国内app快速生成平台对比
泰格老虎 2013-03-07 00:39:10 这是海恒CEO高鹏写的一篇国内app快速生成平台对比文章,介绍了国内快速生成APP的平台与自己平台的对比,很有参考价值. 同类网站 安米网 http ...
- 多个UIImage合并成一个UIImage
多个UIImage合并成一个UIImage 创建两个UIImage UIImage *image1 = [UIImage imageNamed:@"iOSDevTip"]; UII ...
- GDP区域分布图的生成与对比(ArcPy实现)
一.背景 各地区经济协调发展是保证国民经济健康持续稳定增长的关键.GDP是反映各地区经济发展状况的重要指标.科学准确分析各地区GDP空间分布特征,对制定有效措施,指导经济协调发展具有重要参考价值. 二 ...
- SQL Server开发接口生成方法
为提高开发效率,生成固定格式的接口是必须的,以下以提供新增/修改/删除/读取接口为例: 以常见的表结构为例,特殊表结构可自己尝试去调整方法 主要通过系视图 sys.columns生成方法:为包含列的对 ...
- 关于全局唯一ID生成方法
引:最近业务开发过程中需要涉及到全局唯一ID生成.之前零零总总的收集过一些相关资料,特此整理以便后用 本博客已经迁移至:http://cenalulu.github.io/ 本篇博文已经迁移,阅读全文 ...
- 细聊分布式ID生成方法
细聊分布式ID生成方法 https://mp.weixin.qq.com/s?__biz=MjM5ODYxMDA5OQ==&mid=403837240&idx=1&sn=ae9 ...
- 分布式环境下的id生成方法
分布式环境下的id生成方法 前几天研究数据库分表分库的问题,其中有一个关键的地方就是生成唯一键的问题,假如数据表有1亿条数据,而且还在不断的增加,这里我们就需要考虑到分表分库,假设我们采用Hash ...
- Linux和Windows下查看环境变量方法对比
摘自:Linux和Windows下查看环境变量方法对比 一.查看所有环境变量的名称和值 Linux下:export Windows下:set 二.根据名称查该环境变量的值 Linux下:echo $环 ...
- C语言清空输入缓冲区的N种方法对比
转自C语言清空输入缓冲区的N种方法对比 C语言中有几个基本输入函数: //获取字符系列 int fgetc(FILE *stream); int getc(FILE *stream); int get ...
随机推荐
- MyBatis开发学习记录
使用MyBatis时主要是完成POJO和SQL的映射规则 MyBatis基本构成: SqlSessionFactoryBuilder SqlSessionFactory SqlSession SqlM ...
- geotrellis使用(三十五)Cesium加载geotrellis TMS瓦片
前言 做任何事情都不是想象中的那么简单.好久没有更新技术博客了,跟最近瞎忙有很大关系,虽说是瞎忙也抽空研究了些技术. 主要是前端渲染,像原生的WebGL和Cesium.WebGL写了几篇博客,自我感觉 ...
- Cubieboard2安装Fedora20
几天前入手一块Cubieboard2,又买了张16G的TF卡,装个linux折腾折腾.以前都是在虚拟机上用linux,个人比较喜欢Fedora,因为总能用上最新版的软件,像支持C++11的GCC.Cl ...
- gulp基础操作实践
按照gulp中文文档对gulp基础操作的一些实践练习,记录以防忘掉. 一,选择并输出文件:gulp.src(globs[,options]) eg:gulp.src('src/less/index.l ...
- (转载) Java子类与父类之间的对象转换
在使用Java的多态机制时,常常使用的一个特性便是子类和父类之间的对象转换.从子类向父类的转换称为向上转换(upcasting),通过向上转换,我们能够在编写程序时采用通用程序设计的思想,在需要使用子 ...
- redis配置文件之复制
主从复制使用slaveof将Redis实例作为另一个Redis服务器的副本. 1) Redis复制是异步的,master可以配置成如果它连接的slave没有达到给定的数量,就停止接受写入.2) 如果断 ...
- selenium与表格的二三事
今天遇到的问题是selenium与表格中行和列的问题! 我想要做的事情是统计当前的table有多少行,表格形式如下如所示: 图中所示为2行,我的定位方式是这样的 : table=driver.find ...
- php代码中的细节问题
本次主要谈及工作中关于注销功能中的路径设置及session的清除问题之前的调试一直忽略了session的功能,以至于每次使用__ROOT__/index.php/home/Student/logout ...
- 搭建一个属于自己的webpack config(-)
搭建一个属于自己的webpack config(-) 前期准备 环境说明 mac 10.12.6 node v8.8.1 npm 5.4.2 全局安装下webpack.webpack-dev-serv ...
- Scala入门系列(一):基础语法
Scala基础语法 Scala与JAVA的关系 Scala是基于Java虚拟机,也就是JVM的一门编程语言,所有Scala的代码都需要经过编译为字节码,然后交由Java虚拟机来运行. 所以Scala和 ...