¿Es posible tomar una captura de pantalla de un área circular seleccionada?

10

Cuando tomamos capturas de pantalla de áreas seleccionadas en Ubuntu(usando Shift+ Prt Scro Ctrl+ Shift+ Prt Scr) siempre seleccionamos un área rectangular . Entonces, sé que podría editar la imagen en algún software como Inkscape para crear un círculo con la imagen rectangular, pero me gustaría saber si hay una configuración que pueda cambiar para poder seleccionar diferentes tipos de formas (principalmente círculos ) directamente cuando estoy tomando la captura de pantalla.

¿Es posible?

Rafael Muynarsk
fuente
1
seguramente sería imposible, de qué tamaño sería el círculo y cuál sería su posición. Imprimir pantalla imprime toda la pantalla (rectángulo) o la ventana actualmente activa (rectángulo)
Broadsworde
En realidad no, cuando usamos Shift + PrintScreen o Ctrl + Shift + PrintScreen ya podemos imprimir la pantalla en un área rectangular seleccionada ... Estoy usando Ubuntu 16.04, solo quiero cambiar esta forma rectangular que viene por defecto a una circular .
Rafael Muynarsk,
Las configuraciones disponibles a través de dconf Editor para org / gnome / gnome-screenshot son: directorio de guardado automático, efecto de borde, tipo de archivo predeterminado, retraso, borde de inclusión, perfil de icc de inclusión, puntero de inclusión, último- save-directory, take-window-shot (depricated). La forma no está presente como escenario.
Broadsworde
1
@Broadsworde ksnapshop puede, ¿por qué no?) Tiene "manos libres" para hacer las formas más extrañas; haciendo un círculo sin embargo ... qué tan bueno eres para hacer un Ramuyko;)
Rinzwind
@Ramuyko Otra idea que tuve fue usar la captura de pantalla rectangular habitual y simplemente cortar el círculo más grande posible, de esta manera podría seleccionar el área como está acostumbrado. ¿Estás interesado en este enfoque también?
postre

Respuestas:

9

Creé un pequeño script para capturas de pantalla circulares, necesita los siguientes paquetes (aunque también es adaptable para otros programas de captura de pantalla y emuladores de terminal):

sudo apt install xdotool gnome-screenshot imagemagick xterm

La secuencia de comandos

#!/bin/bash

output=~/$(date +%F_%H%M%S).png
temp_screenshot=$(mktemp).png

read -p "Move cursor to center and press Enter"
eval $(xdotool getmouselocation --shell)
x_center=$X
y_center=$Y
read -p "Move cursor to edge and press Enter"
eval $(xdotool getmouselocation --shell)

gnome-screenshot -f $temp_screenshot

radius=$(bc <<<"sqrt(($X-$x_center)^2+($Y-$y_center)^2)")

convert $temp_screenshot -alpha on \( +clone -channel a -evaluate multiply 0 -draw "ellipse $x_center,$y_center $radius,$radius 0,360" \) -compose DstIn -composite -trim "$output"

Guárdelo como, por ejemplo, ~/circular_screenshot.bashy hágalo ejecutable con chmod +x ~/circular_screenshot.bash. Cuando lo ejecuta, el script primero le pide que mueva el cursor del mouse a la posición central y presione Entery luego lo mueva a una posición de borde (no importa cuál, el script calcula el radio desde la distancia) y presione nuevamente Enter. La pantalla parpadea mientras se toma la captura de pantalla (recomiendo usar en su scrot $temp_screenshotlugar, no muestra este comportamiento extraño) y el convert1 de ImageMagick se usa para recortar la imagen. La salida se guarda con una marca de tiempo como el nombre del archivo en su directorio de inicio, puede cambiar este comportamiento editando la outputvariable de la secuencia de comandos.

Salida de ejemplo

salida de ejemplo

Llamar sin (o mejor: con una ventana de terminal invisible)

Supongo que no quieres tener un terminal bloqueando tu pantalla cada vez que haces una captura de pantalla como esa, así que aquí hay una solución para eso; Llame al script de la siguiente manera (suponiendo que el script se haya guardado como ~/circular_screenshot.bash):

xterm -geometry 0x0-1-1 -e ~/circular_screenshot.bash

Esto ejecuta el script en una ventana de terminal invisible (icono con una "X" roja y una "T" azul), solo necesita asegurarse de que esté enfocado cuando escribe Enter. Puede asignar este comando a un atajo de teclado utilizando la configuración de su entorno de escritorio.

Como ImageMagick es increíblemente poderoso, también puede adaptar este script para generar otras formas, utilicé ellipsecon el mismo radio en ambas direcciones x e y para dibujar el círculo de arriba; cámbielo a, por ejemplo, $radius,$(bc <<<"$radius*0.5")para obtener una elipse con excentricidad por encima de 0.

1: Tomé el enfoque de este hilo en imagemagick.org .

postre
fuente
¡Ahora xdotool combinado con la selección a mano alzada de ksnapshot sería algo!
Sebastian Stark
Y puede agregar un acceso directo personalizado en Todas las configuraciones> Teclado, + agregar un acceso directo personalizado, coloque este script en el campo de comando y asígnelo a la tecla Imprimir.
Mike
@SebastianStark ¿Qué tienes en mente? ¿Una selección diferente (tal vez similar a mi otra idea )?
postre
Cuando leí xdotool, pensé en un script que usa xdotool para mover el cursor del mouse en un círculo para utilizar la selección a mano alzada de ksnapshot.
Sebastian Stark
@SebastianStark Oh, esa es una tercera forma: ¡por favor escriba un guión y agregue una respuesta! ;)
postre
6

He descubierto algunas cosas aquí sobre capturas de pantalla. Cuando tomamos capturas de pantalla en Ubuntu (el mío es 16.04) en realidad estamos usando un software llamado gnome-screenshot. Es un software de código abierto escrito en C y podemos encontrar su código fuente en GitHub en este enlace :

ingrese la descripción de la imagen aquí

Bueno, hay un archivo llamado screenshot-area-selection.cque responde mi pregunta. Es un archivo con 361 líneas de código, así que no voy a pegarlo aquí. Pero por lo que entendí de este archivo (no mucho), utiliza muchas funciones que están estructuradas en torno a la construcción de una forma rectangular ... Como en este fragmento de código:

create_select_window (void)
{
  GtkWidget *window;
  GdkScreen *screen;
  GdkVisual *visual;

  screen = gdk_screen_get_default ();
  visual = gdk_screen_get_rgba_visual (screen);

  window = gtk_window_new (GTK_WINDOW_POPUP);
  if (gdk_screen_is_composited (screen) && visual)
    {
      gtk_widget_set_visual (window, visual);
      gtk_widget_set_app_paintable (window, TRUE);
    }

  g_signal_connect (window, "draw", G_CALLBACK (select_window_draw), NULL);

  gtk_window_move (GTK_WINDOW (window), -100, -100);
  gtk_window_resize (GTK_WINDOW (window), 10, 10);
  gtk_widget_show (window);

  return window;
}

typedef struct {
  GdkRectangle rectangle;
  SelectAreaCallback callback;
  gpointer callback_data;
  gboolean aborted;
} CallbackData;

Entonces, mi conclusión es que no es posible cambiar ninguna configuración para tomar capturas de pantalla gnome-screenshotporque su código no está estructurado para eso ... Aunque es posible descargar el código, cambiar el código yo mismo, recompilarlo y luego usar mi propia versión personalizada de gnome-screenshot.

Rafael Muynarsk
fuente
4

Usando la misma idea de la respuesta aceptada , he creado otro script para tomar capturas de pantalla hexagonales y lo comparto aquí en caso de que sea útil para otra persona.

Salida de ejemplo

ejemplo de captura de pantalla hexagonal

La secuencia de comandos

#!/bin/bash

output=~/$(date +%F_%H%M%S).png
temp_screenshot=$(mktemp).png

read -p "Move cursor to center and press Enter"
eval $(xdotool getmouselocation --shell)
x1=$X
y1=$Y
read -p "Move cursor to edge and press Enter"
eval $(xdotool getmouselocation --shell)
x2=$X
y2=$Y

gnome-screenshot -f $temp_screenshot

radius=$(bc -l <<<"sqrt(($x2-$x1)^2+($y2-$y1)^2)")
ca=$(bc -l <<<"$radius/sqrt(3)") 
h=$(bc -l <<<"$radius/(sqrt(3)/2)")

P1_x=$(bc <<<"$x1+$ca")
P1_y=$(bc <<<"$y1+$radius")

P2_x=$(bc <<<"$x1+$h")
P2_y=$(bc <<<"$y1")

P3_x=$(bc <<<"$x1+$ca")
P3_y=$(bc <<<"$y1-$radius")

P4_x=$(bc <<<"$x1-$ca")
P4_y=$(bc <<<"$y1-$radius")

P5_x=$(bc <<<"$x1-$h")
P5_y=$(bc <<<"$y1")

P6_x=$(bc <<<"$x1-$ca")
P6_y=$(bc <<<"$y1+$radius")

convert $temp_screenshot -alpha on \
        \( +clone -channel a -evaluate multiply 0 -draw \
        "polygon $P1_x,$P1_y $P2_x,$P2_y $P3_x,$P3_y $P4_x,$P4_y $P5_x,$P5_y $P6_x,$P6_y" \) \
        -compose DstIn -composite -trim "$output"

El proceso es exactamente el mismo de la respuesta aceptada . En este caso, acabo de cambiar el nombre del script:

"Guárdelo como, por ejemplo, ~/hexagonal_screenshot.bashy hágalo ejecutable chmod +x ~/hexagonal_screenshot.bash. Cuando lo ejecuta, el script primero le pide que mueva el cursor del mouse a la posición central y presione Enter y luego lo mueva a una posición de borde (no importa cuál, el el guión calcula el radio a partir de la distancia) y presione nuevamente Intro. La pantalla parpadea mientras se toma la captura de pantalla (recomiendo usar en su scrot $temp_screenshotlugar, no muestra este comportamiento extraño) y ImageMagick's convertse usa para recortar la imagen. guardado con una marca de tiempo como el nombre de archivo en su directorio de inicio, puede cambiar este comportamiento editando la outputvariable del script ".


Información Adicional

En caso de que alguien tenga curiosidad sobre las matemáticas involucradas, así es como lo hice. Para crear un polígono con un número diferente de aristas o formas diferentes, usar Imagemagickel procedimiento sería el mismo: hacer los cálculos y agregar o eliminar puntos a esta parte del código "polygon $P1_x,$P1_y $P2_x,$P2_y $P3_x,$P3_y $P4_x,$P4_y $P5_x,$P5_y $P6_x,$P6_y".

ingrese la descripción de la imagen aquí

Rafael Muynarsk
fuente