É possível fazer uma captura de tela de uma área selecionada circular?

9

Quando tiramos screenshots de áreas selecionadas em Ubuntu (usando Shift + Prt Scr ou Ctrl + Shift + Prt Scr ) nós sempre selecionamos uma área retangular . Então, eu sei que poderia simplesmente editar a imagem em alguns softwares como o Inkscape para criar um círculo com a imagem retangular, mas gostaria de saber se há uma configuração que eu possa alterar por ser capaz de selecionar diferentes tipos de formas (principalmente círculos) diretamente quando eu estou tomando a tela de impressão.

É possível?

    
por Ramuyko 12.05.2018 / 06:05

3 respostas

9

Eu criei um pequeno script para capturas de tela circulares, você precisa dos seguintes pacotes (embora seja adaptável para outros programas de captura de tela e emuladores de terminal também):

sudo apt install xdotool gnome-screenshot imagemagick xterm

O script

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

Salvar como, por exemplo, ~/circular_screenshot.bash e torná-lo executável com chmod +x ~/circular_screenshot.bash . Quando você o executa, o script primeiro pede para você mover o cursor do mouse para a posição central e pressionar Enter e então movê-lo para uma posição de borda (não importa qual, o script calcula o raio da distância) e pressione novamente Enter . A tela pisca enquanto a captura de tela é realizada (recomendo usar scrot $temp_screenshot , não mostra esse comportamento estranho) e o convert 1 do ImageMagick é usado para cortar a imagem. A saída é salva com um registro de data e hora como o nome do arquivo em seu diretório inicial. Você pode alterar esse comportamento editando a variável output do script.

Exemplo de saída

Chamarsem(oumelhor:comuminvisível)janeladeterminal

Suponhoquevocênãoqueiraterumterminalbloqueandosuatelatodavezquefizerumacapturadetelacomoessa,entãoaquiestáumasoluçãoparaisso;Chameoscriptdaseguinteforma(assumindoqueoscriptfoisalvocomo~/circular_screenshot.bash):

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

Isso executa o script em uma janela de terminal invisível (ícone com um "X" vermelho e um "T" azul), você só precisa se certificar de que ele está focalizado quando você digita Enter . Você pode atribuir esse comando a um atalho de teclado usando as configurações do seu ambiente de trabalho.

Como o ImageMagick é incrivelmente poderoso, você pode adaptar esse script para gerar outros formatos também. Usei ellipse com o mesmo raio nas direções xe y para desenhar o círculo acima. $radius,$(bc <<<"$radius*0.5") para obter uma elipse com excentricidade acima de 0.

1: Eu usei a abordagem de este tópico no imagemagick.org

    
por dessert 14.05.2018 / 16:09
6

Eu descobri algumas coisas aqui sobre screenshots. Quando tiramos screenshots no Ubuntu (o meu é 16.04) estamos realmente usando um software chamado gnome-screenshot . É um software de código aberto escrito em C e podemos encontrar seu código fonte no GitHub em este link :

Bem,háumarquivochamadoscreenshot-area-selection.cquerespondeàminhapergunta.Éumarquivocom361linhasdecódigo,entãonãovoucolá-loaqui.Mas,tantoquantoeuentendidestearquivo(nãomuito),eleusamuitasfunçõesquesãoestruturadasemtornodaconstruçãodeumaformaretangular...Comonestepedaçodecó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;

Então, minha conclusão é que não é possível alterar nenhuma configuração para tirar screenshots usando gnome-screenshot porque seu código não está estruturado para isso ... Embora seja possível fazer o download do código, mude o código eu mesmo, recompile-o e então use minha própria versão personalizada de gnome-screenshot .

    
por Ramuyko 12.05.2018 / 08:34
4

Usando a mesma ideia da resposta aceita , criei outro script para tirar capturas de tela hexagonais e estou compartilhando aqui, caso seja útil para outra pessoa.

Exemplo de saída

Oscript

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

O processo é exatamente o mesmo da resposta aceita. Neste caso, apenas mudei o nome do script:

"Salve-o como por exemplo ~/hexagonal_screenshot.bash e torne-o executável com chmod +x ~/hexagonal_screenshot.bash . Quando você o executa, o script primeiro pede que você mova o cursor do mouse para a posição central e pressione Enter para movê-lo para uma borda posição (não importa qual, o script calcula o raio a partir da distância) e novamente pressione Enter.A tela, em seguida, pisca enquanto a captura de tela é tomada (eu recomendo usar scrot $temp_screenshot em vez disso, ele não mostra esse comportamento estranho). e convert do ImageMagick é usado para cortar a imagem. A saída é salva com um registro de data e hora como o nome do arquivo em seu diretório inicial, você pode alterar esse comportamento editando a variável output do script. "

Informações adicionais

Caso alguém esteja curioso sobre a matemática envolvida, aqui está como eu fiz isso. Para criar um polígono com um número diferente de arestas ou formas diferentes usando Imagemagick , o procedimento seria o mesmo: faça as contas e adicione ou remova pontos a essa parte do 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" .

    
por Ramuyko 15.05.2018 / 11:38