请选择 进入手机版 | 继续访问电脑版
 找回密码
注册
查看: 675|回复: 1

[PECMD开发] 从显示屏EDID数据分析MacBookPro高分屏在Win10pe下不能自动拉伸高DPI的问题

[复制链接]
  • TA的每日心情

    2017-11-24 01:58
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2018-11-17 13:30:15 | 显示全部楼层 |阅读模式
    这里用的是MacBookPro13,1解析,这个是2016年的13.3寸屏。
    注:本文中所提到在代码,是PECMD2012的代码。
    从win10的某个版本开始,可以默认高分辨屏自动适配DPI拉伸,好像是从14393开始(具体我记不清了),这里用16299解析。首先我们需要了解一个名词EDID
    https://baike.baidu.com/item/EDID/980390
    百度上这个说的不是太全,还有一个长度为256的版本。
    从EDID中我们得到显示屏的物理尺寸,宽和高,从而可以得到显示屏的大小(我们通常说的多少寸显示器),进而算出显示屏的面板DPI,有的地方也称为PPI,我对这两个名词有点晕,此文中就称为面板DPI吧。
    首先,我们要读取到显示屏的EDID数据,这里用到的方法是先获取显示屏的硬件实例ID信息,然后再去注册表中找,原理就用下面的代码演示。
    1. DEVI listdev:&MonitorInfo *listdev=i *devid:"C:*PNP09FF"
    2. REGI @HKLM\SYSTEM\CurrentControlSet\Enum\%&MonitorInfo%\Device Parameters\EDID,&MonitorInfoTemp
    复制代码
    这里只有一个显示屏,所以不考虑多显示屏的情况。
    %&MonitorInfoTemp%的数据就是当前显示屏的EDID数据。我这里获取到的数据如下
    1. 0x00 0xFF 0xFF 0xFF 0xFF 0xFF 0xFF 0x00 0x06 0x10 0x34 0xA0 0x00 0x00 0x00 0x00 0x25 0x19 0x01 0x04 0xB5 0x42 0x29 0x78 0x02 0x0F 0xA1 0xAE 0x52 0x43 0xB0 0x26 0x0D 0x50 0x54 0x00 0x00 0x00 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0x01 0xD9 0x65 0x00 0x50 0xA0 0x40 0x2E 0x60 0x08 0x20 0x08 0x08 0x1E 0xB3 0x10 0x00 0x00 0x1A 0x7C 0x80 0x40 0x50 0xB0 0x08 0x34 0x70 0x08 0x20 0x68 0x08 0x1E 0xB3 0x10 0x00 0x00 0x1A 0x00 0x00 0x00 0xFC 0x00 0x43 0x6F 0x6C 0x6F 0x72 0x20 0x4C 0x43 0x44 0x0A 0x20 0x20 0x20 0x00 0x00 0x00 0x10 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0x00 0xA3
    复制代码
    显示屏的宽为21字节数据0x42,高为22字节数据0x29(我们按顺序数的话,应该是第22和第23个数据,这里是16进制数据换算成10进制就是66和41,注意这里的单位是厘米而不是英寸),然后我们要算显示屏的对角线长度,就是显示器的尺寸了。求一下66和41的弦长,然后再换算成英寸(1英寸=2.54厘米),得到最终的数据大概是30.6英寸。
    哇靠,和实际的13.3英寸相差巨大,然后肯定得到的面板DPI值也是偏差很多。
    我们算一下面板的DPI吧。
    首先获取屏幕最大分辨率,代码如下:
    1. DISP ?* &AllDisps
    复制代码
    %&AllDisps%变量就是得到的数据如下:
    1. 2880        1800        32        64
    复制代码
    得到最大分辨率为2880*1800
    DPI的意思大概是,一英寸多少个像素点,我们常用对角线像素数除以显示屏英寸大小来表示面板DPI。这里其实就是求2880和1800的弦长,再除以30.6。最终我们计算得到的值为大概111。
    到这里差不多可以看出真相了。
    下面提供一个微软官方的默认缩放比例列表清单参考下:
    https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-8.1-and-8/dn528846(v%3dwin.10)
    丛这几个表里差不多就能知道为什么没有自动拉伸DPI了,因为这时候系统获取到的显示屏大小及面板DPI值不满足条件。
    究竟是什么原因造成的数据不准,需要进一步研究。但是可以确定一点的就是,在USM全能版Win10pe中,我们启用显卡驱动支持并正确安装显卡驱动之后,这些数据都正常了。

    以上技术层面上的分析,为什么要分析原因呢?因为USM新版可以很好的解决这个问题,我们纠正这个显示器尺寸错误的信息,并写个程序拉伸DPI即可。具体方法请随后留意后期的教程。




    评分

    参与人数 1金钱 +2 收起 理由
    open_987 + 2 赞一个!

    查看全部评分





    上一篇:请教下各位大佬 启动PE时无背景壁纸 仅为黑色选择 V6特别版
    下一篇:请大伙帮忙获取一些主板信息,感谢。
  • TA的每日心情
    开心
    13 小时前
  • 签到天数: 129 天

    [LV.7]常住居民III

    发表于 2018-11-17 14:50:00 | 显示全部楼层
    为楼主的精华帖点赞啦!
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则