是否可以截取圆形选定区域的屏幕截图?

Raf*_*rsk 10 scripts programming productivity software-recommendation screenshot

当我们在Ubuntu(使用Shift+Prt ScrCtrl+ Shift+ Prt Scr)上截取选定区域的屏幕截图时,我们总是选择一个矩形区域。所以,我知道我可以在一些软件上编辑图像,比如 Inkscape 来创建一个带有矩形图像的圆圈,但我想知道是否有我可以更改的配置,以便能够选择不同类型的形状(主要是圆形) ) 直接在我截屏时。

是否可以?

des*_*ert 9

我为圆形屏幕截图整理了一个小脚本,您需要以下软件包(尽管它也适用于其他屏幕截图程序和终端模拟器):

sudo apt install xdotool gnome-screenshot imagemagick xterm
Run Code Online (Sandbox Code Playgroud)

剧本

#!/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"
Run Code Online (Sandbox Code Playgroud)

将其另存为 eg~/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
Run Code Online (Sandbox Code Playgroud)

这会在一个不可见的终端窗口(带有红色“X”和蓝色“T”的图标)中运行脚本,您只需要确保在键入时它是焦点Enter。您可以使用桌面环境的设置将此命令分配给键盘快捷方式。

由于 ImageMagick 非常强大,您也可以调整此脚本以输出其他形状,我使用ellipse相同的半径在 x 和 y 方向绘制上面的圆 - 将其更改为例如$radius,$(bc <<<"$radius*0.5")获得偏心率大于 0 的椭圆。

1:我从imagemagick.org 上的这个线程中采用了方法。


Raf*_*rsk 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;
Run Code Online (Sandbox Code Playgroud)

所以,我的结论是,无法更改任何配置来截屏,gnome-screenshot因为它的代码不是为此而构建的......虽然可以下载代码,自己更改代码,重新编译,然后使用我自己的个性化版本的gnome-screenshot