Apakah mungkin untuk mengambil tangkapan layar dari area yang dipilih melingkar?

10

Ketika kami mengambil tangkapan layar area yang dipilih pada Ubuntu(menggunakan Shift+ Prt Scratau Ctrl+ Shift+ Prt Scr) kami selalu memilih area persegi panjang . Jadi, saya tahu saya bisa mengedit gambar pada beberapa perangkat lunak seperti Inkscape untuk membuat lingkaran dengan gambar persegi panjang, tetapi saya ingin tahu apakah ada konfigurasi yang dapat saya ubah untuk dapat memilih berbagai jenis bentuk (terutama lingkaran) ) langsung ketika saya mengambil tangkapan layar.

Apa itu mungkin?

Rafael Muynarsk
sumber
1
itu tentu tidak mungkin, berapa ukuran lingkarannya dan bagaimana posisinya. Print Screen baik mencetak seluruh layar (persegi panjang) atau jendela yang sedang aktif (persegi panjang)
Broadsworde
Tidak juga, ketika kita menggunakan Shift + PrintScreen atau Ctrl + Shift + PrintScreen kita sudah dapat mencetak layar area yang dipilih persegi panjang ... Saya menggunakan Ubuntu 16.04, saya hanya ingin mengubah bentuk persegi panjang ini yang datang sebagai default ke yang melingkar .
Rafael Muynarsk
Pengaturan yang tersedia melalui dconf Editor untuk org / gnome / gnome-tangkapan layar adalah: auto-save-direktori, efek perbatasan, tipe file default, penundaan, sertakan batas, sertakan profil icc, sertakan pointer, terakhir- save-directory, take-window-shot (depricated). Bentuk tidak hadir sebagai pengaturan.
Broadsworde
1
@Broadsworde ksnapshop bisa jadi mengapa tidak;) Ia memiliki "tangan bebas" untuk membuat bentuk yang paling aneh; membuat lingkaran ... seberapa baik Anda membuat satu Ramuyko;)
Rinzwind
@Ramuyko Gagasan lain yang saya miliki adalah menggunakan screenshot persegi panjang yang biasa dan hanya memotong lingkaran terbesar dari itu, dengan cara ini Anda dapat memilih area seperti biasa. Apakah Anda tertarik dengan pendekatan ini juga?
hidangan penutup

Jawaban:

9

Saya mengumpulkan skrip kecil untuk screenshot melingkar, Anda memerlukan paket-paket berikut (meskipun ini dapat disesuaikan untuk program screenshot lain dan emulator terminal juga):

sudo apt install xdotool gnome-screenshot imagemagick xterm

Naskah

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

Simpan itu sebagai contoh ~/circular_screenshot.bashdan buat itu bisa dieksekusi dengan chmod +x ~/circular_screenshot.bash. Ketika Anda menjalankannya, skrip pertama meminta Anda untuk memindahkan kursor mouse ke posisi tengah dan tekan Enterdan kemudian untuk memindahkannya ke posisi tepi (tidak masalah yang mana, skrip menghitung jari-jari dari jarak) dan kembali tekan Enter. Layar kemudian berkedip saat tangkapan layar diambil (saya sarankan menggunakan scrot $temp_screenshot, itu tidak menunjukkan perilaku aneh ini.) Dan ImageMagick's convert1 digunakan untuk memotong gambar. Output disimpan dengan cap waktu sebagai nama file di direktori home Anda, Anda dapat mengubah perilaku ini dengan mengedit outputvariabel skrip.

Contoh output

contoh output

Panggilan tanpa (atau lebih baik: dengan jendela terminal yang tidak terlihat)

Saya kira Anda tidak ingin terminal memblokir layar Anda setiap kali Anda membuat tangkapan layar seperti itu, jadi inilah solusi untuk itu; Panggil skrip sebagai berikut (dengan asumsi skrip disimpan sebagai ~/circular_screenshot.bash):

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

Ini menjalankan skrip di jendela terminal tak terlihat (ikon dengan "X" merah dan "T" biru), Anda hanya perlu memastikan itu fokus ketika Anda mengetik Enter. Anda dapat menetapkan perintah ini ke pintasan keyboard menggunakan pengaturan lingkungan desktop Anda.

Karena ImageMagick sangat kuat Anda dapat mengadaptasi skrip ini untuk menghasilkan bentuk lain juga, saya menggunakan ellipsedengan jari-jari yang sama di kedua arah x dan y untuk menggambar lingkaran di atas - ubah itu $radius,$(bc <<<"$radius*0.5")untuk mendapatkan elips dengan eksentrisitas di atas sebagai gantinya.

1: Saya mengambil pendekatan dari utas ini di imagemagick.org .

pencuci mulut
sumber
sekarang xdotool dikombinasikan dengan pemilihan bebas tangan ksnapshot akan menjadi sesuatu!
Sebastian Stark
Dan Anda dapat menambahkan pintasan khusus di Semua pengaturan> Keyboard, + menambahkan pintasan kustom, tempatkan skrip ini di bidang perintah dan tetapkan ke tombol Print.
Mike
@SebastianStark Apa yang ada dalam pikiran Anda? Pilihan yang berbeda (mungkin mirip dengan ide saya yang lain )?
hidangan penutup
Ketika saya membaca xdotool, saya memikirkan sebuah skrip yang menggunakan xdotool untuk menggerakkan kursor mouse dalam lingkaran untuk menggunakan pemilihan ksnapshot secara langsung.
Sebastian Stark
@SebastianStark Oh, sekarang itu cara ketiga - tolong tulis skrip dan tambahkan jawaban! ;)
hidangan penutup
6

Saya menemukan beberapa hal di sini tentang tangkapan layar. Ketika kami mengambil tangkapan layar di Ubuntu (milik saya adalah 16,04) kami sebenarnya menggunakan perangkat lunak yang disebut gnome-screenshot. Ini adalah perangkat lunak sumber terbuka yang ditulis dalam C dan kami dapat menemukan kode sumbernya di GitHub di tautan ini :

masukkan deskripsi gambar di sini

Nah, ada file yang disebut screenshot-area-selection.cyang menjawab pertanyaan saya. Ini file dengan 361 baris kode jadi saya tidak akan menempelkannya di sini. Tapi sejauh yang saya mengerti tentang file ini (tidak banyak), ia menggunakan banyak fungsi yang terstruktur di sekitar membangun bentuk persegi panjang ... Seperti dalam potongan kode ini:

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;

Jadi, kesimpulan saya adalah tidak mungkin mengubah konfigurasi apa pun untuk mengambil tangkapan layar menggunakan gnome-screenshotkarena kodenya tidak terstruktur untuk itu ... Meskipun mungkin untuk mengunduh kode, ubah sendiri kodenya, kompilasi ulang, lalu gunakan versi hasil personalisasi sendiri. dari gnome-screenshot.

Rafael Muynarsk
sumber
4

Menggunakan ide yang sama dari jawaban yang diterima saya telah membuat skrip lain untuk mengambil screenshot heksagonal dan saya membagikannya di sini kalau-kalau itu berguna untuk orang lain.

Contoh output

contoh tangkapan layar heksagonal

Naskah

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

Prosesnya sama persis dengan jawaban yang diterima . Dalam hal ini saya baru saja mengubah nama skrip:

"Simpan sebagai contoh ~/hexagonal_screenshot.bashdan buat itu dapat dieksekusi dengan chmod +x ~/hexagonal_screenshot.bash. Ketika Anda menjalankannya, skrip pertama meminta Anda untuk memindahkan kursor mouse ke posisi tengah dan tekan Enter dan kemudian untuk memindahkannya ke posisi tepi (tidak masalah yang mana, skrip menghitung jari-jari dari kejauhan) dan sekali lagi tekan Enter. Layar kemudian berkedip saat tangkapan layar diambil (saya sarankan menggunakan scrot $temp_screenshot, itu tidak menunjukkan perilaku aneh ini.) dan ImageMagick convertdigunakan untuk memotong gambar. Outputnya adalah disimpan dengan cap waktu sebagai nama file di direktori home Anda, Anda dapat mengubah perilaku ini dengan mengedit outputvariabel skrip. "


informasi tambahan

Jika seseorang ingin tahu tentang matematika yang terlibat, di sini adalah bagaimana saya melakukannya. Untuk membuat poligon dengan jumlah sisi yang berbeda atau bentuk yang berbeda menggunakan Imagemagickprosedur akan sama: lakukan perhitungan dan tambahkan atau hapus poin ke bagian kode ini "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".

masukkan deskripsi gambar di sini

Rafael Muynarsk
sumber