Як вимірювати розміри на екрані?


29

У мене зображення на екрані, і я хочу виміряти його ширину. Звичайно, я можу використовувати лінійку , але це примхливо і повільно. Чи є щось, де я можу натиснути клавішу швидкого доступу, перетягнути область, і вона підкаже мені висоту і ширину цієї області?

Щось схоже на Page Ruler для Google Chrome.

Наразі я використовую Shift+ PrtScnі перетягую область, зберігаю зображення, а потім переходжу до "Властивості", щоб дізнатися його висоту та ширину.

Відповіді:


10

Використання затвора

Спочатку встановіть затвор, якщо у вас його немає.

sudo apt-get install shutter

Відкрийте налаштування в розділі Правка -> Налаштування та виберіть вкладку поведінки.
Поставте прапорець "Почати затвор при вході" та "Сховати вікно при першому запуску". Дивіться знімок екрана нижче:

введіть тут опис зображення

Використання

  1. Переконайтесь, що значок панелі заслінки видимий, і виберіть своє вікно або все, що ви хочете виміряти.
  2. Клацніть на піктограму затвора та оберіть «вибір».

введіть тут опис зображення

  1. Виберіть початкову точку та перетягніть її до кінцевої точки. Все вікно затьмариться, крім вашого вибору. Ви можете переміщати межі навколо, щоб отримати більше "до точки" результатів.
  2. Затвор надасть діалогове вікно з координатами X і Y та розміром (який саме потрібно). Дивіться знімок екрана нижче в лівому верхньому куті прикладу.

введіть тут опис зображення

  1. Зменшений знімок екрана, що показує його 727px на 367px:

введіть тут опис зображення

  1. Нарешті, просто натисніть, Escщоб відхилити вибір і сховати затвор.
  2. Продовжуйте все, що ви робили.

Дуже акуратно! Мені тут подобається перехресне волосся! Дуже повнофункціональний - може взяти вікно, відбір, мати затримку тощо
dayuloli

42

Як це працює

Сценарій нижче вимірює розмір області між двома місцями вказівника миші.

Він працює наступним чином:

  1. Поставте вказівник миші на перше місце (не клацаючи)

    введіть тут опис зображення

  2. Натисніть комбінацію клавіш на ваш вибір (див. Далі нижче)

  3. Поставте мишу на друге положення (знову без клацання)

    введіть тут опис зображення

  4. Знову натисніть комбінацію клавіш. У повідомленні буде вказано точний розмір (px) району.

    введіть тут опис зображення

Параметри

Ви можете вибрати (коментуючи один із рядків), як ви хочете отримувати повідомлення; або за допомогою повідомлення:

введіть тут опис зображення

Або вікно інформації про Zenity:

введіть тут опис зображення

(Приклади з різних областей)

Як користуватись

  1. Сценарій використовує xdotool:

    sudo apt-get install xdotool
    
  2. Скопіюйте скрипт нижче в порожній файл, коментуйте будь-який із рядків:

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

    (повідомляється notify-sendопцією)

    або:

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

    для Zenityваріанту.

  3. Збережіть скрипт у ~/bin(можливо, вам доведеться створити каталог) як measure_area(без розширення) та зробіть його виконуваним .

  4. Додайте комбінацію клавіш на свій вибір для запуску сценарію: Виберіть: Налаштування системи> "Клавіатура"> "Ярлики"> "Спеціальні ярлики". Клацніть "+" і додайте команду:

    measure_area
    

Примітки

  • Вам доведеться спочатку вийти / увійти
  • Це не має значення, що ви приймаєте за першу / другу позицію; сценарій вимірює абсолютні значення.

Сценарій

#!/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)

Пояснення

Коли сценарій викликається вперше, він отримує поточну позицію миші за допомогою xdotoolкоманди:

xdotool getmouselocation

Потім він зберігає позицію у (невидимий) файл .measure_area.txt, чекаючи другого дзвінка.
Під час другого дзвінка він зчитує файл, видаляє його і порівнює збережені x/yкоординати з останніми та обчислює розмір області між ними.

Редагувати

Оновлено сценарій із низкою вдосконалень:

  • Оптимізовані subprocess.Popen()/ subprocess.check_output()команди (завдяки @muru, @Trengot)
  • Додано процедуру відновлення у випадку, якщо з файлом перших даних щось пішло не так (наприклад, якщо користувач вперше спробував запустити скрипт, не xdotoolвстановивши його)
  • При натисканні комбінації клавіш для перших координат додається невеликий тьмяний екран, що підтверджує. Це здається трохи більш зручним для користувачів , щоб дати користувачеві деякого виду підтвердження дії.

1
Дивовижно! Спробував це тільки зараз, працює чудово! Дякую! Ви дійсно заслуговуєте медалі!
dayuloli

2
@dayuloli Дякую за запитання! Я люблю робити такі речі.
Яків Влійм

Приємно! +1. Цікаво: Чому Popen(['/bin/bash',...замість Popen(['zenity', '--info', ...?
муру

1
Погортання цитатами? Оо command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]; subprocess.Popen(command)вимагає набагато менше возитися 'і ", я думаю.
муру

1
Чи можна змінити те саме xdotools? Щось схоже check_output(['xdotools', 'getmouseposition'])?
Холлоуей

2

Використання нахилу

Іншим простим способом визначення області виділення є використання slop(Select Operation) утиліти командного рядка, "яка запитує вибір у користувача та друкує область для stdout".

slopє порівняно новим інструментом і досі не був упакований для Debian / Ubuntu. На даний момент вам доведеться компілювати його з джерела:

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

Установка - найскладніша частина. slopнасправді дуже легко працювати. Наприклад, наступний однолінійний підказник запропонує вам вибрати область екрана і відображатиме результат як сповіщення та записує його у буфер обміну:

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

Знімок екрана:

введіть тут опис зображення

Швидке розбиття використовуваних команд:

  • slop -t 0 -b 1- запропонувати користувачеві вибрати область екрану; не вибирайте повні вікна ( -t 0), встановіть межу вибору на 1px ( -b 1)
  • eval $(...)- зчитування результатів slopзмінних
  • notify-send ... - надіслати повідомлення GUI з інформацією про обрану область
  • echo ${W}x${H} | xsel -bi- скопіюйте розміри у буфер обміну (потрібно xselsudo apt-get install xsel)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.