Jak znaleźć rozdzielczość ekranu ze skryptu powłoki?

Odpowiedzi:

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

Polecenie xdpyinfowyświetla różne informacje o twoim serwerze X. Zapisuje wiele rzeczy na standardowym wyjściu, ale potrzebujemy tylko linii zaczynającej się od słowa dimensions, dlatego używamy grep. Wreszcie używamy seddo czyszczenia wyniku.

Społeczność
źródło
Jeśli potrzebujesz osobno wymiaru osi xiy, możesz wykonać następujące czynności. Najpierw umieść wynik powyższego polecenia w zmiennej, używając $( )składni (tj DIMENSIONS=$(xdpyinfo ....). Następnie użyj sedponownie, aby uzyskać dwa: WIDTH=$(echo $DIMENSIONS | sed -r 's/x.*//')i HEIGHT=$(echo $DIMENSIONS | sed -r 's/.*x//').
mneri
xdpyinfodrukuje komunikat o błędzie, jeśli nie może uzyskać dostępu do informacji, więc przekierowanie błędu do /dev/null. Z tego powodu może chcesz dodać przekierowanie błędu: xdpyinfo 2> /dev/null. Tak, pełna piple wygląda następująco: xdpyinfo 2> /dev/null | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/'. To sprawi, że twój skrypt będzie bardziej solidny.
mneri
29

xdpyinfo | grep dimensionsda ci całkowitą rozdzielczość, jeśli masz wiele monitorów, będzie to suma ich wszystkich. xrandr --currentpoda rozdzielczość dla każdego monitora.

Używam tego fragmentu, aby znaleźć maksymalną możliwą rozdzielczość dla rDesktop bez przechodzenia do pełnego ekranu:

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

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

Wynik:

Xaxis = 1280
Yaxis = 1024

Minusowa dekoracja okien (mniej więcej):

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

Wynik:

MaxRes = 1275x999

Jaka jest maksymalna rozdzielczość dla rDesktop bez przejścia na pełny ekran.

Zakończ polecenie:

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

Jak dotąd działa dobrze, ale nie przetestowałem go dokładnie.

Innym przykładem jest screencast z avconv:

avconv -f x11grab -r 15 -s `xrandr --current | grep  '*' | uniq | awk '{print $1}'` -i :0.0 -c:v libx264 ./output.mp4
Eliezer E. Vargas
źródło
mówi>xdpyinfo: Unable to open display "".
Do Kra
Jak znaleźć dostępne tryby zmiany?
CMCDragonkai
Jeśli nie musisz odejmować dekoracji okna (itp.), Możesz to zrobić w jednej linijce rdesktop [other_args] -g $(xrandr --current | grep '*' | uniq | awk '{print $1}').
c24w 12.10.16
To nie jest suma dla wielu monitorów. To wymiary obwiedni, która zawiera wszystkie monitory.
Dennis Williamson
xrandr --current | grep '*' | awk -v line="$SCREEN" 'NR==line{print $1}' | cut -d 'x' -f1jeśli chcesz określić ekran (z konfiguracją wielu monitorów) ( SCREENjest indeksowany 1)
SapuSeven
5

Możesz użyć xrandr -qpolecenia. Na tej podstawie możesz w razie potrzeby utworzyć skrypt powłoki.

Aby uzyskać więcej informacji na temat polecenia, przejdź tutaj lub wpisz man xrandr

Ricbax
źródło
2
##########################################################################
## Używam tego z programem do nagrywania wideo.
# rozmiar okna - opcja root - informacje w oknie głównym ekranu
echo $ (xwininfo -root | grep 'geometria' | awk '{print 2 $;}')
Liczba wyjść: 1024 x 768 + 0 + 0
# wysokość x szerokość + x + y pozycji.
######################
## Instrukcja obsługi ##
człowiek xwininfo
JimmyLandStudios
źródło
Użyłem xwininfo -root|sed '/Height/!d;s/.* //'wysokości i xwininfo -root|sed '/Width/!d;s/.* //'szerokości.
deser
1

xdpyinfozrobi to z pewnym parsowaniem. Daje wiele informacji, z których będziesz musiał wykopać numer ekranu i wymiary

Rich Homolka
źródło
1

Powstały dwie możliwe alternatywy, łącząc odpowiedzi @ user31752 i @ eliezer-e-vargas

Prostsze wyrażenie regularne:

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

lub za pomocą cięcia:

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

Zastosowanie grep '*' | uniq@ eliezer-e-vargas daje inną linię (np. „1440x900 59,90 * + 59,89”) wyjścia xrandr, podczas gdy grep „podłączony” dostaje prosty (np. „LVDS1 podłączony 1440x900 + 0 + 0 ..... ”).

Użycie wyrażenia regularnego przez @ user31752 jest miłe, więc linia, której używam, wymaga prostszego wyrażenia regularnego lub może zostać zastąpiona prostszym poleceniem cięcia.

Przykładowy wynik 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)
Campisano
źródło
Czy jest jakiś powód, aby ktoś używał tych poleceń zamiast poleceń Eliezer E. Vargas ?
Scott,
Proszę edytować te informacje w swojej odpowiedzi.
Scott,
0

Jak w zaakceptowanej odpowiedzi, ale mniej skomplikowanej:

xdpyinfo | grep dimensions

Przykład wyniku:

dimensions:    1366x768 pixels (361x203 millimeters)
Billal Begueradj
źródło
0

Odczytywanie danych z ekranu monitora

Standard Vesa zapewnia metodę odczytu rozdzielczości ekranu monitora.

Rozszerzone dane identyfikacyjne wyświetlacza (EDID ): Ten standard określa formaty danych do przenoszenia informacji o konfiguracji, umożliwiając optymalne wykorzystanie wyświetlaczy.

Monitor zazwyczaj obsługuje wiele rozdzielczości i odświeżeń. Oczywiście ktoś preferuje maksymalny (fizyczny).

Aby odczytać dane z tego monitora, wypróbuj jedno z następujących rozwiązań:

  • edid-decode

    Jeśli nie jest zainstalowany, wpisz

    sudo apt install edid-decode
    

    Następnie przeczytaj edidplik

    edid-decode /sys/class/drm/card0-eDP-1/edid
    
  • read-edid

    Zainstaluj za pomocą

    sudo apt install read-edid 
    

    Następnie za pomocą i2c odczytaj dane monitora ekranu i parsuj je

    sudo get-edid | parse-edid
    
  • Zrzuć szesnastkowo edid dane

    W przypadku, gdy edid-tools nie są zainstalowane, możesz zrzucić edidplik hex, np .:

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

    Aby zaszyfrować ten plik hex, zajrzyj na wiki lub pobierz specyfikację edid .

abu_bua
źródło