เป็นไปได้ไหมที่จะจับภาพหน้าจอของพื้นที่ที่เลือกเป็นวงกลม?


10

เมื่อเราถ่ายภาพหน้าจอของพื้นที่ที่เลือกไว้Ubuntu(โดยใช้Shift+ Prt ScrหรือCtrl+ Shift+ Prt Scr) เราจะเลือกพื้นที่สี่เหลี่ยมผืนผ้าเสมอ ดังนั้นฉันรู้ว่าฉันสามารถแก้ไขภาพในซอฟต์แวร์บางอย่างเช่น Inkscape เพื่อสร้างวงกลมด้วยภาพสี่เหลี่ยม แต่ฉันต้องการทราบว่ามีการกำหนดค่าที่ฉันสามารถเปลี่ยนเพื่อให้สามารถเลือกรูปร่างที่แตกต่างกันหรือไม่ ) โดยตรงเมื่อฉันกำลังจับภาพหน้าจอ

เป็นไปได้ไหม?


1
นั่นจะเป็นไปไม่ได้แน่นอนขนาดของวงกลมจะเป็นเท่าไหร่และมันจะอยู่ในตำแหน่งใด พิมพ์หน้าจอพิมพ์ทั้งหน้าจอ (สี่เหลี่ยม) หรือหน้าต่างที่ใช้งานอยู่ในปัจจุบัน (สี่เหลี่ยม)
Broadsworde

ไม่จริง ๆ เมื่อเราใช้ Shift + PrintScreen หรือ Ctrl + Shift + PrintScreen เราสามารถพิมพ์หน้าจอพื้นที่ที่เลือกเป็นรูปสี่เหลี่ยมผืนผ้าได้แล้ว ... ฉันใช้ Ubuntu 16.04 ฉันแค่ต้องการเปลี่ยนรูปร่างสี่เหลี่ยมนี้ซึ่งเป็นค่าเริ่มต้นเป็นวงกลม .
Rafael Muynarsk

การตั้งค่าที่พร้อมใช้งานผ่าน dconf Editor สำหรับ org / gnome / gnome-screenshot คือ: auto-save-directory, border-effect, border-effect-file-type, delay, include-border, include-icc-profile, include-pointer, last- save-directory, take-window-shot (จำกัด ) รูปร่างไม่แสดงเป็นการตั้งค่า
Broadsworde

1
@Broadsworde ksnapshop สามารถทำเช่นนั้นทำไม;) มันมี "มือเปล่า" ที่จะทำให้รูปร่างแปลกที่สุด; ทำให้เป็นวงกลม แต่ ... คุณเก่งแค่ไหนในการสร้าง Ramuyko;)
4329 Rinzwind

@Ramuyko ความคิดอื่นที่ฉันมีคือการใช้ภาพหน้าจอสี่เหลี่ยมปกติและตัดวงกลมที่ใหญ่ที่สุดเท่าที่จะเป็นไปได้ด้วยวิธีนี้คุณสามารถเลือกพื้นที่ตามที่คุณคุ้นเคย คุณสนใจวิธีนี้เช่นกันหรือไม่?
ของหวาน

คำตอบ:


9

ฉันรวบรวมสคริปต์เล็ก ๆ สำหรับสกรีนช็อตแบบวงกลมคุณต้องมีแพ็คเกจต่อไปนี้ (แม้ว่ามันจะปรับให้เหมาะกับโปรแกรมสกรีนช็อตอื่นและเทอร์มินัลอีมูเลเตอร์)

sudo apt install xdotool gnome-screenshot imagemagick xterm

สคริปต์

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

บันทึกเป็นเช่นและทำให้มันปฏิบัติการด้วย~/circular_screenshot.bash chmod +x ~/circular_screenshot.bashเมื่อคุณเรียกใช้สคริปต์แรกขอให้คุณเลื่อนเคอร์เซอร์ของเมาส์ไปที่ตำแหน่งศูนย์และกดEnterแล้วจะย้ายไปยังตำแหน่งที่ขอบ (ไม่ว่าสคริปต์คำนวณรัศมีจากระยะไกล) Enterและอีกครั้งกด จากนั้นหน้าจอจะกะพริบขณะที่จับภาพหน้าจอ (ฉันแนะนำให้ใช้scrot $temp_screenshotแทนจะไม่แสดงพฤติกรรมแปลก ๆ นี้) และ ImageMagick convert1ใช้เพื่อครอบตัดรูปภาพ เอาต์พุตถูกบันทึกด้วยการประทับเวลาเป็นชื่อไฟล์ในโฮมไดเร็กทอรีของคุณคุณสามารถเปลี่ยนพฤติกรรมนี้ได้โดยแก้ไขoutputตัวแปรของสคริปต์

ตัวอย่างผลลัพธ์

เอาท์พุทตัวอย่าง

โทรโดยไม่ต้อง (หรือดีกว่า: ด้วยหน้าต่างเทอร์มินัลที่มองไม่เห็น)

ฉันคิดว่าคุณไม่ต้องการให้เทอร์มินัลปิดกั้นหน้าจอของคุณทุกครั้งที่คุณสร้างหน้าจอเช่นนี้ดังนั้นนี่เป็นวิธีแก้ปัญหาสำหรับสิ่งนั้น เรียกสคริปต์ดังต่อไปนี้ (สมมติว่าสคริปต์ถูกบันทึกเป็น~/circular_screenshot.bash):

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

นี้จะทำงานสคริปต์ในหน้าต่าง terminal ที่มองไม่เห็น (ไอคอนกับ“X” สีแดงและสีฟ้า“T”), Enterคุณเพียงแค่ต้องให้แน่ใจว่ามันเน้นเมื่อคุณพิมพ์ คุณสามารถกำหนดคำสั่งนี้ให้กับแป้นพิมพ์ลัดโดยใช้การตั้งค่าสภาพแวดล้อมเดสก์ทอปของคุณ

เนื่องจาก ImageMagick นั้นทรงพลังอย่างเหลือเชื่อคุณสามารถปรับสคริปต์นี้ให้เป็นรูปร่างอื่นได้เช่นกันฉันจึงใช้ellipseรัศมีเดียวกันทั้งในทิศทาง x และ y เพื่อวาดวงกลมด้านบน - เปลี่ยนเป็น e กรัม$radius,$(bc <<<"$radius*0.5")เพื่อให้ได้วงรีที่มีความเยื้องศูนย์เหนือ 0 แทน

1: ผมเอาวิธีการจากหัวข้อนี้บน imagemagick.org


ตอนนี้ xdotool รวมกับการเลือก ksnapshot ด้วยมือเปล่าจะเป็นสิ่งที่!
เซบาสเตียนสตาร์

และคุณสามารถเพิ่มทางลัดที่กำหนดเองในการตั้งค่าทั้งหมด> แป้นพิมพ์ + เพิ่มทางลัดที่กำหนดเองวางสคริปต์นี้ในฟิลด์คำสั่งและกำหนดให้กับปุ่มพิมพ์
Mike

@SebastianStark คุณคิดอะไรอยู่ ตัวเลือกอื่น (อาจคล้ายกับแนวคิดอื่นของฉัน )
ของหวาน

เมื่อฉันอ่าน xdotool ฉันคิดถึงสคริปต์ที่ใช้ xdotool เพื่อเลื่อนเคอร์เซอร์ของเมาส์เป็นวงกลมเพื่อใช้ประโยชน์จากการเลือก ksnapshot ด้วยมือเปล่า
เซบาสเตียนสตาร์

@SebastianStark โอ้ตอนนี้เป็นวิธีที่สาม - โปรดเขียนสคริปต์และเพิ่มคำตอบ! ;)
ของหวาน

6

ฉันค้นพบบางสิ่งเกี่ยวกับหน้าจอที่นี่ เมื่อเราถ่ายภาพหน้าจอบน Ubuntu (ของฉันคือ 16.04) เราใช้ซอฟต์แวร์ชื่อgnome-screenshotจริง มันเป็นซอฟต์แวร์โอเพนซอร์ซที่เขียนใน C และเราสามารถหาซอร์สโค้ดของมันบน GitHub ในลิงค์นี้ :

ป้อนคำอธิบายรูปภาพที่นี่

มีไฟล์ที่เรียกscreenshot-area-selection.cว่าตอบคำถามของฉัน มันเป็นไฟล์ที่มีโค้ด 361 บรรทัดดังนั้นฉันจะไม่วางมันที่นี่ แต่เท่าที่ฉันเข้าใจไฟล์นี้ (ไม่มาก) มันใช้ฟังก์ชั่นมากมายที่มีโครงสร้างรอบ ๆ การสร้างรูปทรงสี่เหลี่ยม ... เช่นเดียวกับในส่วนของรหัสนี้:

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;

ดังนั้นข้อสรุปของฉันคือมันเป็นไปไม่ได้ที่จะเปลี่ยนการกำหนดค่าใด ๆ ที่จะจับภาพหน้าจอที่ใช้gnome-screenshotเพราะรหัสของมันไม่มีโครงสร้างสำหรับ ... แม้ว่ามันจะเป็นไปได้ที่จะดาวน์โหลดรหัสเปลี่ยนรหัสด้วยตัวเองทำคอมไพล์ใหม่ gnome-screenshotของ


4

การใช้แนวคิดเดียวกันกับคำตอบที่ยอมรับฉันได้สร้างสคริปต์อื่นเพื่อจับภาพหน้าจอหกเหลี่ยมและฉันแบ่งปันที่นี่ในกรณีที่มีประโยชน์สำหรับคนอื่น

ตัวอย่างผลลัพธ์

ตัวอย่างของภาพหน้าจอหกเหลี่ยม

สคริปต์

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

กระบวนการนี้เป็นกระบวนการตรงเดียวกันของคำตอบที่ได้รับการยอมรับ ในกรณีนี้ฉันเพิ่งเปลี่ยนชื่อสคริปต์:

"บันทึกเป็นเช่นนั้น~/hexagonal_screenshot.bashและทำให้มันใช้งานchmod +x ~/hexagonal_screenshot.bashได้เมื่อคุณเรียกใช้สคริปต์จะขอให้คุณเลื่อนเคอร์เซอร์ของเมาส์ไปที่ตำแหน่งกึ่งกลางแล้วกด Enter จากนั้นเลื่อนไปยังตำแหน่งขอบ (ไม่สำคัญว่า สคริปต์คำนวณรัศมีจากระยะทาง) และกด Enter อีกครั้งหน้าจอจะกะพริบขณะที่จับภาพหน้าจอ (ฉันแนะนำให้ใช้scrot $temp_screenshotแทนจะไม่แสดงพฤติกรรมแปลก ๆ นี้) และ ImageMagick convertใช้เพื่อครอบตัดภาพผลลัพธ์คือ บันทึกด้วยเวลาประทับเป็นชื่อไฟล์ในโฮมไดเร็กตอรี่ของคุณคุณสามารถเปลี่ยนพฤติกรรมนี้ได้โดยแก้ไขoutputตัวแปรของสคริปต์ "


ข้อมูลเพิ่มเติม

ในกรณีที่มีคนสงสัยเกี่ยวกับคณิตศาสตร์ที่เกี่ยวข้องนี่คือวิธีที่ฉันทำ สำหรับการสร้างรูปหลายเหลี่ยมที่มีจำนวนแตกต่างกันของขอบหรือรูปร่างที่แตกต่างกันโดยใช้Imagemagickขั้นตอนจะเป็นเหมือนเดิม: "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"ทำคณิตศาสตร์และเพิ่มหรือลบจุดเพื่อเป็นส่วนหนึ่งของรหัสนี้

ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.