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


10

当我们截取Ubuntu(使用Shift+ Prt ScrCtrl+ Shift+ Prt Scr)上选定区域的屏幕截图时,我们总是选择一个矩形区域。因此,我知道我可以在Inkscape之类的软件上编辑图像以使用矩形图像创建一个圆,但是我想知道是否可以更改配置以选择不同形状(主要是圆形) )直接在截屏时显示。

可能吗?


1
当然是不可能的,圆的大小和位置是什么。打印屏幕可打印整个屏幕(矩形)或当前活动的窗口(矩形)
Broadsworde

并非如此,当我们使用Shift + PrintScreen或Ctrl + Shift + PrintScreen时,我们已经可以在选定的矩形区域上打印屏幕...我正在使用Ubuntu 16.04,我只想将此默认为圆形的矩形更改为圆形。
拉斐尔·穆那斯克

可以通过dconf编辑器针对org / gnome / gnome-screenshot进行的设置为:自动保存目录,边框效果,默认文件类型,延迟,包含边界,包含icc配置文件,包含指针,最后一个保存目录,拍摄快照(已描述)。形状不作为设置。
Broadsworde

1
@Broadsworde ksnapshop可以为什么不这样做;)它具有“自由手”来制作最奇怪的形状;绕了一圈……你做一个Ramuyko有多好;)
Rinzwind

@Ramuyko我的另一个想法是使用通常的矩形屏幕截图,并从中切出最大可能的圆形,这样您就可以像以往一样选择区域。您也对这种方法感兴趣吗?
甜点

Answers:


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

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

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

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


现在,将xdotool与ksnapshot的徒手选择结合起来就可以了!
塞巴斯蒂安·史塔克

您可以在“所有设置”>“键盘”中添加自定义快捷方式,+添加自定义快捷方式,将此脚本放置在命令字段中并将其分配给“打印”键。
麦克,

@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"

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.