(原创)高DPI适配经验系列:(一)缩放比例与DPI对应关系
一、前言
当下,2K分辨率已成为主流标配,3K、4K也已经广泛应用。
在屏幕尺寸不变的情况下,高分辨率也就意味着高DPI,对于桌面程序而言,除了先天就支持高DPI的框架外(如UWP、Electron等),大部分桌面程序如果不进行高DPI的适配,往往会出现界面模糊、控件错位、文本显示不全等问题。
目前网上关于高DPI适配的文章很少,大多只是某个问题点的解决、某个DPI相关概念的讲解,繁繁杂杂不成系统,也无迹可循。
本人曾对自己的软件进行过高DPI的适配,在适配的过程中,遇到了很多问题,这些问题中有很多都没有现成的答案,都是靠自己摸索和尝试去解决的。
本着分享的精神,便有了本系列文章,着重分享一下自己在高DPI适配中的一些知识与经验,同时也分享下自己是如何一步步发现、推理、归纳、总结出这些经验的,希望这种一步步的过程,会对你有一些启发。
当然,既然是“经验”,肯定不会百分百的正确,也不会百分百的通用,但“经验”的目的,就是让人有迹可循,作为后来者的肩膀,使之可以前进得更远。
相信看完的你,一定会有所收货!
本文地址:https://www.cnblogs.com/lesliexin/p/14620222.html
二、缩放百分比与DPI之前的对应关系
(一),信息的搜集
1,缩放比例
在Win7中,用户可自行设定的缩放百分比是:100%、125%、150%。
缩放比例的设置方法:

到了Win10,用户可以自己设定的缩放百分比是100%~500%之间的任意比例。
缩放比例的设置方法:

2,DPI
在不进行缩放时,即缩放比例为100%时,系统的DPI是96。

在缩放比例为125%时,DPI为120。

在缩放比例为150%时,DPI为144。

3,初步分析及问题发现
通过缩放比例与DPI的关系,我们可以发现,两者的增加并不是1比1的关系,即:当缩放比例增加1时,DPI也增加1。
如果为1比1关系,那缩放比例为125%时,DPI应该是(125-100)+96=121;而现实DPI却是120。同理,缩放比例为150%时,现实DPI是144,而不是(150-100)+96=146;
4,扩大样本量
因为Win7中只能设置3种比例,因为样本量太少,而无法正确归纳总结出规律。
但Win10足足可以设置100~500共401个缩放比例,样本量足够多,足以归纳总结出对应规律。
通过在Win10中进行大量的设置,发现了以下现象。
4.1,特殊的缩放比例
缩放比例每一个100间隔之间,就有8个特殊的缩放比例,这8个比例2个一组,对应同一个DPI的值。如下图所示。
100%~200%

200%~300%

300%~400%

400%~500%

4.2,特殊缩放比例自动变化
这些特殊的缩放比例中,只能输入图中加粗的缩放比例,即使输入前面的值,当你点击应用时,也会自动变成后面的值。
以特殊缩放比例是212为例,输入212,点击“应用”按钮,会自动变成213,也就是上图中加粗的字体。

4.3,除特殊缩放比例外的与DPI的对应关系。
通过样本发现,在这些特殊缩殊缩放比例之间,缩放比例与DPI的增加关系是1比1的。
如:缩放比例为225时,DPI为226,其缩放比例与上一个特殊缩放比例213的差值是12,其DPI的与上一个特殊缩放比例213对应的DPI值204之前的差值也是12。同理,与下一个特殊缩放比例237(DPI:228)之间的差值也都是12。
在计算时通过引入对这些特殊缩放比例的处理,我们就可以正确计算出缩放比例所对应的DPI值。

5,归纳
虽然已经可以通过引入特殊缩放比例来计算出正确的DPI值,但这并不是终点,还需要归纳出缩放比例与DPI之间的数学关系。
只有通过数学关系,才能不仅仅可以通过缩放比例来计算DPI,也可以通过DPI来计算出缩放比例。
通过简单的归纳,我归纳出了两者之间的数学关系。如下:
5.1,缩放比例->DPI

5.2,DPI->缩放比例

三,总结
通过上面一步步发现缩放比例与DPI关系的流程,发现并没有多少技术含量,更多的是耐心,也就是一些笨功夫。
在统计出那些特殊的缩放比例时,我并没有将100~500之间共401个缩放比例一个个都进行设置,而是通过7、8个样本推理出了一个结论,然后根据这个结论反推出几组值,最后再通过手动设置来验证这几组值,最终得到了正确的结论。
通过上面总结出来的缩放比例与DPI的关系,我写了个小工具,可以方便的在缩放比例与DPI之间换算。

缩放比例与DPI转换工具下载:https://files.cnblogs.com/files/lesliexin/ScaleFactor2Dpi.zip
-【END】-
(原创)高DPI适配经验系列:(一)缩放比例与DPI对应关系的更多相关文章
- (原创)高DPI适配经验系列:(四)高DPI适配示例
一.前言 光说不练假把式. 原理说再多,也不如一个例子直观明了.所以本篇文章就来通过一个例子演示一下高DPI适配的流程. 相信看完的你,一定会有所收获! 本文地址:https://www.cnblog ...
- (原创)高DPI适配经验系列:(二)按DPI范围适配
一.前言 一个软件,往往会用到位图资源,比如图标.图片.水晶按钮等. 在使用了位图资源后,就不能对任意DPI都进行适配,因为这样适配的代价太大了. 像Win10的缩放比例可以由100%-500%,如果 ...
- (原创)高DPI适配经验系列:(三)字体与字号、缩放锚点
一.前言 程序最基本的元素,就是文本,也就是字体.如果程序未进行高DPI的适配,最直观的感受便是字体的模糊.所以本篇便来说一下高DPI适配中的字体问题. 高DPI的适配,简单来说便是便是根据不同的DP ...
- Android-屏幕适配经验总结
本文记录一些适配问题的研究,基础概念不做过多介绍. Android在做屏幕适配的时候一般考虑两个因素:分辨率和dpi.分辨率是屏幕在横向.纵向上的像素点数总和,一般用"宽x高"的形 ...
- 有关windows dpi适配(c#)
/// <summary>当前Dpi</summary> public static Int32 Dpi { get; set; } /// <summary>修正 ...
- 【原创】Java并发编程系列1:大纲
[原创]Java并发编程系列1:大纲 一个人能力当中所蕴藏的潜能,远超过自己想象以外. 为什么要学习并发编程 随着现今互联网行业的迅猛发展,其业务复杂度.并发量也在不断增加,对程序的要求变得越来越高, ...
- 我的CSDN原创高质量免积分下载资源列表(持续更新)
最近几个月,我在CSDN平台,发表了大量原创高质量的项目,并给出了相应的源码.文档等相关资源. 为了方便CSDN用户或潜在需求者,下载到自己想要的资源,特分类整理出来,欢迎大家下载. 我的原则:原创高 ...
- AB实验的高端玩法系列3 - AB组不随机?观测试验?Propensity Score
背景 都说随机是AB实验的核心,为什么随机这么重要呢?有人说因为随机所以AB组整体不存在差异,这样才能准确估计实验效果(ATE) \[ ATE = E(Y_t(1) - Y_c(0)) \] 那究竟随 ...
- java高并发核心要点|系列文章
java高并发核心要点|系列1|开篇 java高并发核心要点|系列2|锁的底层实现原理 java高并发核心要点|系列3|锁的底层实现原理|ABA问题 java高并发核心要点|系列4|CPU内存指令重排 ...
随机推荐
- TypeScript & global.d.ts
TypeScript & global.d.ts https://www.typescriptlang.org/docs/handbook/declaration-files/template ...
- 算法型稳定币USDN有什么魔力引发市场热潮?
最近比特币重新突破了8万大关,区块链行业又再次火爆起来,吸引了圈内圈外人的火热讨论,而这其中市场投资者讨论最频繁的就要属算法型稳定币USDN了. USDN是基于NGK.IO区块链中的稳定币, 1枚US ...
- HTML+CSS+JS速查手册下载
下载链接:https://files.cnblogs.com/files/waterr/HTML_CSS_JS%E9%80%9F%E6%9F%A5.zip
- Python算法_爬楼梯(08)
假设你正在爬楼梯.需要 n 阶你才能到达楼顶. 每次你可以爬 1 或 2 个台阶.你有多少种不同的方法可以爬到楼顶呢? 注意:给定 n 是一个正整数. 示例 1: 输入: 2输出: 2解释: 有两种方 ...
- Dockerfile多阶段构建原理和使用场景
本文转载自Dockerfile多阶段构建原理和使用场景 导语 Docker 17.05版本以后,新增了Dockerfile多阶段构建.所谓多阶段构建,实际上是允许一个Dockerfile 中出现多个 ...
- SpringBoot启动报错 Disconnected from the target VM, address: '127.0.0.1:2227', transport: 'socket'
今天搭建了一个SpringBoot项目,刚启动就报错 Disconnected from the target VM, address: '127.0.0.1:2227', transport: 's ...
- DNS Rebinding漏洞原理
目录 SSRF过滤器设计 背景知识 DNS TTL 公网DNS服务器 DNS重绑定 自建DNS服务器 利用步骤图解 实战中的注意事项 防御 参考 DNS Rebinding 广泛用于绕过同源策略.SS ...
- Linux基本命令——系统管理和磁盘管理
转: Linux基本命令--系统管理和磁盘管理 Linux命令--系统管理和磁盘管理 一.系统管理 1.1 时间相关指令 <1> 查看当前日历: cal <2> 显示或设置时间 ...
- 剑指 Offer 58 - II. 左旋转字符串 + 简单题
剑指 Offer 58 - II. 左旋转字符串 Offer_58_2 题目描述 java代码 package com.walegarrett.offer; /** * @Author WaleGar ...
- 一文读懂Java动态代理
作者 :潘潘 日期 :2020-11-22 事实上,对于很多Java编程人员来说,可能只需要达到从入门到上手的编程水准,就能很好的完成大部分研发工作.除非自己强主动获取,或者工作倒逼你学习,否则我们好 ...