Jak mierzyć wymiary na ekranie?


29

Mam obraz na ekranie i chcę zmierzyć jego szerokość. Oczywiście mogę użyć linijki , ale to kapryśne i powolne. Czy jest coś, w czym mogę kliknąć klawisz skrótu, przeciągnąć obszar, a on powie mi wysokość i szerokość tego obszaru?

Coś podobnego do Page Ruler dla Google Chrome.

Obecnie używam Shift+ PrtScni przeciągam obszar, zapisz obraz, a następnie przejdź do Właściwości, aby sprawdzić jego wysokość i szerokość.

Odpowiedzi:


10

Korzystanie z migawki

Najpierw zainstaluj Shutter, jeśli go nie masz.

sudo apt-get install shutter

Otwórz preferencje w menu Edycja -> Preferencje i wybierz kartę zachowania.
Zaznacz „Rozpocznij migawkę przy logowaniu” i „Ukryj okno przy pierwszym uruchomieniu”. Zobacz zrzut ekranu poniżej:

wprowadź opis zdjęcia tutaj

Stosowanie

  1. Upewnij się, że ikona panelu migawki jest widoczna i wybierz okno lub cokolwiek, co chcesz zmierzyć.
  2. Kliknij ikonę migawki i wybierz „wybór”.

wprowadź opis zdjęcia tutaj

  1. Wybierz punkt początkowy i przeciągnij do punktu końcowego. Całe okno zostanie przyciemnione, z wyjątkiem twojego wyboru. Możesz przesuwać granice, aby uzyskać więcej wyników „do rzeczy”.
  2. Migawka zapewni okno dialogowe ze współrzędnymi X i Y oraz rozmiarem (jaki chcesz) wyboru. Zobacz zrzut ekranu poniżej w lewym górnym rogu przykładu.

wprowadź opis zdjęcia tutaj

  1. Pomniejszony zrzut ekranu pokazujący rozmiar 727 na 367 pikseli:

wprowadź opis zdjęcia tutaj

  1. Na koniec naciśnij przycisk, Escaby anulować wybór i ukryć migawkę.
  2. Kontynuuj z tym, co robiłeś.

Bardzo schludny! Podoba mi się tutaj funkcja celownika! Bardzo w pełni funkcjonalny - może przyjmować Window, selekcję, mieć opóźnienie itp.
dayuloli

42

Jak to działa

Poniższy skrypt mierzy rozmiar obszaru między dwiema lokalizacjami wskaźnika myszy.

Działa w następujący sposób:

  1. Umieść wskaźnik myszy w pierwszej pozycji (bez klikania)

    wprowadź opis zdjęcia tutaj

  2. Naciśnij wybraną kombinację klawiszy (patrz dalej poniżej)

  3. Umieść mysz w drugiej pozycji (ponownie bez klikania)

    wprowadź opis zdjęcia tutaj

  4. Naciśnij ponownie kombinację klawiszy. Powiadomienie powie ci dokładny rozmiar (px) obszaru.

    wprowadź opis zdjęcia tutaj

Opcje

Możesz wybrać (odznaczając jedną z linii), w jaki sposób chcesz otrzymywać powiadomienia; albo poprzez powiadomienie:

wprowadź opis zdjęcia tutaj

Lub okno informacyjne Zenity:

wprowadź opis zdjęcia tutaj

(Przykłady pochodzą z różnych dziedzin)

Jak używać

  1. Skrypt wykorzystuje xdotool:

    sudo apt-get install xdotool
    
  2. Skopiuj poniższy skrypt do pustego pliku, odkomentuj jeden z wierszy:

    command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
    

    (powiadamia notify-sendopcja)

    lub:

    command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
    

    dla Zenityopcji.

  3. Zapisz skrypt w ~/bin(prawdopodobnie będziesz musiał utworzyć katalog) jako measure_area(bez rozszerzenia) i uczyń go wykonywalnym .

  4. Dodaj dowolną kombinację klawiszy, aby uruchomić skrypt: Wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie:

    measure_area
    

Uwagi

  • Najpierw musisz się wylogować / zalogować
  • Nie ma znaczenia, co bierzesz za pierwszą / drugą pozycję; skrypt mierzy wartości bezwzględne .

Scenariusz

#!/usr/bin/env python3
import subprocess
import os
import math

home = os.environ["HOME"]
area = home+"/"+".measure_area.txt"

def get_pos():
    pos_data = subprocess.check_output(["xdotool", "getmouselocation"]).decode("utf-8")
    return [m[2:] for m in pos_data.split()[:2]]

def confirm():
    get = subprocess.check_output(["xrandr", "--verbose"]).decode("utf-8").split()
    for s in [get[i-1] for i in range(len(get)) if get[i] == "connected"]:
        br_data = float(get[get.index("Brightness:")+1])
        brightness = lambda br: ["xrandr", "--output", s, "--brightness", br]
        flash = ["sleep", "0.1"]
        for cmd in [brightness(str(br_data-0.1)), flash, brightness(str(br_data))]:
            subprocess.call(cmd)

if not os.path.exists(area):
    with open(area, "wt") as measure:
        measure.write(str(get_pos()))
    confirm()
else:
    second = get_pos()
    with open(area) as first_m:
        try:
            first = eval(first_m.read())
            w = int(math.fabs(int(second[0]) - int(first[0])))
            h = int(math.fabs(int(second[1]) - int(first[1])))
            #--- uncomment either one of the lines below:
            # command = ['notify-send', 'Area size', str(w)+' x '+str(h)]
            command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]
            #---
            confirm()
        except SyntaxError:
            text = "Please try again, there was an error in the data"
            command = ['zenity', '--info', '--title', 'Please try again', '--text', text]
        subprocess.Popen(command)
    os.remove(area)

Wyjaśnienie

Gdy skrypt jest wywoływany po raz pierwszy, pobiera bieżącą pozycję myszy za pomocą xdotoolpolecenia:

xdotool getmouselocation

Następnie zapisuje pozycję w (niewidocznym) pliku .measure_area.txt, czekając na drugie połączenie.
Przy drugim wywołaniu odczytuje plik, usuwa go i porównuje zapisane x/ywspółrzędne z najnowszymi oraz oblicza wielkość obszaru między nimi.

Edytować

Zaktualizowano skrypt o kilka ulepszeń:

  • Zoptymalizowany subprocess.Popen()/subprocess.check_output() polecenia (dzięki @muru, @Trengot)
  • Dodano procedurę naprawy na wypadek, gdyby coś poszło nie tak z plikiem pierwszych danych (np. Jeśli użytkownik najpierw próbował uruchomić skrypt bez niego xdotool instalacji)
  • Dodano mały ekran z przyciemnieniem migającego ekranu po naciśnięciu kombinacji klawiszy dla pierwszych współrzędnych. Wydaje się, że jest nieco bardziej przyjazny dla użytkownika, aby dać mu jakieś potwierdzenie działania.

1
Niesamowite! Wypróbowałem to teraz, działa idealnie! Dziękuję Ci! Naprawdę zasługujesz na medal!
dayuloli

2
@dayuloli Dzięki za pytanie! Ja uwielbiam robić takie rzeczy.
Jacob Vlijm,

Miły! +1. Ciekawe: dlaczego Popen(['/bin/bash',...zamiast Popen(['zenity', '--info', ...?
muru

1
Bawisz się cytatami? Oo command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]; subprocess.Popen(command)wymaga o wiele mniej zamieszania 'i ", jak sądzę.
muru

1
Czy można wprowadzić tę samą zmianę xdotools? Coś takiego check_output(['xdotools', 'getmouseposition'])?
Holloway,

2

Za pomocą slop

Innym prostym sposobem ustalenia obszaru zaznaczenia jest użycie slop(Wybierz operację), narzędzia wiersza polecenia „, które pyta o wybór od użytkownika i drukuje region na standardowe wyjście”.

slopjest stosunkowo nowym narzędziem i nie zostało jeszcze spakowane dla Debian / Ubuntu. W obecnej postaci będziesz musiał skompilować go ze źródła:

sudo apt-get install build-essential cmake libxext-dev
git clone https://github.com/naelstrof/slop.git
cd slop
cmake ./
make && sudo make install

Instalacja jest najtrudniejsza. slopsam w sobie jest bardzo łatwy w obsłudze. Na przykład następujący linijka wyświetli monit o wybranie obszaru ekranu i wyświetli wynik jako powiadomienie oraz zapisze go w schowku:

eval $(slop -t 0 -b 1) && notify-send  "Selection info" "Area: ${W} x ${Y}px \n Position: X = ${X}px, Y = ${Y}px" && echo ${W}x${H} | xsel -bi

Zrzut ekranu:

wprowadź opis zdjęcia tutaj

Szybki podział używanych poleceń:

  • slop -t 0 -b 1- poproś użytkownika o wybranie obszaru ekranu; nie zaznaczaj pełnego okna ( -t 0), ustaw granicę wyboru na 1px ( -b 1)
  • eval $(...)- odczytać wyjście slopzmiennych
  • notify-send ... - wyślij powiadomienie GUI z informacją o wybranym obszarze
  • echo ${W}x${H} | xsel -bi- skopiuj wymiary do schowka (wymaga xselsudo apt-get install xsel)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.