AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1035174
Accepted
Rafael Muynarsk
Rafael Muynarsk
Asked: 2018-05-12 20:05:17 +0800 CST2018-05-12 20:05:17 +0800 CST 2018-05-12 20:05:17 +0800 CST

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

  • 772

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

可能吗?

scripts programming software-recommendation productivity screenshot
  • 3 3 个回答
  • 2349 Views

3 个回答

  • Voted
  1. Best Answer
    dessert
    2018-05-15T06:09:16+08:002018-05-15T06:09:16+08:00

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

    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"
    

    将其另存为 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
    

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

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

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

    • 9
  2. Rafael Muynarsk
    2018-05-12T22:34:09+08:002018-05-12T22:34:09+08:00

    我在这里发现了一些关于截图的东西。当我们在 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。

    • 6
  3. Rafael Muynarsk
    2018-05-16T01:38:08+08:002018-05-16T01:38:08+08:00

    使用已接受答案的相同想法,我创建了另一个脚本来截取六角形屏幕截图,我在这里分享它以防它对其他人有用。

    示例输出

    六边形截图示例

    剧本

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

    该过程与接受的答案完全相同。在这种情况下,我只是更改了脚本名称:

    “将其另存为 eg~/hexagonal_screenshot.bash并使用chmod +x ~/hexagonal_screenshot.bash.脚本根据距离计算半径)并再次按 Enter。然后屏幕在截屏时闪烁(我建议使用scrot $temp_screenshot它,它不会显示这种奇怪的行为。)并且 ImageMagickconvert用于裁剪图像。输出为以时间戳作为文件名保存在您的主目录中,您可以通过编辑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"。

    在此处输入图像描述

    • 4

相关问题

  • 服务器的最佳rootkit删除工具?

  • 谷歌的 Go 语言有任何 PPA 吗?

  • 从 Ubuntu 连接到 Windows 的最佳远程桌面工具是什么?[关闭]

  • Mac OS X Automator 的替代品?

  • 是否有 Paint.NET 替代方案?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve