UIImage的scale及size,二倍图,三倍图,像素等概念透析

iOS4.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。


一个图像的尺寸到底是多大呢?第一反应可能就是image.size,恭喜你答错了,正确的答案是图像的实际的尺寸(像素)等于image.size * image.scale。其实image.size也就是像素总个数,aXb个像素,而不是imagede物理尺寸的大小,物理尺寸要根据当前屏幕的分辨率来计算出来。


我们编程,画图,窗口,字体等都是矢量图,通过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倍的

比如,一个物理尺寸为16x16的UIImageView,在三种scale的屏幕上面显示,分别给出1倍到3倍图(即16x16,32x32,48x48的三张图),打印输出可以看出,这三个图片的Image.size都是16x16,但是scale对对应的分别为1,2,3。也就是说,32x32的图片的size也是16x16,但是由于屏幕的scale为2,所以16的尺寸就显示了32x32的高清图片。

image.scale表示的是缩小因子,屏幕的scale表示放大因子,这一点要理解清楚。另外,注意一点,image.scale这个值的获取仅仅就是简单的通过@2x这个后缀的数字获得的,也就是说你把一个@3x的图片的@3x的后缀删掉,再打印输出image.scale就会得到scale是1,而不是3.比如说服务器上面返回的一个三倍图,但是没有@3x这个后缀,那你显示到3种分辨率的屏幕上时,就要用这个图片的size除于3来设置UIImageView的大小,而不是上面说的那个先乘上image.scale再除上屏幕的scale,因为此时的图片命名不是那种@3x结尾的,所以你的得到的image.scale都是1,显然按照上面的这种计算是错误的。


参考文章:https://www.douban.com/note/77384858

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值