如何从Shell脚本中找出屏幕分辨率?


Answers:


55
xdpyinfo | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/'

命令xdpyinfo显示有关X服务器的各种信息。它在标准输出中写了很多东西,但是我们只需要以单词开头的行dimensions,因此我们使用grep。最后,我们使用sed清理结果。


如果分别需要x和y轴尺寸,则可以执行以下操作。首先,使用$( )语法(即DIMENSIONS=$(xdpyinfo ...)将上述命令的结果放入变量中。然后sed再次使用获得两个:WIDTH=$(echo $DIMENSIONS | sed -r 's/x.*//')HEIGHT=$(echo $DIMENSIONS | sed -r 's/.*x//')
mneri '17

xdpyinfo如果无法访问信息,则会显示一条错误消息,因此将错误重定向到/dev/null。因此,您可能要添加错误重定向:xdpyinfo 2> /dev/null。因此,全piple看起来是这样的:xdpyinfo 2> /dev/null | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/'。这将使您的脚本更加牢固。
mneri '17

29

xdpyinfo | grep dimensions将为您提供总分辨率,如果您有多台显示器,则为所有显示器的总和。xrandr --current将为您提供每台显示器的分辨率。

我使用此代码段查找rDesktop的最大可能分辨率,而无需进入全屏显示:

Xaxis=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f1)

Yaxis=$(xrandr --current | grep '*' | uniq | awk '{print $1}' | cut -d 'x' -f2)

输出:

Xaxis = 1280
Yaxis = 1024

减窗户装饰(或多或少):

MaxRes=$(($Xaxis-5))"x"$(($Yaxis-25))

输出:

MaxRes = 1275x999

这是rDesktop的最大分辨率,而不需要全屏显示。

结束命令:

rdesktop -u $User -P -z -5 -g $MaxRes $Host &

到目前为止,它工作正常,但是我还没有进行全面测试。

另一个例子是使用以下内容进行屏幕录像avconv

avconv -f x11grab -r 15 -s `xrandr --current | grep  '*' | uniq | awk '{print $1}'` -i :0.0 -c:v libx264 ./output.mp4

它说>xdpyinfo: Unable to open display "".
致Kra 2015年

您如何找到可更改为的可用模式?
CMCDragonkai

如果您不需要为窗户装饰(例如)减去,则可以单排完成rdesktop [other_args] -g $(xrandr --current | grep '*' | uniq | awk '{print $1}')
c24w

这不是多台显示器的总和。它是包含所有监视器的边框的尺寸。
丹尼斯·威廉姆森

xrandr --current | grep '*' | awk -v line="$SCREEN" 'NR==line{print $1}' | cut -d 'x' -f1如果要指定屏幕(使用多显示器设置)(SCREEN索引为1)
SapuSeven

5

您可以使用该xrandr -q命令。然后,您可以根据需要创建一个shell脚本。

有关命令的更多信息,请转到此处或键入man xrandr


2
#############################################
##我在视频录制程序中使用它。
#window size --root选项-屏幕根窗口上的信息
echo $(xwininfo -root | grep'geometry'| awk'{print $ 2;}')
#个输出:1024x768 + 0 + 0
#高度x宽度+ x + y位置。
######################
## 参考手册 ##
男子xwininfo

我用于xwininfo -root|sed '/Height/!d;s/.* //'高度和xwininfo -root|sed '/Width/!d;s/.* //'宽度。
甜点


1

结合@ user31752和@ eliezer-e-vargas的答案产生了两种可能的替代方法

一个更简单的正则表达式:

$ xrandr --current | sed -n 's/.* connected \([0-9]*\)x\([0-9]*\)+.*/\1x\2/p'
1440x900

或使用cut:

$ xrandr --current | grep ' connected ' | cut -d ' ' -f 3 | cut -d '+' -f 1
1440x900

使用grep '*' | uniq@ eliezer-e-vargas获得xrandr输出的另一行(例如“ 1440x900 59.90 * + 59.89”),而grep'connected'得到一个简单的行(例如“ LVDS1连接1440x900 + 0 + 0 .....“)。

@ user31752对regex的使用很好,因此我正在使用的行需要一个更简单的regex,或者可以用更简单的cut命令代替。

xrandr输出示例

$ xrandr --current
Screen 0: minimum 320 x 200, current 1440 x 900, maximum 8192 x 8192
LVDS1 connected 1440x900+0+0 (normal left inverted right x axis y axis) 331mm x 207mm
   1440x900      59.90*+  59.89  
   1360x768      59.80    59.96  
   1152x864      60.00  
   1024x768      60.00  
   800x600       60.32    56.25  
   640x480       59.94  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 disconnected (normal left inverted right x axis y axis)
DP1 disconnected (normal left inverted right x axis y axis)

有人有理由使用这些命令来代替Eliezer E. Vargas的答案中的命令吗?
斯科特,

请将该信息编辑为答案。
斯科特,

0

就像公认的答案一样,但不太复杂:

xdpyinfo | grep dimensions

输出示例:

dimensions:    1366x768 pixels (361x203 millimeters)

0

读取监视器屏幕数据

vesa标准提供了一种如何读取监视器屏幕分辨率的方法。

扩展显示标识数据(EDID):此标准定义了携带配置信息的数据格式,从而可以最佳地使用显示器。

监视器通常支持多种分辨率和刷新率。当然,有人会喜欢最大的(物理的)。

要读取此监视器数据,请尝试以下解决方案之一:

  • 急速解码

    如果未安装,请键入

    sudo apt install edid-decode
    

    然后读取edid文件

    edid-decode /sys/class/drm/card0-eDP-1/edid
    
  • 读入

    与安装

    sudo apt install read-edid 
    

    然后通过i2c读取屏幕监视器数据并进行解析

    sudo get-edid | parse-edid
    
  • 十六进制转储数据

    如果未安装edid-tools,则可以转储edidhex文件,例如:

    hd /sys/class/drm/card0-eDP-1/edid
    

    要加密此十六进制文件,请查看Wiki或下载edid规范

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.