Como faço para medir dimensões na tela?


29

Tenho uma imagem na tela e quero medir sua largura. Claro que posso usar uma régua , mas isso é caprichoso e lento. Existe algo em que posso clicar em uma tecla de atalho, arrastar uma área e ela me informará a altura e a largura dessa área?

Algo semelhante ao Page Ruler para Google Chrome.

Atualmente, estou usando Shift+ PrtScne arrasto a área, salve a imagem e, em seguida, vá em Propriedades para descobrir sua altura e largura.

Respostas:


10

Usando o obturador

Primeiro instale o Shutter, se você não o tiver instalado.

sudo apt-get install shutter

Abra as preferências em Editar -> Preferências e selecione a guia de comportamento.
Marque 'Iniciar obturador no login' e 'Ocultar janela no primeiro lançamento'. Veja a captura de tela abaixo:

insira a descrição da imagem aqui

Uso

  1. Verifique se o ícone do painel do obturador está visível e selecione sua janela ou o que você deseja medir.
  2. Clique no ícone do obturador e selecione 'seleção'.

insira a descrição da imagem aqui

  1. Selecione seu ponto de partida e arraste para o seu ponto final. A janela inteira escurecerá, exceto a sua seleção. Você pode mover as bordas para obter mais resultados "diretos".
  2. O obturador fornecerá uma janela de diálogo com as coordenadas X e Y e o tamanho (que é o que você deseja) da seleção. Veja a captura de tela abaixo no canto superior esquerdo de um exemplo.

insira a descrição da imagem aqui

  1. Uma captura de tela com menos zoom mostrando 727px por 367px:

insira a descrição da imagem aqui

  1. Finalmente, basta pressionar Escpara ignorar a seleção e ocultar o obturador.
  2. Continue com o que você estava fazendo.

Muito arrumado! Eu gosto do recurso de mira aqui! Muito cheio de recursos - pode levar Janela, seleção, têm atraso etc.
dayuloli

42

Como funciona

O script abaixo mede o tamanho de uma área, entre dois locais do ponteiro do mouse.

Funciona da seguinte forma:

  1. Coloque o ponteiro do mouse na primeira posição (sem clicar)

    insira a descrição da imagem aqui

  2. Pressione a combinação de teclas de sua escolha (veja mais abaixo)

  3. Coloque o mouse na segunda posição (novamente sem clicar)

    insira a descrição da imagem aqui

  4. Pressione sua combinação de teclas novamente. Uma notificação informará o tamanho exato (px) da área.

    insira a descrição da imagem aqui

Opções

Você pode escolher (removendo o comentário de uma das linhas) como deseja ser notificado; por uma notificação:

insira a descrição da imagem aqui

Ou uma janela de informações do Zenity:

insira a descrição da imagem aqui

(Os exemplos são de diferentes áreas)

Como usar

  1. O script usa xdotool:

    sudo apt-get install xdotool
    
  2. Copie o script abaixo em um arquivo vazio, descomente uma das linhas:

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

    (a ser notificado pela notify-sendopção)

    ou:

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

    para a Zenityopção

  3. Salve o script em ~/bin(você provavelmente precisará criar o diretório) como measure_area(sem extensão) e torne-o executável .

  4. Adicione uma combinação de teclas de sua escolha para executar o script: Escolha: Configurações do sistema> "Teclado"> "Atalhos"> "Atalhos personalizados". Clique no "+" e adicione o comando:

    measure_area
    

Notas

  • Você precisará sair / entrar primeiro
  • Não faz diferença o que você toma como primeira / segunda posição; o script mede valores absolutos .

O script

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

Explicação

Quando o script é chamado pela primeira vez, ele obtém a posição atual do mouse com o xdotoolcomando:

xdotool getmouselocation

Em seguida, salva a posição em um arquivo (invisível) .measure_area.txt, aguardando a segunda chamada.
Na segunda chamada, ele lê o arquivo, remove e compara as x/ycoordenadas armazenadas com as mais recentes e calcula o tamanho da área entre elas.

Editar

Atualizado o script com várias melhorias:

  • Otimizado subprocess.Popen()/ subprocess.check_output()comandos (graças a @muru, @Trengot)
  • Foi adicionado um procedimento de reparo, caso algo desse errado com o primeiro arquivo de dados (por exemplo, se o usuário tentasse executar o script pela primeira vez sem ter xdotoolinstalado)
  • Adicionado um pequeno flash de confirmação na tela de confirmação quando a combinação de teclas é pressionada para as primeiras coordenadas. Parece um pouco mais fácil fornecer ao usuário algum tipo de confirmação da ação.

1
Impressionante! Tentei agora, funciona perfeitamente! Obrigado! Você realmente merece uma medalha!
dayuloli

2
@dayuloli Obrigado pela pergunta! Eu amo fazer coisas assim.
27630 Jacob Vlijm em 10/02

Agradável! +1. Curioso: Por que em Popen(['/bin/bash',...vez de Popen(['zenity', '--info', ...?
muru

1
Brincando com aspas? Oo command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]; subprocess.Popen(command)exige muito menos mexer com , 'e "eu acho.
muru

1
Poderia ser feita a mesma alteração xdotools? Algo como check_output(['xdotools', 'getmouseposition'])?
Holloway

2

Usando slop

Outra maneira simples de determinar a área de uma seleção é usando slop(Selecionar Operação), um utilitário de linha de comando "que consulta uma seleção do usuário e imprime a região em stdout".

slopé uma ferramenta comparativamente nova e ainda não foi empacotada para o Debian / Ubuntu. Tal como está, terá de o compilar a partir da fonte:

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

A instalação é a parte mais difícil. slopem si é realmente muito fácil de trabalhar. Por exemplo, a seguinte linha única solicitará que você selecione uma área da tela e exibirá o resultado como uma notificação e gravará na área de transferência:

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

Captura de tela:

insira a descrição da imagem aqui

Uma rápida descrição dos comandos usados:

  • slop -t 0 -b 1- solicitar ao usuário que selecione uma área da tela; não selecione janelas completas ( -t 0), defina a borda de seleção como 1px ( -b 1)
  • eval $(...)- lê a saída de slopem variáveis
  • notify-send ... - envie notificação da GUI com informações sobre a área selecionada
  • echo ${W}x${H} | xsel -bi- copiar dimensões para a área de transferência (requer xselsudo apt-get install xsel)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.