Как измерить размеры на экране?

29

У меня есть изображение на экране, и я хочу измерить его ширину. Конечно, я могу использовать линейку , но это капризно и медленно. Есть ли что-то, где я могу щелкнуть по клавише быстрого вызова, перетащить область, и она скажет мне высоту и ширину этой области?

Нечто похожее на Page Ruler для Google Chrome.

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

dayuloli
источник

Ответы:

10

Использование затвора

Сначала установите Shutter, если он у вас не установлен.

sudo apt-get install shutter

Откройте настройки под Edit -> Preferences и выберите вкладку поведения.
Проверьте «Запустить ставни при входе в систему» ​​и «Скрыть окно при первом запуске». Смотрите скриншот ниже:

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

использование

  1. Убедитесь, что значок панели затвора виден, и выберите свое окно или все, что вы хотите измерить.
  2. Нажмите на значок затвора и выберите «Выбор».

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

  1. Выберите начальную точку и перетащите ее к конечной точке. Все окно будет темнее, кроме вашего выбора. Вы можете перемещать границы, чтобы получить больше «точечных» результатов.
  2. Затвор предоставит диалоговое окно с координатами X и Y и размером (который вы хотите) выбора. Смотрите скриншот ниже в верхнем левом углу примера.

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

  1. Уменьшенный скриншот, показывающий, что он равен 727px на 367px:

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

  1. Наконец, просто нажмите, Escчтобы отклонить выбор и спрятать затвор.
  2. Продолжайте с тем, что вы делали.
Parto
источник
Очень аккуратный! Мне нравится функция перекрестия здесь! Очень полнофункциональный - можно взять окно, выбор, задержка и т. Д.
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'])?
Holloway
2

Используя помои

Другой простой способ определения области выбора - использование slop(Операция выбора) утилиты командной строки, «которая запрашивает выбор у пользователя и печатает область в стандартный вывод».

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)
Glutanimate
источник