Windows下用Python获取电脑显示器物理尺寸和PPI

  • 背景
  • PPI 和 DPI
  • Python获取PPI
    • 方法一(WMI)
    • 方法二(WINREG)
    • 方法三(WMI+WINREG)
  • 总结

背景

最近在做一个项目,需要获取电脑屏幕PPI,网上好多都是人云亦云,花了蛮多时间的,深感不易!记录一下结果,希望对后来者有所帮助。

PPI 和 DPI

PPI (Pixels Per Inch) : 即每一英寸长度上有多少个像素点;
DPI (Dots Per Inch): 即每一英寸上有多少个点;

这里一个是像素点(Pixel),一个是点(Dot),区别就在这里。像素点(Pixel)是一个最小的基本单位,是固定不变的。而点(Dot) 则不同,它可以根据输出或者显示需要来改变的,可以是 1Dot = 1Pixel,也可以是 1Dot = N Pixel。

在电脑里,分辩率是可以调节的,这里用的就是Dot ,密度用DPI描述;只有当使用屏幕最大分辩率的时候(即 1Dot = 1Pixel),这个时候 DPI = PPI。

Python获取PPI

方法一(WMI)

1、安装wmi模块: pip install wmi
2、wmi依赖文win32com模块: pip install pywin32

使用wmi获取屏幕信息:

import wmiw = wmi.WMI()
monitors = w.Win32_DesktopMonitor()
for m in monitors:print(m)

结果如下:

可以看到有屏幕分辨率和 PPI,但是这里的PPI只是一个逻辑尺寸上的PPI,并不准确,
而且貌似在WIN10上并不会显示屏幕分辩率,所以这种方法不可用。

方法二(WINREG)

通过读取注册表可以获取到显示器信息
代码如下:

import winreg#此处是显示器注册表路径,不同的电脑可能不一样(DISPLAY后面那部分路径)
# 要根据自己的电脑去填写,比如我的电脑是: \SYSTEM\ControlSet001\Enum\DISPLAY\CMN1604\1&8713bca&0&UID0\Device Parameters
monitorInfoPath =r"SYSTEM\\ControlSet001\\Enum\\你的显示器的路径信息"
monitorInfoPath = monitorInfoPath   + "Device Parameters"
info = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, monitorInfoPath)
#EDID有128Bytes,包含很多显示器相关信息,感兴趣可以去查一下EDID解析
value = winreg.QueryValueEx(info,"EDID")[0]
#屏幕实际尺寸
width, height = value[21], value[22]
#推荐屏幕分辨率
widthResolution = value[56] +(value[58]>>4)*256
heightResolution = value[59] +(value[61]>>4)*256
#屏幕像素密度(Pixels Per Inch)
widthDensity = widthResolution/(width/2.54)
heightDensity = heightResolution/(height/2.54)print("屏幕宽度:", width, " (厘米)")
print("屏幕高度:", height, " (厘米)")
print("水平分辩率: ", widthResolution, " (像素)")
print("垂直分辩率: ", heightResolution, " (像素)")
print("水平像素密度: ", widthDensity, " (PPI)")
print("垂直像素密度: ", heightDensity, " (PPI)")

这里我们可以得到显示器的实际尺寸,推荐(最大)分辩率,从而计算出PPI。

但是这里有一个问题,注册表中有时候会包含好几个显示器的信息(只要你连过的显示器,都在里面),到底哪一个是正在用的呢?

方法三(WMI+WINREG)

结合上面的两个方法就可以了,wmi获取PNPDeviceID,再用winreg读取相关信息!
代码如下:

import winreg
import wmiPATH = "SYSTEM\\ControlSet001\\Enum\\"m = wmi.WMI()
#获取屏幕信息
monitors = m.Win32_DesktopMonitor()for m in monitors:subPath = m.PNPDeviceID      ##可能有多个注册表if subPath == None:continue# 这个路径这里就是你的显示器在注册表中的路径,比如我现在的电脑是在HKEY_LOCAL_MACHINE下面的路径:# \SYSTEM\ControlSet001\Enum\DISPLAY\CMN1604\1&8713bca&0&UID0\Device ParametersinfoPath = PATH + subPath + "\\Device Parameters"key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE,infoPath)#屏幕信息按照一定的规则保存(EDID)value = winreg.QueryValueEx(key,"EDID")[0]winreg.CloseKey(key)#屏幕实际尺寸width, height = value[21], value[22]#推荐屏幕分辨率widthResolution = value[56] +(value[58]>>4)*256heightResolution = value[59] +(value[61]>>4)*256#屏幕像素密度(Pixels Per Inch)widthDensity = widthResolution/(width/2.54)heightDensity = heightResolution/(height/2.54)print("屏幕宽度:", width, " (厘米)")print("屏幕高度:", height, " (厘米)")print("水平分辩率: ", widthResolution, " (像素)")print("垂直分辩率: ", heightResolution, " (像素)")#保留小数点固定位数的两种方法print("水平像素密度: ", round(widthDensity, 2), " (PPI)")print("垂直像素密度: ", "%2.f"%heightDensity, " (PPI)")

结果如下:

总结

个人感觉,用WMI获取当前显示器并不是一种很恰当的方法,当有多个显示器的时候,貌似只能获取主显示器的信息。各位看官有什么想法建议,随时交流!

Windows下用Python获取电脑显示器物理尺寸和PPI相关推荐

  1. python如何获取图片的尺寸_如何基于Python获取图片的物理尺寸

    如何基于Python获取图片的物理尺寸 这篇文章主要介绍了如何基于Python获取图片的物理尺寸,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 问题 ...

  2. 最详细的Windows下安装Python和pycharm破解教程,不会电脑的都能安装成功!

    辅助视频教程:Python基础教程|xin3721自学网ul li id=itemtitlePython3 从入门到精通视频教程/li /ul ul li class=description Pyth ...

  3. python windows 消息通讯_在windows下使用python进行串口通讯的方法

    在windows下使用python进行串口通讯的方法 Windows版本下的python并没有内置串口通讯的pyserial的库,所以需要自己下载.参照了网上的教程,有许多用的pip的安装方式,但是试 ...

  4. Windows下使用Python实现串口通信

    Windows下使用Python实现串口通信 基本信息 配置过程 配置思路 详细配置过程 安装USB装TTL驱动 配置serial库 获取设备端口号 配置串口通信 配置说明 测试过程 其他学习记录 参 ...

  5. python硬盘api-使用python获取电脑的磁盘信息方法

    使用Python获取电脑的磁盘信息需要借助于第三方的模块psutil,这个模块需要自己安装,纯粹的CPython下面不具备这个功能. 在iPython交互界面中进行如下演示: 查看电脑的磁盘分区: I ...

  6. windows搭建python开发环境方法_04 Windows下搭建 Python 开发环境 - Python 入门教程

    前面两个小节中我们已经学习了在 MacOS 和 Ubuntu 中安装 Python 的开发环境.当然,作为用户基数最多的 Windows 操作系统,我们当然不会忘记,这节课我们就来学习下如何在 Win ...

  7. Python获取电脑硬件信息及状态的实现方法

    From: http://www.jb51.net/article/54470.htm 这篇文章主要介绍了Python获取电脑硬件信息及状态的实现方法,是一个很实用的技巧,需要的朋友可以参考下 本文以 ...

  8. 怎么查看电脑有没有python_使用python获取电脑的磁盘信息方法

    使用Python获取电脑的磁盘信息需要借助于第三方的模块psutil,这个模块需要自己安装,纯粹的CPython下面不具备这个功能. 在iPython交互界面中进行如下演示: 查看电脑的磁盘分区: I ...

  9. python 获取硬盘信息_使用python获取电脑的磁盘信息方法

    使用Python获取电脑的磁盘信息需要借助于第三方的模块psutil,这个模块需要自己安装,纯粹的CPython下面不具备这个功能. 在iPython交互界面中进行如下演示: 查看电脑的磁盘分区: I ...

最新文章

  1. 关于SSL配置的报告
  2. 这10项创新技术正在引领零售业数字化转型
  3. 全球充电最快手机:5分钟回血50%;华为未发布新手机 | MWC 2022
  4. 详细讲解设计LOGO思维方式和方法【转】
  5. Python自动化运维——DNS处理模块
  6. python3输入输出_Python3 输入和输出
  7. python多久可以精通_学Python需要多久能学会?精通Python需要多长时间?
  8. MySQL.. ERROR! The server quit without updating PID file问题解决
  9. 不得不爱开源 Wijmo jQuery 插件集(10)-【Expander】(附页面展示和源码)
  10. Python让繁琐工作自动化——chapter12 处理Excel电子表格
  11. ubuntu安装ROBOWARE
  12. 正定矩阵,半正定矩阵,负定矩阵的通俗理解
  13. 单片机课程设计—简易频率计—课程设计任务书
  14. QtDesigner配置
  15. 郭天祥的10天学会51单片机_第十节
  16. 北漂小斌和你分享北京大兴机场3dmax模型
  17. USACO Palindromic Squares 回文平方数
  18. redis 高可用(持久化、主从复制、哨兵、集群)以及集群的三种模式
  19. PHP 微信支付v3签名生成
  20. Node.js 中 __dirname 和 ./ 的区别

热门文章

  1. C语言 TCP并发服务器
  2. 华为fusion computer虚拟机存储数据恢复
  3. 日志php-error错误日志查看
  4. 公司地址变更,税务变更,公司搬家了怎么变更企业信息
  5. scratch项目:自制电子乐器(Scratch声音类积木的应用/scratch的声音魔法)
  6. [poj1797] Heavy Transportation
  7. 精选经典情歌荟萃26首
  8. iOS开发笔记:大小写敏感的iOS文件系统,而iOS模拟器对大小写不敏感
  9. 计算机系大二学期计划范文,大二学期学习计划范文6篇
  10. 游戏陪玩App,如雨后春笋般冒出,直接导致整个游戏陪玩源码市场的持续火爆