iOS开发:图片加载@2x与@3x
一、图片格式@2x与@3x
应对非视网膜和视网膜屏,APP有时会提供不同大小的图片,1倍图和2倍图和3倍图,它们的像素与1倍数图相比相差2倍或者3倍。
命名规则:2倍图在1倍图的名字后加 @2x
- 普通:sample.png
- 2倍:sample@2x.png
- 3倍:sample@3x.png
系统用“sample”寻找图片的时候,会自动根据设备屏幕取对应的图片
由于retina屏幕的普及,现在工程中用得最多的是@2x和@3x图片
二、加载图片的方法
图片资源在工程的位置如下图
方法一:
-(void)setImageView1{UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, 80, 180, 180)];imageView.backgroundColor = [UIColor blueColor];
//只有test@2x与test@3x图片//4s 5 5s 6 6s 会自动加载test@2x图片//6Plus 6sPlus 会自动加载test@3x图片imageView.image = [UIImage imageNamed:@"test"];[self.view addSubview:imageView];
}
PS:这种方法可以加载到逻辑路径中的资源 也可以加载到Assets.xcassets中的资源,而且会根据设备自动匹配@2x和@3x图片。
方法二:
-(void)setImageView2{//此处的路径是物理路径如果是逻辑路径是获取不到资源的//这里填写test@2x或者test@3x都可以(只要这个文件在wwwwww这个文件夹真实存在即可),主要是获得这个物理路径。//获得到这个路径之后 后边才会根据设备自动加载@2x图片或者@3x图片。NSString *path = [[NSBundle mainBundle] pathForResource:@"wwwwww/test@2x" ofType:@"png"];NSLog(@"path = %@",path);//因为www是逻辑路径,用此方法是加载不到这个文件的NSString *path1 = [[NSBundle mainBundle] pathForResource:@"www/test@2x" ofType:@"png"];//所以path1的值为null;NSLog(@"path1 = %@",path1);//path1 = null;UIImageView * imageView = [[UIImageView alloc] initWithFrame:CGRectMake(80, 80, 180, 180)];imageView.backgroundColor = [UIColor blueColor];//4s 5 5s 6 6s 会自动加载test@2x图片//6Plus 6sPlus 会自动加载test@3x图片imageView.image = [UIImage imageWithContentsOfFile:path];[self.view addSubview:imageView];
}
PS1:这种方法如果加载物理路径中的资源文件需要把路径指定完全。
PS2:逻辑路径中的文件其实也可以用这中方法来加载,只不过逻辑路径中的资源文件的存储位置跟文件夹显示的路径没有关系,如下:
-(void)setImageView3{//从此也可以看出逻辑路径下的资源文件的路径并没有真正存在 都是在工程的 根目录下app/资源文件UIImageView * imageViewImage = [[UIImageView alloc] initWithFrame:CGRectMake(40, 40, 100, 100)];imageViewImage.backgroundColor = [UIColor blueColor];//下面两种写法都没有写成:test/inTest/inTest 这种物理路径的方式,其实写成这样是识别不到inTest.png文件的 因为路径并不存在
#if 1NSString * mainPath = [[NSBundle mainBundle] resourcePath];NSString * path = [NSString stringWithFormat:@"%@/inTest",mainPath];
#elseNSString * path = [[NSBundle mainBundle] pathForResource:@"inTest" ofType:@"png"];
#endifUIImage * image = [UIImage imageWithContentsOfFile:path];imageViewImage.image = image;[self.view addSubview:imageViewImage];
}
三、imageNamed 与 imageWithContentsOfFile的区别
myImage = [UIImage imageNamed:@"icon.png"];
这种方法在一些图片很少,或者图片很小的程序里是ok的。
但是,在大量加载图片的程序里,请千万不要这样做。
为什么呢 ???????
这种方法在application bundle的顶层文件夹寻找由供应的名字的图象 。 如果找到图片,装载到iPhone系统缓存图象。那意味图片是(理论上)放在内存里作为cache的。
试想你图片多了,是什么后果``````
图片cache极有可能不会响应 memory warnings and release its objects
所以,用图片的时候一定要小心的alloc和release
推荐使用
NSString *path = [[NSBundle mainBundle] pathForResource:@”icon” ofType:@”png”];
myImage = [UIImage imageWithContentsOfFile:path];
四、用UIImage加载图像的方法很多,常用如下:
1、用imageNamed函数
[UIImage imageNamed:ImageName];
2、用imageWithContentsOfFile函数
[UIImage imageWithContentsOfFile:path];
3、用NSData的方式加载,例如:
NSString *filePath = [[NSBundle mainBundle] pathForResource:fileName ofType:extension];
NSData *image = [NSData dataWithContentsOfFile:filePath];
[UIImage imageWithData:image];
1)用imageNamed的方式加载时,系统会把图像Cache到内存。如果图像比较大,或者图像比较多,用这种方式会消耗很大的内存,而且释放图像的 内存是一件相对来说比较麻烦的事情。例如:如果利用imageNamed的方式加载图像到一个动态数组NSMutableArray,然后将将数组赋予一 个UIView的对象的animationImages进行逐帧动画,那么这将会很有可能造成内存泄露。并且释放图像所占据的内存也不会那么简单。但是利 用imageNamed加载图像也有自己的优势。对于同一个图像系统只会把它Cache到内存一次,这对于图像的重复利用是非常有优势的。例如:你需要在 一个TableView里重复加载同样一个图标,那么用imageNamed加载图像,系统会把那个图标Cache到内存,在Table里每次利用那个图 像的时候,只会把图片指针指向同一块内存。这种情况使用imageNamed加载图像就会变得非常有效。
2)利用NSData方式加载时,图像会被系统以数据方式加载到程序。当你不需要重用该图像,或者你需要将图像以数据方式存储到数据库,又或者你要通过网络下载一个很大的图像时,请尽量使用imageWithData的方式加载图像。
无论用哪种方式加载图像,图像使用结束后,一定要记得显示释放内存。
参考文章:
http://www.cnblogs.com/pengyingh/articles/2355033.html
iOS开发:图片加载@2x与@3x相关推荐
- ios加载本地html懒加载图片方案,IOS开发中加载大量网络图片优化方法
IOS开发中加载大量网络图片如何优化 1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过一段类似流的方式去加载网络图片,接着 ...
- veImageX 演进之路:iOS 高性能图片加载 SDK
动手点关注 干货不迷路 1. SDK简介 图片在业务应用场景是一个常见的元素,veImageX(简称ImageX)为业务提供了灵活.高效的一站式图片处理解决方案,包括了服务端 SDK.上传 SDK ...
- ionic开发——图片加载失败或不存在时显示提示图片的解决方法
当图片加载失败或者不存在的时候,我们需要一张提示图片来代替他.用判断就太麻烦了,img有自己的方法onerror , 当找不到图片的时候就会执行onerror里面的代码 例如: <img src ...
- iOS开发之加载、滑动翻阅大量图片优化解决方案
今天分享一下私人相册中,读取加载.滑动翻阅大量图片解决方案,我想强调的是,编程思想无关乎平台限制.我要详细说一下,在缩略图界面点击任意小缩略图后,进入高清大图全屏浏览界面的这短暂的1秒内(和后续的几秒 ...
- iOS开发:加载、滑动翻阅大量图片解决方案
常规思路流程 点击任意小图后: 1.首先制作scrollview框架:大小2个scrollview,小的用于手势缩放单一图片,大的横向依次加载全部照片 2.制作好scrollview框架后,加载照片 ...
- iOS开发之加载大量网络图片优化
2019独角兽企业重金招聘Python工程师标准>>> 1.概述 在IOS下通过URL读一张网络图片并不像其他编程语言那样可以直接把图片路径放到图片路径的位置就ok,而是需要我们通过 ...
- iOS开发 - UIImage加载内存性能比较
+ (UIImage )imageNamed:(NSString )name + (UIImage )imageNamed:(NSString )name 这种加载会有缓存,图片所占用的内存会一直停留 ...
- iOS 开发笔记-加载/初始化
ViewDidLoad 一般我们会在这里做界面上的初始化操作,比如往view中添加一些子视图.从数据库或者网络加载模型数据装配到子视图中 在自定义控制里 initWithFrame:一般用于添加控件, ...
- iOS 如何计算图片加载内存中所占的大小
首先图片自动缩放到2的n次方大小,例如200 * 300像素 会变成256 * 512大小. 图片内存大小的计算公式 宽度 * 高度 * bytesPerPixel/8. bytesPerPixel ...
最新文章
- java面试的基本问题_java面试常见基础问题之一
- 黑猫315十大行业乱象发布:背后真假套路难辨
- 最长递增子序列问题合集
- weblogic12 linux部署,linux系统中安装部署weblogic12.1.3
- android 摄像头预览左右镜像_OpenJDK镜像的tag说明
- element 组件中 el-form-item label= ‘vue介绍 (vue设置)‘ 强制换行
- 苹果屏幕使用时间怎么设置_苹果手机屏幕不能旋转怎么办
- 栈在表达式求值中的应用
- oracle 查询clob
- asp.net执行js出现“已终止操作”的解决方法
- 怎么做电商详情页html,电商商品详情页怎么做?电商详情页模板一键生成的方法...
- MATLAB反色图像处理
- LaTeX 格式、字母、符号、公式 (总结)
- Mediawiki安装经验分享
- js设计程序实现摄氏度和华氏度转换
- numpy学习:np.subtract.outer
- 绚丽彩虹同学录V1.4公测版
- AI+医疗如何商业破冰?6位一线专家这样说
- PostgreSQL - 学习/实践
- DelphiX 组件