Jpg-Bilder nach vorgegebenen Proportionen aufteilen (Imagemagick)

645
acman123

Ich habe eine Reihe von Bildern im JPG-Format gescannt. Wie Sie in den Bildern unten sehen, sind die Karten zweiseitig. Beim Scannen habe ich 6 Karten in den Scanner eingelegt.

Die Vorderseite der ersten Karte ist im unteren Bild mit 1 nummeriert, und die Rückseite ist mit 7 nummeriert. Die Vorderseite der zweiten Karte ist mit 2 und die Rückseite mit 8 usw. nummeriert.

Was ich erreichen möchte: Um diese Dateien (image1.jpg und image2.jpg) so zu teilen, dass ich einen Ordner mit den einzelnen Karten in der folgenden Reihenfolge habe:

1.jpg(1) 2.jpg(7) (since 7 is the back side of the 1.jpg)   3.jpg(2) 4.jpg(8) etc 

(image1.jpg) Vorderseite der sechs Karten: Vorderseite der Karten

(image2.jpg) Rückseite der sechs Karten: Rückseite der Karten

1- Wie kann ich Bilder basierend auf diesen Trennlinien mit Imagemagick (oder einer anderen Lösung) aufteilen? (Ich kann das x und y dieser Zeilen erhalten, da alle Bilder 2550x3507 sind.)

Trennlinien sind in rot: Trennlinien sind in rot dargestellt

  1. Ist es möglich, sie nach dem Aufteilen oder während des Aufteilens anhand der oben beschriebenen gewünschten Reihenfolge automatisch zu nummerieren?
0

1 Antwort auf die Frage

1
Anaksunaman

Wie kann ich Bilder anhand dieser Trennlinien mit [ImageMagick teilen?]

Die einfachste Lösung wäre wahrscheinlich die Verwendung von -crop wie folgt :

convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%02d.jpg 

Dieser Befehl:

  • Unterteilt jedes Bild in 6 (ungefähr) gleich große Kacheln ( -Schnitt 3x2 @ ) und nummeriert jedes Bild nacheinander.

  • Startet die Nummerierungssequenz bei 1( -szenieren 1 ) und nicht 0.

  • Gibt den endgültigen Zahlen ein 0-padding ( %02d) in den einzelnen Ziffern [ 01-09].

Befehlsnotizen

  • Es ist zwar möglich, eine exakte Größe (z. B. 1000x1000) anzugeben oder Prozentsätze (z. B. 33%x50%) für einen Kachelschnitt zu verwenden, dies kann jedoch auch "trimmende" Bilder erzeugen (wahrscheinlich unerwünscht).

  • Durch die Verwendung von z. B. werden -3x2@normalerweise Bilder erstellt, deren Größe (relativ zueinander) näher liegt als der Prozentsatz "Überschießen" (z. B. 33.4%x50%), um zu vermeiden, dass "Trimmbilder" erzeugt werden.

  • In einer Batchdatei müssen Sie die Prozentzeichen verdoppeln, damit sie wie vorgesehen funktionieren:

    convert -crop 3x2@ -scene 1 image1.jpg image2.jpg cropped_%%02d.jpg 
  • Wenn Sie in einem Format schreiben, das Bild- / Leinwand-Offsets enthalten kann (z. B. .png), möchten Sie möglicherweise + repage nach Ihrem einfügen-crop :

    convert -crop 3x2@ +repage -scene 1 image1.jpg image2.jpg cropped_%02d.png 
  • Wenn Ihre Eingabeformate Bild- / Canvas-Offsets enthalten können, möchten Sie möglicherweise +repageauch diese.


Umbenennung

Ist es möglich, sie anhand der oben beschriebenen Reihenfolge automatisch zu nummerieren?

Mit ImageMagick allein war ich dazu nicht in der Lage (ich vermute, dass dies wahrscheinlich nicht möglich ist, aber ich bin mir ehrlich gesagt nicht sicher). Abgesehen von ImageMagick ist dies natürlich völlig möglich.

Da Sie diese Frage mit einem Tag versehen haben batch, ist es erwähnenswert, dass ich nicht mit guten Lösungen im Batch helfen kann. Angesichts dessen scheint es sehr wahrscheinlich, dass Sie (oder jemand anderes) in der Lage sind, etwas Besseres zu finden, als das, worauf ich unten eingehen möchte.

Obligatorische Charge (Nicht-) Antwort

Die Umbenennung durch Brute-Force ist mit Batch möglich. Benennen Sie zunächst jede Datei (außer der ersten und letzten) vorübergehend um, zB:

rename cropped_02.jpg cropped_02_temp.jpg  [...] rename cropped_11.jpg cropped_11_temp.jpg  

Benennen Sie sie dann wieder in ihre neuen Positionen um, zB:

rename cropped_02_temp.jpg cropped_03.jpg rename cropped_03_temp.jpg cropped_05.jpg  rename cropped_04_temp.jpg cropped_07.jpg  rename cropped_05_temp.jpg cropped_09.jpg  rename cropped_06_temp.jpg cropped_11.jpg  rename cropped_07_temp.jpg cropped_02.jpg  rename cropped_08_temp.jpg cropped_04.jpg  rename cropped_09_temp.jpg cropped_06.jpg  rename cropped_10_temp.jpg cropped_08.jpg  rename cropped_11_temp.jpg cropped_10.jpg  

Batch ist in der Lage, Argumente aus der Befehlszeile zu übernehmen und Mathematik auszuführen sowie forSchleifen und ifAnweisungen usw. zu besitzen, sodass diese Lösung (offensichtlich) verbessert werden kann.


Anmerkungen umbenennen

Wenn Sie sich die zweite Hälfte des Umbenennungsvorgangs oben ansehen, werden Sie ein Muster in den Dateinamen bemerken. Für eine bestimmte Position N können wir effektiv eine der folgenden zwei Formeln verwenden, um die neue Position eines Elements in Ihrem Schema zu finden:

  • Artikel bis zum "halben" Punkt (zB 2-6): (Position_N * 2) - 1
  • Artikel jenseits des "Halfway" -Punkts (zB 7-11): (Position_N * 2) - Total_Items

Hinweis: Es ist zwar möglich, diese Formeln auf eine gesamte Sequenz anzuwenden (z. B. 1 und 12), jedoch ändern die ersten und letzten Elemente niemals ihre Position. Dies macht eine Umbenennung wohl unnötig.


Außerdem sollten diese für jede gerade (nicht gerade) Anzahl von Positionen / Positionen (4 oder mehr) funktionieren, vorausgesetzt, Ihre Dateinamen sind in Ordnung (z. B. 1 bis 12). Also für deine ursprünglichen Beispiele:

Temp Item 2 becomes (2 * 2) - 1 = Item 3 Temp Item 7 becomes (7 * 2) - 12 = Item 2 Temp Item 8 becomes (8 * 2) - 12 = Item 4 [...] 

Daher können die angegebenen Formeln möglicherweise die Basis für Batch-Lösungen (oder andere Skriptlösungen) sein. Es gibt jedoch ein paar andere Dinge, die Sie beachten sollten, wenn Sie sich entscheiden, sie als solche zu verwenden ...

Sortierung

Die Sortierung (wie oben angesprochen) kann praktische Konsequenzen haben, zum Beispiel in Skripts, da von Windows zurückgegebene Elemente die angegebenen Formeln "brechen". Insbesondere:

  • Windows sortiert Namen standardmäßig in lexikografischer Reihenfolge. Dies bedeutet, dass Elemente, die keine 0einzelnen Ziffern enthalten (z. B. image_1.jpg vs. image_01.jpg ), nicht in (natürlicher) Reihenfolge angezeigt werden, wenn sie direkt von Windows zurückgegeben werden. Das heißt, sie werden zurückgegeben als zB:

    cropped_1.jpg, cropped_10.jpg, cropped_11.jpg, cropped_12.jpg, cropped_2.jpg, etc. 
  • Bestimmte Wörter und Ausdrücke (z. B. - Copy) in Dateinamen können auch die Reihenfolge beeinflussen, in der Dateinamen zurückgegeben werden.

Wenn Sie die obigen Formeln verwenden, stellen Sie sicher, dass 0Sie in Ihren Dateinamen einzelne Ziffern eingeben und Dinge entfernen - Copy(oder andere Schritte unternehmen, um diese Probleme zu beheben ).

Schleifen / Zähler beginnend mit 0

Wenn Sie eine Sprache verwenden, die mit dem Zählen beginnt 0(z. B. in Schleifen), können sich die Formeln dadurch geringfügig ändern:

  • Artikel bis zum "halben" Punkt (zB 1-5): (Position_N * 2)
  • Artikel jenseits des "Halfway" -Punkts (zB 6-10): (Position_N * 2) - (Total_Items - 1)

Denken Sie daran, dass bei einer Zählung von 0 12 Artikel ausgeführt würden 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.


Ein Python-Skript

Wenn Sie interessiert sind, habe ich ein kleines (wahrscheinlich furchtbares) Python-Skript für Python 3.x (getestet mit 3.6.4) geschrieben, das von der Befehlszeile aus verwendet werden kann, um beliebige Dateien, die in der Reihenfolge liegen, umzubenennen (z . B. cropped_01. jpg ... cropped_XX.jpg ) auf die in Ihrer Frage angegebene Reihenfolge. Sie müssen eine Kopie von Python installieren, wenn Sie es ausprobieren möchten.

Einschränkungen

  • Liest nicht aus Textdateien nach Informationen (also keine Angabe einer Liste von Dateien zu diesem Zeitpunkt). Auf der Kommandozeile sind ebenfalls ein Bild- / Dateinamen-Präfix und eine Erweiterung erforderlich.

  • Das Skript erwartet, dass die Dateinamen automatisch in der richtigen Reihenfolge zurückgegeben werden (siehe Windows und 0-Padding oben).

  • Es gibt eine Option, ein Drittanbieter-Modul zu verwenden, das aufgerufen wird natsort(installiert mit z. B. python -m pip install natsort), wenn Ihre Artikel nicht mit 0-padded sind. Sie müssen jedoch nach der Installation die Zeilen 13 ( from natsort import natsorted) und 105 ( item_list = list(natsorted(item_list))) im Skript auskommentieren natsort, um diese Option verwenden zu können.

Um es klar zu sagen, bedeutet "unkommentieren", den #führenden Platz am Anfang der Zeile zu entfernen . Zusätzliche Anweisungen zur Verwendung sind im Skript enthalten.

Ihr Python-Skript hat nicht funktioniert, obwohl Ihr erster Teil der Antwort die Aufgabe erledigt hat, die ich brauchte acman123 vor 6 Jahren 0
Hmm ... Nun, ich bin froh, dass zumindest ein Teil der Antwort funktioniert hat! = P Anaksunaman vor 6 Jahren 0