Ist es möglich, einen Screenshot eines kreisförmig ausgewählten Bereichs zu machen?

10

Wenn wir Screenshots von ausgewählten Bereichen machen Ubuntu(mit Shift+ Prt Scroder Ctrl+ Shift+ Prt Scr), wählen wir immer einen rechteckigen Bereich aus . Ich weiß also, dass ich das Bild mit einer Software wie Inkscape bearbeiten kann, um einen Kreis mit dem rechteckigen Bild zu erstellen, aber ich möchte wissen, ob ich eine Konfiguration ändern kann, um verschiedene Arten von Formen (hauptsächlich Kreise) auswählen zu können ) direkt wenn ich den Screenshot mache.

Ist es möglich?

Rafael Muynarsk
quelle
1
das wäre sicher unmöglich, wie groß der Kreis sein würde und wie seine Position sein würde. Bildschirm drucken druckt entweder den gesamten Bildschirm (Rechteck) oder das aktuell aktive Fenster (Rechteck)
Broadsworde
Nicht wirklich, wenn wir Shift + PrintScreen oder Strg + Shift + PrintScreen verwenden, können wir bereits einen rechteckigen ausgewählten Bereich drucken ... Ich verwende Ubuntu 16.04, ich möchte nur diese rechteckige Form ändern, die standardmäßig in eine kreisförmige Form umgewandelt wird .
Rafael Muynarsk
Die über den dconf-Editor für org / gnome / gnome-Screenshot verfügbaren Einstellungen sind: Verzeichnis automatisch speichern, Randeffekt, Standarddateityp, Verzögerung, Einschlussrand, Einschluss-ICC-Profil, Einschlusszeiger, Letzter- Verzeichnis speichern, Fenster aufnehmen (beraubt). Form nicht als Einstellung vorhanden.
Broadsworde
1
@Broadsworde ksnapshop kann also warum nicht;) Es hat eine "freie Hand", um die seltsamsten Formen zu machen; einen Kreis machen ... wie gut kannst du einen Ramuyko machen;)
Rinzwind
@Ramuyko Eine andere Idee, die ich hatte, war, den üblichen rechteckigen Screenshot zu verwenden und einfach den größtmöglichen Kreis daraus zu schneiden. Auf diese Weise können Sie den Bereich so auswählen, wie Sie es gewohnt sind. Interessieren Sie sich auch für diesen Ansatz?
Nachtisch

Antworten:

9

Ich habe ein kleines Skript für kreisförmige Screenshots zusammengestellt. Sie benötigen die folgenden Pakete (obwohl es auch für andere Screenshot-Programme und Terminalemulatoren anpassbar ist):

sudo apt install xdotool gnome-screenshot imagemagick xterm

Das Skript

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

Speichern Sie es als zB ~/circular_screenshot.bashund machen Sie es ausführbar mit chmod +x ~/circular_screenshot.bash. Wenn Sie es ausführen, werden Sie vom Skript zuerst aufgefordert, den Mauszeiger an die Mittelposition Enterzu bewegen und zu drücken und dann an eine Kantenposition zu bewegen (egal welche, das Skript berechnet den Radius aus der Entfernung) und erneut zu drücken Enter. Der Bildschirm flackert dann, während der Screenshot aufgenommen wird (ich empfehle scrot $temp_screenshotstattdessen die Verwendung , er zeigt dieses seltsame Verhalten nicht.) Und ImageMagicks convert1 wird zum Zuschneiden des Bildes verwendet. Die Ausgabe wird mit einem Zeitstempel als Dateiname in Ihrem Ausgangsverzeichnis gespeichert. Sie können dieses Verhalten ändern, indem Sie die outputVariable des Skripts bearbeiten .

Beispielausgabe

Beispielausgabe

Anruf ohne (oder besser: mit unsichtbarem) Terminalfenster

Ich nehme an, Sie möchten nicht, dass ein Terminal Ihren Bildschirm jedes Mal blockiert, wenn Sie einen solchen Screenshot erstellen. Hier ist eine Lösung dafür. Rufen Sie das Skript wie folgt auf (vorausgesetzt, das Skript wurde gespeichert als ~/circular_screenshot.bash):

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

Dadurch wird das Skript in einem unsichtbaren Terminalfenster ausgeführt (Symbol mit einem roten „X“ und einem blauen „T“). Sie müssen lediglich sicherstellen, dass es beim Tippen fokussiert ist Enter. Sie können diesen Befehl mithilfe der Einstellungen Ihrer Desktop-Umgebung einer Tastenkombination zuweisen.

Da ImageMagick unglaublich leistungsfähig ist, können Sie dieses Skript auch für die Ausgabe anderer Formen anpassen. Ich habe ellipseden Kreis oben in x- und y-Richtung mit demselben Radius gezeichnet. Ändern Sie diesen in z. B. $radius,$(bc <<<"$radius*0.5"), um stattdessen eine Ellipse mit einer Exzentrizität über 0 zu erhalten.

1: Ich habe den Ansatz aus diesem Thread auf imagemagick.org übernommen .

Dessert
quelle
jetzt wäre xdotool kombiniert mit der freihändigen auswahl von ksnapshot etwas!
Sebastian Stark
Und Sie können eine benutzerdefinierte Verknüpfung unter Alle Einstellungen> Tastatur hinzufügen, + eine benutzerdefinierte Verknüpfung hinzufügen, dieses Skript in das Befehlsfeld einfügen und es der Drucktaste zuweisen.
Mike
@SebastianStark Was hast du vor? Eine andere Auswahl (vielleicht ähnlich meiner anderen Idee )?
Nachtisch
Als ich xdotool las, dachte ich an ein Skript, das xdotool verwendet, um den Mauszeiger in einem Kreis zu bewegen und die Freihandauswahl von ksnapshot zu nutzen.
Sebastian Stark
@SebastianStark Oh, das ist ein dritter Weg - bitte schreibe ein Skript und füge eine Antwort hinzu! ;)
Nachtisch
6

Ich habe hier einige Dinge über Screenshots entdeckt. Wenn wir Screenshots unter Ubuntu machen (meins ist 16.04), verwenden wir tatsächlich eine Software namens gnome-screenshot. Es ist eine Open Source Software, die in C geschrieben wurde und deren Quellcode auf GitHub unter folgendem Link zu finden ist :

Geben Sie hier die Bildbeschreibung ein

Nun, da gibt es eine Datei namens screenshot-area-selection.c, die meine Frage beantwortet. Es ist eine Datei mit 361 Codezeilen, daher werde ich sie hier nicht einfügen. Soweit ich diese Datei verstanden habe (nicht viel), werden viele Funktionen verwendet, die so strukturiert sind, dass eine rechteckige Form entsteht ... Wie in diesem Code:

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;

Mein Fazit ist also, dass es nicht möglich ist, eine Konfiguration zu ändern, um Screenshots mit zu machen, gnome-screenshotda der Code dafür nicht strukturiert ist ... Obwohl es möglich ist, den Code herunterzuladen, den Code selbst zu ändern, ihn neu zu kompilieren und dann meine eigene personalisierte Version zu verwenden von gnome-screenshot.

Rafael Muynarsk
quelle
4

Mit der gleichen Idee der akzeptierten Antwort habe ich ein anderes Skript erstellt, um sechseckige Screenshots zu machen, und ich teile es hier, falls es für jemand anderen nützlich ist.

Beispielausgabe

Beispiel eines sechseckigen Screenshots

Das Drehbuch

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

Der Prozess ist genau der gleiche wie bei der akzeptierten Antwort . In diesem Fall habe ich gerade den Skriptnamen geändert:

"Speichern Sie es als zB ~/hexagonal_screenshot.bashund machen Sie es ausführbar mit chmod +x ~/hexagonal_screenshot.bash. Wenn Sie es ausführen, fordert Sie das Skript zuerst auf, den Mauszeiger an die Mittelposition zu bewegen und die Eingabetaste zu drücken und dann an eine Kantenposition zu bewegen (egal welche, die Skript berechnet den Radius aus der Entfernung) und drücken Sie erneut die Eingabetaste. Der Bildschirm flackert dann, während der Screenshot aufgenommen wird (ich empfehle scrot $temp_screenshotstattdessen, dieses merkwürdige Verhalten nicht zu zeigen.) und ImageMagicks convertwird zum Zuschneiden des Bildes verwendet. Die Ausgabe erfolgt Mit einem Zeitstempel als Dateinamen in Ihrem Home-Verzeichnis gespeichert, können Sie dieses Verhalten ändern, indem Sie die outputVariable des Skripts bearbeiten . "


zusätzliche Information

Falls jemand neugierig auf die Mathematik ist, hier ist, wie ich es gemacht habe. Das Erstellen eines Polygons mit einer anderen Anzahl von Kanten oder unterschiedlichen Formen mithilfe Imagemagickdes Verfahrens ist dasselbe: Berechnen Sie und fügen Sie diesem Teil des Codes Punkte hinzu oder entfernen Sie sie "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".

Geben Sie hier die Bildbeschreibung ein

Rafael Muynarsk
quelle