¿Cómo mido las dimensiones en la pantalla?

29

Tengo una imagen en pantalla y quiero medir su ancho. Por supuesto que puedo usar una regla , pero eso es caprichoso y lento. ¿Hay algo en donde pueda hacer clic en una tecla de acceso directo, arrastrar un área y me dirá la altura y el ancho de esa área?

Algo similar a la regla de página para Google Chrome.

Actualmente, estoy usando Shift+ PrtScny arrastro el área, guardo la imagen y luego voy a Propiedades para averiguar su altura y ancho.

dayuloli
fuente

Respuestas:

10

Usando el obturador

Primero instale Shutter si no lo tiene instalado.

sudo apt-get install shutter

Abra las preferencias en Editar -> Preferencias y seleccione la pestaña de comportamiento.
Marque 'Iniciar obturador al iniciar sesión' y 'Ocultar ventana en el primer inicio'. Ver captura de pantalla a continuación:

ingrese la descripción de la imagen aquí

Uso

  1. Asegúrese de que el icono del panel del obturador esté visible y seleccione su ventana o lo que quiera medir.
  2. Haga clic en el icono del obturador y seleccione 'selección'.

ingrese la descripción de la imagen aquí

  1. Seleccione su punto de partida y arrastre hasta su punto final. La ventana completa se oscurecerá excepto su selección. Puede mover los bordes para obtener más resultados "al punto".
  2. Shutter proporcionará una ventana de diálogo con las coordenadas X e Y y el tamaño (que es lo que desea) de la selección. Vea la captura de pantalla a continuación en la esquina superior izquierda de un ejemplo.

ingrese la descripción de la imagen aquí

  1. Una captura de pantalla reducida que muestra 727 px por 367 px:

ingrese la descripción de la imagen aquí

  1. Finalmente solo presione Escpara descartar la selección y ocultar el obturador.
  2. Continúa con lo que sea que estuvieras haciendo.
Parto
fuente
¡Muy aseado! ¡Me gusta la función de punto de mira aquí! Muy completo - puede tomar ventana, selección, tener retraso, etc.
dayuloli
42

Cómo funciona

El siguiente script mide el tamaño de un área, entre dos ubicaciones del puntero del mouse.

Funciona de la siguiente manera:

  1. Coloque el puntero del mouse en la primera posición (sin hacer clic)

    ingrese la descripción de la imagen aquí

  2. Presione la combinación de teclas que prefiera (ver más abajo)

  3. Coloque el mouse en la segunda posición (nuevamente sin hacer clic)

    ingrese la descripción de la imagen aquí

  4. Presione su combinación de teclas nuevamente. Una notificación le indicará el tamaño exacto (px) del área.

    ingrese la descripción de la imagen aquí

Opciones

Puede elegir (descomentando una de las líneas) cómo le gustaría recibir una notificación; ya sea por una notificación:

ingrese la descripción de la imagen aquí

O una ventana de información de Zenity:

ingrese la descripción de la imagen aquí

(Los ejemplos son de diferentes áreas)

Cómo utilizar

  1. El script usa xdotool:

    sudo apt-get install xdotool
    
  2. Copie el script a continuación en un archivo vacío, descomente cualquiera de las líneas:

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

    (para ser notificado por la notify-sendopción)

    o:

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

    para la Zenityopción

  3. Guarde el script en ~/bin(probablemente tendrá que crear el directorio) como measure_area(sin extensión) y hágalo ejecutable .

  4. Agregue una combinación de teclas de su elección para ejecutar el script: Elija: Configuración del sistema> "Teclado"> "Atajos"> "Atajos personalizados". Haga clic en "+" y agregue el comando:

    measure_area
    

Notas

  • Tendrá que cerrar sesión / iniciar sesión primero
  • No importa lo que tome como primera / segunda posición; El script mide valores absolutos .

La secuencia de comandos

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

Explicación

Cuando se llama al script por primera vez, obtiene la posición actual del mouse con el xdotoolcomando:

xdotool getmouselocation

Luego guarda la posición en un archivo (invisible) .measure_area.txt, esperando la segunda llamada.
En la segunda llamada, lee el archivo, lo elimina y compara las x/ycoordenadas almacenadas con las más recientes, y calcula el tamaño del área entre ellas.

Editar

Se actualizó el script con una serie de mejoras:

  • Optimizado subprocess.Popen()/ subprocess.check_output()comandos (gracias a @muru, @Trengot)
  • Se agregó un procedimiento de reparación en caso de que algo saliera mal con el primer archivo de datos (por ejemplo, si el usuario intentó ejecutar el script por primera vez sin haberlo xdotoolinstalado)
  • Se agregó un pequeño flash de pantalla de confirmación cuando se presiona la combinación de teclas para las primeras coordenadas. Parece un poco más fácil de usar para darle al usuario algún tipo de confirmación de la acción.
Jacob Vlijm
fuente
1
¡Increíble! Lo probé hace un momento, ¡funciona perfectamente! ¡Gracias! Te mereces una medalla de verdad!
dayuloli
2
@dayuloli Gracias por la pregunta! Me encanta hacer cosas como esta.
Jacob Vlijm
¡Agradable! +1. Curioso: ¿Por qué en Popen(['/bin/bash',...lugar de Popen(['zenity', '--info', ...?
muru
1
¿Jugueteando con citas? Oo command = ['zenity', '--info', '--title', 'Area Size', '--text', str(w) + ' x ' + str(h)]; subprocess.Popen(command)requiere mucho menos jugar 'y ", creo.
muru
1
¿Se podría hacer el mismo cambio xdotools? Algo como check_output(['xdotools', 'getmouseposition'])?
Holloway
2

Usando slop

Otra forma sencilla de determinar el área de una selección es mediante slop(Operación selectiva ), una utilidad de línea de comandos "que consulta una selección del usuario e imprime la región en stdout".

slopes una herramienta relativamente nueva y todavía no se ha empaquetado para Debian / Ubuntu. Tal como está, tendrá que compilarlo desde la fuente:

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

La instalación es la parte más difícil. slopen sí mismo es muy fácil trabajar con él. Por ejemplo, la siguiente línea le solicitará que seleccione un área de pantalla y mostrará el resultado como una notificación y lo escribirá en el portapapeles:

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 pantalla:

ingrese la descripción de la imagen aquí

Un desglose rápido de los comandos utilizados:

  • slop -t 0 -b 1- solicitar al usuario que seleccione un área de pantalla; no seleccione ventanas completas ( -t 0), establezca el borde de selección en 1px ( -b 1)
  • eval $(...)- leer la salida de slopen variables
  • notify-send ... - Enviar notificación GUI con información sobre el área seleccionada
  • echo ${W}x${H} | xsel -bi- copiar dimensiones al portapapeles (requiere xselsudo apt-get install xsel)
Glutanimato
fuente