博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
UIImage的scale
阅读量:6323 次
发布时间:2019-06-22

本文共 2968 字,大约阅读时间需要 9 分钟。

hot3.png

iPhone OS4.0加入了scale factor,这表示point长度/pixel长度。
在分辨率为960*640的设备上,我们知道逻辑坐标系还是不变480*320,那么一个point有两个pixel长,所以scale=2.0。
在分辨率为480*320的设备商,point和pixel长度相同,scale=1.0。
为了程序自动适应分辨率,程序会自动给UIScreen.scale赋值,[UIScreen mainScreen].scale = 1.0 or 2.0。
我们编程,画图,窗口,字体等都是矢量图,通过scale能够让我们不管分辨率,按照逻辑坐标480*320来设计界面,效果在所有分辨率下都一致(物理尺寸位置一致)。但是和光栅相关的位图又如何适应呢?
比如一个32*32的图片,在高分辨率下,如果要位置大小都不变,那么32*32的图像点显示在64*64的像素(光栅)上。在不改程序的情况下,一个图像点的颜色对应4个颜色一致的像素点。这样图片不光模糊,而且还有锯齿。
所以,要需要一个64*64的新图片代替原图片。在不改程序代码的情况下如何实现?SDK要求我们再加一个图片,比如原图片是image.png,新加的就是image@2x.png,是64*64的。
在系统scale=2.0时,加载图像时先找@2x的,找不到在找原来的,所以就是只要给所有的图像资源文件都加上一个新的高清晰的@2x文件,程序就自动在高分辨屏幕上用高清晰图片,低分辨上用低清晰图像。
再来看看SDK是如何实现的。前提是程序代码没变,SDK内部实现变了。变了什么,主要就是UIImage新加了个scale。
按前面所讲的,读取image@2x.png时,scale=2.0,读取image.png时scale=1.0。
看同一张图片,有如下几个情况:
当UIScreen.scale=2.0时,读取image@2x.png,UIImage.scale=2.0 UIImage.size=16*16
当UIScreen.scale=1.0时,读取image.png, UIImage.scale=1.0 UIImage.size=32*32
当UIScreen.scale=2.0时,读取image.png, UIImage.scale=1.0 UIImage.size=32*32 (不存在@2x文件的时候)
看出来没有,图片的实际尺寸是size*scale。这里就可以给出UIImage的scale含义:
sacle = 实际大小 / 当前逻辑大小
当前逻辑大小 = 实际大小 / sacle
当前逻辑大小 = 实际大小 * (1/sacle)
sacle是什么,是缩小因子。1/sacle才是放大因子。
这跟一般情况的scale是放大因子是相反的啊!!!
比如UIScreen.scale=2.0,就表示我们的屏幕是被放大2.0倍的。
而UIImage.scale=2.0表示什么,表示当前的图片是被缩小了2.0倍的。
-----------------------------------------------end------------------------------------------------------------------
在同一张图片sacle=2.0和1.0时,UIImageView大小不变时,也就是说,虽然我没有高清晰图,但我把原来的图copy一个为@2x时,效果是不是一样的呢?
发现效果还真是不一样啊。@1.0是图片直接放大,有锯齿的。 @2.0是显卡放大,无锯齿了。
代码:
- (void)viewDidLoad {
    [super viewDidLoad];
        UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50.0, 50.0, 200.0, 32.0)] autorelease];
        [self.view addSubview:label];
        label.backgroundColor = [UIColor clearColor];
        label.text = [NSString stringWithFormat:@"Screen.scale:%.1f", [UIScreen mainScreen].scale];
        do {
                UIImage *image = [UIImage imageNamed:@"test.png"];
                UIImageView *imageView = [UIImageView alloc] initWithImage:image];
                imageView.frame = CGRectMake(15.0, 100.0, 32.0, 32.0);
                [self.view addSubview:imageView];
                [imageView release];
                
                UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50.0, 100.0, 300.0, 32.0)] autorelease];
                [self.view addSubview:label];
                label.backgroundColor = [UIColor clearColor];
                label.text = [NSString stringWithFormat:@"image.scale:%.1f size:%.0f*%.0f", image.scale, image.size.width, image.size.height];
                
        }while (0);
        
        do {
                UIImage *image = [UIImage imageNamed:@"test2.png"];
                UIImageView *imageView = [UIImageView alloc] initWithImage:image];
                imageView.frame = CGRectMake(15.0, 150.0, 32.0, 32.0);
                [self.view addSubview:imageView];
                [imageView release];
                
                UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(50.0, 150.0, 300.0, 32.0)] autorelease];
                [self.view addSubview:label];
                label.backgroundColor = [UIColor clearColor];
                label.text = [NSString stringWithFormat:@"image.scale:%.1f size:%.0f*%.0f", image.scale, image.size.width, image.size.height];
        }while (0);
        
}

转载于:https://my.oschina.net/songchunmin/blog/1561197

你可能感兴趣的文章
JSP的特点和其它动态网页开发技术比较
查看>>
AutoDispose解决RxJava内存泄漏
查看>>
shell脚本常用脚本:for循环
查看>>
不变类
查看>>
ubuntu下adsl拨号设置
查看>>
谷歌代码库已超过 20 亿行代码,他们是如何管理的?
查看>>
ES5与ES6
查看>>
【转】UML解惑:图说UML中的六大关系
查看>>
VMware Player安装CentOS 6.5 64位mini版
查看>>
MathType在字母上加虚线的方法
查看>>
几何画板如何制作文氏图
查看>>
a threadpool by python
查看>>
REST中 @POST & @PUT 区别
查看>>
handler和message传值两例
查看>>
解决表格中英文字符过多出现将边框撑大弄乱布局的问题
查看>>
JQUERY批量操作
查看>>
Git版本管理工具的使用
查看>>
Oracle新增客户端网络配置使用scott出现错误
查看>>
js 对Cookie进行增删改操作
查看>>
IE 的事件对象(event)
查看>>