物理、逻辑与位图像素的概念

关于设备物理像素和逻辑像素,这两个像素一个是实体的,一个是抽象的单位。除此之外还有一个不可忽视的像素,就是位图像素。

  • 物理像素(设备像素):指的是设备屏幕实际拥有的像素点。一个设备生产出来,它的像素就已经确定了,iphone6的分辨率是375px * 667px。

  • 逻辑像素(CSS像素):是我们进行CSS样式设计时的一种抽象单位,它可以自动在不同设备之间调节。

    设备像素比 = 设备的物理像素 / CSS像素

    如果设备像素比为2,就意味着设置的 1px CSS 像素,在设备上实际使用了2个物理像素单元来进行渲染,所以实际看到的一定会比 1px 粗一些。

  • 位图像素:一般我们在页面上使用的图片都是位图,位图像素是位图最小单位,不可再拆分。位图像素是图片本身的特性,在图片产出时就已经确定了,和 CSS 像素以及设备像素没有任何关系。

问题:图片在Retina下却变模糊

以 IPhone6 为例,IPhone6 手机的尺寸为 375px * 667px,如果我们在 PC(非 Retina 屏)上制作出一个宽度为 375px 的图片,该图片在电脑上显示正常,但在手机上显示就模糊了。

分辨率越高,图片显示不应该越清晰吗,为什么图片反而变得模糊了呢? 这个问题需要从以下几个方面来解释:

  • 像素是显示的最小单位,不可拆分;

  • 由于设备像素比的原因,CSS 的 1px 或位图的 1px 不一定等于物理像素的 1px。

前面我们提到过:设备像素比的意义在于规定设备以多少个物理像素来显示 1px 的 CSS 像素。该结论对于位图一样适用:设备与位图的像素比规定了设备以多少个物理像素来显示 1px 的位图像素。

举个例子:

  如果我们在设备1上看这张图片,将会以 375 * 200 = 75000 个物理像素来显示,因此图片的清晰度不变。但如果我们在设备2上预览这张图片,将会以 375 * 200 *4 = 300000 个物理像素来显示这张图片。其用来显示图片的物理像素个数为图片像素的 4 倍,而图片实际上只有 75000 个有效像素。

  因为像素是最基本的单位,无法再进行拆分,所以剩下的 300000 - 75000 = 225000 个物理像素将采用填充的方法来显示图片。所谓填充,就是就近取色,这也是造成图片模糊的原因。

解决方案:使位图像素和设备像素的数目接近

现在我们就能来回答,为什么在移动设备开发者经常使用到@2x、@3x的图片了。

  前面已经知道,造成图片模糊的原因是位图的像素总数和对应的物理像素个数不一致,那么只需要增加图片的位图像素数目,使其接近于设备物理像素就解决了这个问题。 因此,要想完美的适配多种设备,就需要针对不同设备采用 @2x 或者 @3x 的图片,使图片的位图像素和设备位图像素的数目接近于 1:1,就能使图片清晰显示不模糊。

移动端开发为什么使用@2x@3x图片的更多相关文章

  1. python Image resize 对iOS图片素材进行2X,3X处理

    通常在iOS上开发使用的图片素材1x,2x,3x三种 下面利用python Image 库 resize函数,由一个大图,自动生成1x,2x,3x的素材照片: 1. 首先你的python环境要安装有I ...

  2. iOS开发 2x 3x图

    众所周知,iOS开发中的图片资源一般需要2倍图和3倍图,也就是2x,3x,但是最近思考了一个问题,为什么不能只提供3x的图片,2x的图片让系统从3x压缩就好了,于是上网搜索了下,得到了答案. 当我们在 ...

  3. 原生js开发,无依赖、轻量级的现代浏览器图片懒加载插件,适合在移动端开发使用

    优势 1.原生js开发,不依赖任何框架或库 2.支持将各种宽高不一致的图片,自动剪切成默认图片的宽高 比如说你的默认图片是一张正方形的图片,则各种宽度高度不一样的图片,自动剪切成正方形. 完美解决移动 ...

  4. 图片背景2X && 3X

    图片背景2X && 3X @media (-webkit-min-device-pixel-ratio: 3),(min-device-pixel-ratio: 3){ .share_ ...

  5. 自动由@3x图片生成@2x和@1x的图片 - Xcode插件

    原文:http://www.cocoachina.com/bbs/read.php?tid=277187 生成@3x图片对应的@2x和@1x版本--RTImageAssets 关键字:Xcode插件, ...

  6. 29.html5 移动端开发总结

    手机与浏览器 浏览器: 移动端开发主要针对手机,ipad等移动设备,随着地铁里的低头族越来越多,移动端开发在前端的开发任务中站的比重也越来越大.各种品牌及尺寸的手机也不尽相同.尺寸不同就算了分辨率,视 ...

  7. html5 移动端开发

    移动端开发总结     目录 1.手机与浏览器 2.Viewport(视窗) 3. 媒体查询 4.px,em,rem,pt 5.设备像素比devicePixelRatio 6.移动web中的图标及字体 ...

  8. iOS 2x 3x

    iOS中: 备注: Retina是一种显示技术,可以将把更多的像素点压缩至一块屏幕里,从而达到更高的分辨率并提高屏幕显示的细腻程度.而其最初该技术是用于苹果的iPhone4上.其屏幕分辨率为960×6 ...

  9. web移动端开发技巧与注意事项汇总

    一.meta的使用 1.<meta name="viewport" content="width=device-width,initial-scale=1.0, m ...

随机推荐

  1. Spring @Cacheable 缓存不生效的问题

    最近在项目中使用了Ehcache缓存,使用方式是用Spring提供的 @Cacheable 注解的方式,这种方式简单.快速.方便,推荐使用. 在使用的过程中,遇到了缓存不生效的情况,经过分析处理,总结 ...

  2. IAAS, SAAS, PAAS

    原文是Pizza‐as‐a‐Service: a detailed view,用来类比Cloud Service Models.出处来自于Data Sovereignty and the Cloud ...

  3. PMD的使用学习

    是什么? 静态代码分析器 能找出什么问题? 可能的 bugs - 空的 try/catch/finally/switch 声明 死码 - 未使用的本地变量,参数和私有方法 次优代码 - 无用的 Str ...

  4. spring filter详解

    一.Filter基本工作原理 1.Filter 程序是一个实现了特殊接口的 Java 类,与 Servlet 类似,也是由 Servlet 容器进行调用和执行的. 2.当在 web.xml 注册了一个 ...

  5. android+json+php+mysql实现用户反馈功能

    相信每个项目都会有用户反馈建议等功能,这个实现的方法很多,下面是我实现的方法,供大家交流.首先看具体界面,三个字段.名字,邮箱为选填,可以为空,建议不能为空.如有需要可以给我留言. 下面贴出布局代码, ...

  6. Java判断是否是质数

    public static boolean isPrime(int num) { /* * 质数定义:只有1和它本身两个因数的自然数 * * 1. 小于等于1或者是大于2的偶数,直接返回false * ...

  7. tarjan——有向图、无向图

    强连通块只存在于有向无环图DAG中 实际上low[i]的理解是:一个强连通块在dfs搜索树中子树的根节点 //把一个点当成根提溜出来,抖搂抖搂成一棵树 void dfs(int u) { //记录df ...

  8. 3、Linux基础--cp、mv、rm、alias、vi/vim命令

    笔记 1.考试 1.判断网络是否通畅的命令 ping 2.定义系统提示组成的变量 PS1 3.Linux中目录从什么开始 根(/) 4.系统中目录路径类型有哪些,解释一下 绝对路径:以根目录作为参照物 ...

  9. Vue中组件通信的几种方法(Vue3的7种和Vue2的12种组件通信)

    Vue3组件通信方式: props $emit expose / ref $attrs v-model provide / inject Vuex 使用方法: props 用 props 传数据给子组 ...

  10. The POM for com.alibaba:druid:jar:1.2.6 is invalid, transitive dependencies (if any) will not be available

    开发环境 IDEA2020.3,  jdk1.8.0_231 问题描述 开发中引入了druid-spring-boot-starter最新版本1.2.6,项目install时的时候一直出现警告 The ...