web-dev-qa-db-ja.com

円形の選択領域のスクリーンショットを撮ることは可能ですか?

Ubuntu(選択した領域のスクリーンショットを撮るとき Shift+Prt Scr または Ctrl+Shift+Prt Scr)we 常に長方形の領域を選択。だから、Inkscapeなどのソフトウェアで画像を編集して長方形の画像で円を作成できることは知っていますが、変更できる設定があるかどうかを知りたいのですさまざまな種類を選択してくださいスクリーンショットを撮っているときに、シェイプ(主に円)を直接。

出来ますか?

10
Rafael Muynarsk

円形のスクリーンショット用の小さなスクリプトを作成しましたが、次のパッケージが必要です(ただし、他のスクリーンショットプログラムやターミナルエミュレーターにも適応可能です)。

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変数を編集することにより、この動作を変更できます。

出力例

example output

端末ウィンドウを使用せずに(またはそれ以上:見えない状態で)呼び出します

そのようなスクリーンショットを作成するたびに画面をブロックする端末を持ちたくないと思うので、そのためのソリューションを次に示します。次のようにスクリプトを呼び出します(スクリプトが~/circular_screenshot.bashとして保存されていると仮定):

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

これにより、非表示のターミナルウィンドウ(赤い「X」と青い「T」のアイコン)でスクリプトが実行されます。 Enter。デスクトップ環境の設定を使用して、このコマンドをキーボードショートカットに割り当てることができます。

ImageMagickは非常に強力なので、このスクリプトを他の形状の出力にも適応させることができます。xとyの両方向に同じ半径のellipseを使用して、上の円を描きます。 $radius,$(bc <<<"$radius*0.5")は、代わりに偏心度が0を超える楕円を取得します。

1: imagemagick.orgのこのスレッド からアプローチしました。

9
dessert

ここでスクリーンショットに関するいくつかのことを発見しました。 Ubuntuでスクリーンショットを撮るとき(私の場合は16.04)、gnome-screenshotというソフトウェアを実際に使用しています。これはCで書かれたオープンソースソフトウェアであり、GitHubのソースコードは このリンク で見つけることができます。

enter image description here

私の質問に答える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
Rafael Muynarsk

受け入れられた答え と同じ考えを使用して、六角形のスクリーンショットを撮るために別のスクリプトを作成しました。他の人に役立つ場合に備えて、ここで共有しています。

出力例

example of hexagonal 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"

enter image description here

4
Rafael Muynarsk