当我们在Ubuntu上截取选定区域的屏幕截图时(使用Shift+Prt Scr或Ctrl+Shift+Prt Scr),我们总是选择一个矩形区域。所以,我知道我可以在像Inkscape这样的软件上编辑图像,将矩形图像变成圆形,但我想知道是否有一种配置可以改变,使我能够在截图时直接选择不同类型的形状(主要是圆形)。
这是可能的吗?
这是可能的吗?
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的convert
1来裁剪图像。输出以时间戳作为文件名保存在您的主目录中,您可以通过编辑脚本的output
变量来更改此行为。
我猜你不想每次截屏时都有一个终端窗口挡住你的屏幕,所以这里有一个解决方案;按照以下方式调用脚本(假设脚本保存为~/circular_screenshot.bash
):
xterm -geometry 0x0-1-1 -e ~/circular_screenshot.bash
$radius,$(bc <<<"$radius*0.5")
以获得偏心率大于0的椭圆。gnome-screenshot
的软件。它是一个用C语言编写的开源软件,我们可以在GitHub上找到它的源代码,链接如下:this link。
嗯,那里有一个名为 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
版本。#!/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"
。
gnome-screenshot
,然后脚本会将其裁剪成圆形(甚至是椭圆形,如果需要的话)。 - dessert