2019独角兽企业重金招聘Python工程师标准>>>

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

UIImage的scale相关推荐

  1. iOS开发之图片分辨率与像素对齐

    像素对齐的概念 在iOS中,有一个概念叫做像素对齐,如果像素不对齐,那么在GPU渲染时,需要进行插值计算,这个插值计算的过程会有性能损耗. 在模拟器上,有一个选项可以把像素不对齐的部分显示出来.  ...

  2. iOS绘图详解-多种绘图方式、裁剪、滤镜、移动、CTM

    iOS绘图详解 摘要: Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的 绘 ...

  3. iOS 图形处理 Core Graphics Quartz2D 教程

    Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的绘图.变换.颜色管理.脱屏渲 ...

  4. iOS图形编辑之Core Graphics

    Core Graphics Framework是一套基于C的API框架,使用了Quartz作为绘图引擎.它提供了低级别.轻量级.高保真度的2D渲染.该框架可以用于基于路径的绘图.变换.颜色管理.脱屏渲 ...

  5. ios绘图教程(原文http://www.cocoachina.com/industry/20140115/7703.html)

    os开发者平台 Cocos引擎中文官网 H5小游戏编辑器 退出chengtanze 首页 资讯 问答 论坛 Cocos2d-x 开发者中心 新手入门 专题 新闻日历 开发者通道 排行榜 代码库 图书库 ...

  6. Swift 4 放大镜功能实现

    先上效果图吧,框框被限制在了image内了. 这个feature我把它用在了我的app里了,博客写得不容易,来star下啦? https://github.com/Imputes/Nike-Colle ...

  7. 《幸运大转盘》代码分享

    <幸运大转盘>有一句代码是这样的: self.rotateView.transform = CGAffineTransformMakeRotation(-angle); 它出现在延迟派遣消 ...

  8. iOS获取图片的区域主色

    之前的项目有这样的需求,有一个页面可以检索一块区域内图片的主色.效果图如图所示 下面是如何获取区域主色的实现思路: 首先,我们需要从相册,或者相机去获取图片: 其次,得到图片需要截取区域图片: 然后, ...

  9. iOS开发中自带的图标库

    iOS 开发中苹果自带的图标库,uiimage可直接调用 @available(iOS 13.0, *) @objc public extension UIImage{ /// square.and. ...

最新文章

  1. 整数的最大值和最小值
  2. java核心技术----访问权限
  3. SAP Spartacus默认的baseSite是从源代码什么地方读取的
  4. 有的人走着走着就散了!
  5. (SenchaTouch+PhoneGap)开发笔记(2)开发环境搭建二
  6. CCF201812-2 小明放学
  7. 数字图像识别笔记(第三章-灰度变换与空间滤波)
  8. 用友NCCloud 补丁下载/用友ncc 补丁下载/nccloud 补丁下载
  9. Vue使用iconfont(阿里图标库)
  10. 2022年最新《小鹿线web前端课程+项目实践课程》
  11. 计算机专业课件ppt背景,ppt背景图片怎么设置
  12. Pinterest和Instagram哪个更好用?姐妹还是天敌...
  13. PHP气缸种类,【汽缸】【气缸】|× 【Q】√ - 校对标准:寻找权威依据 - Powered by phpwind...
  14. 表单中enter键,导致表单提交
  15. How DICK’S moved its software development in-house and aced omnichannel retail
  16. 加速linux开机速度 systemctl
  17. Java根据自定义模板生成Word
  18. 解析某个94aw演示备忘
  19. 国外主机注册域名有什么需要注意的吗?
  20. PLC课程设计--台车呼叫

热门文章

  1. 不发项目奖金,程序员怒删代码,被判 5 个月!
  2. 关于Java“回调”的详细理解及使用
  3. Windchill的web中的Spring
  4. 手机密钥连接linux主机
  5. 论文阅读--PVANET: Deep but Lightweight Neural Networks for Real-time Object Detection
  6. 从0开始的Python学习001快速上手手册
  7. python-虎扑爬虫
  8. 【原创】MySQL 实现Oracle或者PostgreSQL的row_number over 这样的排名语法
  9. 再论JavaScript原型继承和对象继承
  10. Python 格式化输出 ( 颜色 )