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

10

Quando capturamos capturas de tela de áreas selecionadas em Ubuntu(usando Shift+ Prt Scrou Ctrl+ Shift+ Prt Scr), sempre selecionamos uma área retangular . Então, eu sei que eu poderia 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 para poder selecionar diferentes tipos de formas (principalmente círculos ) diretamente quando estou tirando a captura de tela.

É possível?

Rafael Muynarsk
fonte
1
isso seria impossível com certeza, qual seria o tamanho do círculo e qual seria sua posição. PRINT SCREEN tanto imprime a tela inteira (retângulo) ou a janela ativa no momento (retângulo)
Broadsworde
Não, na verdade, quando usamos Shift + PrintScreen ou Ctrl + Shift + PrintScreen, já podemos imprimir uma área retangular selecionada ... Estou usando o Ubuntu 16.04, só quero alterar essa forma retangular que é o padrão para circular. .
Rafael Muynarsk
As configurações disponíveis no dconf Editor para org / gnome / gnome-screenshot são: diretório de salvamento automático, efeito de borda, tipo de arquivo padrão, atraso, borda de inclusão, perfil de inclusão-icc, perfil de inclusão-ponteiro, último- Diretório de salvamento, captura de janela (privada). Forma não presente como configuração.
Broadsworde
1
@Broadsworde ksnapshop pode então por que não;) Ele tem uma "mão livre" para criar as formas mais estranhas; fazendo um círculo embora ... Você é bom em fazer um Ramuyko;)
Rinzwind
@ Ramuyko Outra idéia que tive foi usar a captura de tela retangular usual e apenas cortar o maior círculo possível, dessa forma, você pode selecionar a área como está acostumada. Você também está interessado nessa abordagem?
dessert

Respostas:

9

Montei um pequeno script para capturas de tela circulares, você precisa dos seguintes pacotes (embora seja adaptável a outros programas de capturas de tela e emuladores de terminal):

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"

Salve-o como, por exemplo, ~/circular_screenshot.bashe torne-o executável com chmod +x ~/circular_screenshot.bash. Quando você o executa, o script primeiro solicita que você mova o cursor do mouse para a posição central e pressione Entere, em seguida, mova-o para uma posição de borda (não importa qual, o script calcula o raio à distância) e pressione novamente Enter. A tela pisca enquanto a captura de tela é tirada (eu recomendo usar scrot $temp_screenshot, mas não mostra esse comportamento estranho.) E o ImageMagick convert1 é usado para cortar a imagem. A saída é salva com um carimbo de data e hora como o nome do arquivo no diretório inicial. Você pode alterar esse comportamento editando a outputvariável do script.

Saída de exemplo

saída de exemplo

Ligue sem (ou melhor: com uma janela invisível) do terminal

Suponho que você não deseja que um terminal bloqueie sua tela toda vez que você faz uma captura de tela como essa, então aqui está uma solução para isso; Chame o script da seguinte maneira (assumindo que o script foi salvo como ~/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 ter certeza de que está focado ao digitar Enter. Você pode atribuir esse comando a um atalho de teclado usando as configurações do seu ambiente de área de trabalho.

Como o ImageMagick é incrivelmente poderoso, você também pode adaptar esse script para gerar outras formas, usei ellipseo mesmo raio nas direções x e y para desenhar o círculo acima - mude isso para, por exemplo, $radius,$(bc <<<"$radius*0.5")para obter uma elipse com excentricidade acima de 0.

1: Adotei a abordagem deste tópico no imagemagick.org .

sobremesa
fonte
agora o xdotool combinado com a seleção à mão livre do ksnapshot seria algo!
Sebastian Stark
E você pode adicionar um atalho personalizado em Todas as configurações> Teclado, + adicionar um atalho personalizado, colocar esse script no campo de comando e atribuí-lo à tecla Imprimir.
1455 Mike
@SebastianStark O que você tem em mente? Uma seleção diferente (talvez semelhante à minha outra ideia )?
dessert
Ao ler o xdotool, pensei em um script que usa o xdotool para mover o cursor do mouse em um círculo para fazer uso da seleção à mão livre do ksnapshot.
Sebastian Stark
@SebastianStark Oh, agora essa é uma terceira maneira - por favor, escreva um script e adicione uma resposta! ;)
dessert
6

Eu descobri algumas coisas aqui sobre capturas de tela. Quando tiramos capturas de tela no Ubuntu (a minha é 16.04), na verdade estamos usando um software chamado gnome-screenshot. É um software de código aberto escrito em C e podemos encontrar seu código-fonte no GitHub neste link :

insira a descrição da imagem aqui

Bem, há um arquivo chamado lá screenshot-area-selection.cque responde à minha pergunta. É um arquivo com 361 linhas de código, então não vou colá-lo aqui. Mas, tanto quanto eu entendi sobre esse arquivo (não muito), ele usa muitas funções que são estruturadas em torno da construção de uma forma retangular ... Como neste pedaço 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;

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

Rafael Muynarsk
fonte
4

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

Saída de exemplo

exemplo de captura de tela hexagonal

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)
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 . Nesse caso, mudei o nome do script:

"Salve-o como, por exemplo, ~/hexagonal_screenshot.bashe torne-o executável chmod +x ~/hexagonal_screenshot.bash. Quando você o executa, o script primeiro solicita que você mova o cursor do mouse para a posição central e pressione Enter e, em seguida, mova-o para uma posição de borda (não importa qual O script calcula o raio à distância) e pressione Enter novamente. A tela pisca enquanto a captura de tela é feita (eu recomendo usar scrot $temp_screenshot, mas não mostra esse comportamento estranho) e o ImageMagick converté usado para cortar a imagem. salvo com um carimbo de data e hora como o nome do arquivo no diretório inicial, você pode alterar esse comportamento editando a outputvariável do script ".


informação adicional

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 Imagemagicko procedimento seria o mesmo: fazer as contas e adicionar ou remover pontos a esta 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".

insira a descrição da imagem aqui

Rafael Muynarsk
fonte