Seçilen dairesel bir alanın ekran görüntüsünü almak mümkün müdür?


10

Ubuntu( Shift+ Prt ScrVeya Ctrl+ Shift+ kullanarak) üzerinde seçilen alanların ekran görüntülerini Prt Scraldığımızda her zaman dikdörtgen bir alan seçeriz . Bu yüzden, Inkscape gibi bazı yazılımlarda görüntüyü dikdörtgen görüntüsüyle bir daire oluşturmak için düzenleyebileceğimi biliyorum, ancak farklı şekillerde (çoğunlukla daireler) seçebileceğim için değiştirebileceğim bir yapılandırma olup olmadığını bilmek istiyorum ) doğrudan ekran görüntüsünü aldığımda.

Mümkün mü?


1
bu kesinlikle imkansız olurdu, dairenin boyutu ne olacak ve konumu ne olurdu. Ekranı Yazdır ya tüm ekranı (dikdörtgen) ya da şu anda etkin olan pencereyi (dikdörtgen) yazdırır
Broadsworde 12:18

Gerçekten değil, Shift + PrintScreen veya Ctrl + Shift + PrintScreen kullandığımızda, zaten dikdörtgen seçilmiş bir alanı ekrana yazdırabiliriz ... Ubuntu 16.04 kullanıyorum, sadece varsayılan olarak gelen bu dikdörtgen şekli dairesel olana değiştirmek istiyorum .
Rafael Muynarsk

Dconf Editor ile org / gnome / gnome-screenshot için mevcut ayarlar şunlardır: otomatik kaydetme dizini, kenarlık efekti, varsayılan dosya türü, gecikme, sınırlama ekle, include-icc profili, ekle işaretçisi, son save-directory, take-window-shot (özelleştirilmiş). Şekil ayar olarak mevcut değil.
Broadsworde

1
@Broadsworde ksnapshop neden olmasın;) En garip şekiller yapmak için bir "serbest el" vardır; bir daire yapmak ... bir Ramuyko yapmakta ne kadar iyisin;)
Rinzwind

@Ramuyko Başka bir fikir, her zamanki dikdörtgen ekran görüntüsünü kullanmak ve mümkün olan en büyük daireyi kesmekti, bu şekilde alışık olduğunuz alanı seçebilirsiniz. Bu yaklaşımla da ilgileniyor musunuz?
tatlı

Yanıtlar:


9

Dairesel ekran görüntüleri için küçük bir komut dosyası hazırladım, aşağıdaki paketlere ihtiyacınız var (diğer ekran görüntüsü programları ve terminal emülatörleri için de uyarlanabilir):

sudo apt install xdotool gnome-screenshot imagemagick xterm

Senaryo

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

Örneğin olarak kaydedin ~/circular_screenshot.bashve ile çalıştırılabilir yapın chmod +x ~/circular_screenshot.bash. Çalıştırdığınızda, komut dosyası önce fare imlecini merkez konuma getirmenizi Enterve sonra da tuşuna basarak bir kenar konumuna getirmenizi ister (hangisinin önemli olduğu, komut dosyasının yarıçapı uzaktan hesapladığını) ve tekrar düğmesine basın Enter. Ekran daha sonra ekran görüntüsü alınırken titriyor ( scrot $temp_screenshotbunun yerine bu garip davranışı göstermemesini öneririm .) Ve ImageMagick'in convert1'i görüntüyü kırpmak için kullanılır. Çıktı, ana dizininizdeki dosya adı olarak bir zaman damgası ile kaydedilir output, komut dosyasının değişkenini düzenleyerek bu davranışı değiştirebilirsiniz .

Örnek çıktı

örnek çıktı

Terminal penceresi olmadan (veya daha iyisi: görünmez) çağrı

Sanırım böyle bir ekran görüntüsü her yaptığınızda ekranınızı engelleyen bir terminale sahip olmak istemezsiniz, işte bunun için bir çözüm; Komut dosyasını aşağıdaki gibi çağırın (komut dosyasının şu şekilde kaydedildiği varsayılarak ~/circular_screenshot.bash):

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

Bu, komut dosyasını görünmez bir terminal penceresinde (kırmızı “X” ve mavi “T” olan bir simge) çalıştırır, yazarken odaklandığından emin olmanız yeterlidir Enter. Masaüstü ortamınızın ayarlarını kullanarak bu komutu bir klavye kısayoluna atayabilirsiniz.

ImageMagick inanılmaz derecede güçlü olduğundan, bu komut dosyasını diğer şekilleri de çıkaracak şekilde uyarlayabilirsiniz, ellipseyukarıdaki daireyi çizmek için hem x hem de y yönünde aynı yarıçapla kullandım - bunun yerine örneğin $radius,$(bc <<<"$radius*0.5")0'ın üzerinde eksantrikliği olan bir elips elde etmek için bunu değiştirin .

1: Yaklaşımı imagemagick.org'daki bu konudan aldım .


şimdi xdotool ksnapshot serbest seçimi ile birlikte bir şey olurdu!
Sebastian Stark

Ve Tüm ayarlar> Klavye'ye özel bir kısayol ekleyebilir, + özel bir kısayol ekleyebilir, bu komut dosyasını komut alanına yerleştirebilir ve Yazdır tuşuna atayabilirsiniz.
Mike

@SebastianStark Aklında ne var? Farklı bir seçim (belki diğer fikrim gibi )?
tatlı

Ben xdotool okuduğumda ksnapshot serbest seçimini kullanmak için fare imlecini bir daire içinde hareket ettirmek için xdotool kullanan bir komut dosyası düşündüm.
Sebastian Stark

@SebastianStark Oh, şimdi bu üçüncü bir yol - lütfen bir senaryo yaz ve bir cevap ekle! ;)
tatlı

6

Burada ekran görüntüleri hakkında bazı şeyler keşfettim. Ubuntu'da ekran görüntüleri aldığımızda (benimki 16.04'tür) aslında adlı bir yazılım kullanıyoruz gnome-screenshot. C ile yazılmış açık kaynaklı bir yazılımdır ve kaynak kodunu GitHub'da bu bağlantıda bulabiliriz :

resim açıklamasını buraya girin

Orada, screenshot-area-selection.csorumu cevaplayan bir dosya var . 361 satır kodlu bir dosya bu yüzden buraya yapıştırmayacağım. Ama bu dosyayı anladığım kadarıyla (çok değil), dikdörtgen bir şekil oluşturma etrafında yapılandırılmış birçok işlev kullanıyor ... Bu kod parçasında olduğu gibi:

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;

Yani, sonucum, gnome-screenshotkodunu bunun için yapılandırılmadığı için ekran görüntüsü almak için herhangi bir yapılandırmayı değiştirmenin mümkün olmadığı ... Kodu indirmek, kodu kendim değiştirmek, yeniden derlemek ve sonra kendi kişiselleştirilmiş versiyonumu kullanmak mümkün / gnome-screenshot.


4

Kabul edilen cevapla aynı fikri kullanarak altıgen ekran görüntüleri almak için başka bir komut dosyası oluşturdum ve başka biri için yararlı olması durumunda burada paylaşıyorum.

Örnek çıktı

hexagonal ekran görüntüsü örneği

Senaryo

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

Süreç kabul edilen cevapla tamamen aynıdır . Bu durumda komut dosyasının adını değiştirdim:

"Örneğin kaydedin ~/hexagonal_screenshot.bashve çalıştırılabilir olmasını sağlayın chmod +x ~/hexagonal_screenshot.bash. Çalıştırdığınızda, komut dosyası önce fare imlecini orta konuma taşımanızı ve ardından Enter tuşuna basın ve sonra bir kenar konumuna taşımak için (hangisinin, betiği yarıçapı mesafeden hesaplar) ve tekrar Enter tuşuna basın Ekran görüntüsü alınırken ekran titriyor ( scrot $temp_screenshotbunun yerine bu garip davranışı göstermemenizi öneririm .) ve ImageMagick'in convertgörüntüyü kırpmak için kullanılır. ana dizininizde dosya adı olarak bir zaman damgası ile kaydedilmişse output, komut dosyasının değişkenini düzenleyerek bu davranışı değiştirebilirsiniz . "


ek bilgi

Birinin ilgili matematiği merak etmesi durumunda, bunu nasıl yaptım. Prosedürü kullanarak farklı sayıda kenar veya farklı şekillerde çokgen oluşturmak Imagemagickiçin aynı olurdu: matematiği yapın ve kodun bu bölümüne nokta ekleyin veya kaldırın "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".

resim açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.