我々は上の選択された領域のスクリーンショットを撮るときUbuntu
(使用してShift+ Prt ScrまたはCtrl+ Shift+ Prt Scr)私たちは常に矩形領域を選択します。したがって、Inkscapeなどのソフトウェアで画像を編集して長方形の画像で円を作成できることはわかっていますが、さまざまな種類の形状(主に円)を選択できるように変更できる構成があるかどうかを知りたいです。)スクリーンショットを撮っているときに直接。
出来ますか?
我々は上の選択された領域のスクリーンショットを撮るとき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
これは、見えないターミナルウィンドウ(赤い「X」と青い「T」のアイコン)でスクリプトを実行しますEnter。入力するときに、フォーカスされていることを確認するだけです。デスクトップ環境の設定を使用して、このコマンドをキーボードショートカットに割り当てることができます。
ImageMagickは非常に強力なので、このスクリプトを他の形状も出力するように調整できますellipse
。xとyの両方の方向に同じ半径を使用して、上の円を描画しました。たとえば$radius,$(bc <<<"$radius*0.5")
、偏心が0を超える楕円になるように変更してください。
1:imagemagick.orgのこのスレッドからアプローチを採用しました。
スクリーンショットについて、ここでいくつか発見しました。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
。
受け入れられた回答の同じアイデアを使用して、六角形のスクリーンショットを撮る別のスクリプトを作成しました。他の人に役立つ場合に備えて、ここでそれを共有しています。
#!/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"
。