JPG-Bilder nach vorgegebenen Proportionen aufteilen (ImageMagick)

JPG-Bilder nach vorgegebenen Proportionen aufteilen (ImageMagick)

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

Die Vorderseite der ersten Karte hat im Bild unten die Nummer 1 und ihre Rückseite die Nummer 7. Die Vorderseite der zweiten Karte hat die Nummer 2 und ihre Rückseite die Nummer 8 usw.

Was ich erreichen möchte: Diese Dateien (image1.jpg und image2.jpg) so aufteilen, dass ich einen Ordner habe, der die einzelnen Karten in der folgenden Reihenfolge enthält:

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 mit ImageMagick (oder einer anderen Lösung) anhand dieser Trennlinien aufteilen? (Ich kann die x- und y-Werte dieser Linien ermitteln, da alle Bilder 2550 x 3507 groß sind.)

Trennlinien sind rot: Trennlinien sind rot

  1. Ist es nach dem Teilen oder während des Teilens möglich, sie automatisch basierend auf der oben beschriebenen gewünschten Reihenfolge zu nummerieren?

Antwort1

Wie kann ich Bilder mit [ImageMagick?] basierend auf diesen Trennlinien aufteilen?

Die wohl einfachste Lösung wäre die Verwendung von-Ernteetwa so:

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

Dieser Befehl:

  • Teilt jedes Bild in 6 (ungefähr) gleich große Kacheln auf (-zuschneiden 3x2@), und nummerieren Sie sie der Reihe nach.

  • Beginnt die Nummerierungssequenz bei 1(-Szene 1), statt 0.

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

Befehlshinweise

  • Obwohl es möglich ist , für den Kachelzuschnitt eine genaue Größe anzugeben (z. B. 1000x1000) oder Prozentwerte zu verwenden (z. B. ), kann dies möglicherweise auch zu „Beschnittenheiten“ der Bilder führen (was wahrscheinlich unerwünscht ist).33%x50%

  • Die Verwendung von zB -3x2@erstellt typischerweise Bilder, die in der Größe (relativ zueinander) näher beieinander liegen als das „Überschreiten“ der Prozentsätze (zB 33.4%x50%), um die Entstehung „beschnittener“ Bilder zu vermeiden.

  • 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 Formate schreiben, die Bild-/Leinwand-Offsets haben können (z. B. .png), möchten Sie möglicherweise Folgendes einschließen+neue Seitenach ihrem -crop:

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


Umbenennung

Ist eine automatische Nummerierung in der oben beschriebenen Reihenfolge möglich?

Mit ImageMagick allein war mir das nicht möglich (ich vermute, dass es wahrscheinlich nicht möglich ist, aber ich bin mir da ehrlich gesagt nicht sicher). Natürlich ist das unabhängig von ImageMagick durchaus möglich.

Da Sie diese Frage mit markiert haben batch, ist es erwähnenswert, dass ich wahrscheinlich nicht mit guten Lösungen im Batch helfen kann. In Anbetracht dessen ist es sehr wahrscheinlich, dass Sie (oder jemand anderes) etwas Besseres finden können als das, was ich unten ausführlich beschreibe.

Obligatorische Batch-(Nicht-)Antwort

Umbenennen mit roher Gewalt ist mit Batch möglich. Benennen Sie zunächst jede Datei (außer der ersten und letzten) vorübergehend um, z. B.:

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

Benennen Sie sie dann wieder an ihre neuen Positionen um, z. B.:

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 kann Argumente aus der Befehlszeile übernehmen und mathematische Berechnungen durchführen und verfügt außerdem über forSchleifen und ifAnweisungen usw., sodass diese Lösung (offensichtlich) verbessert werden kann.


Notizen umbenennen

Wenn Sie sich die zweite Hälfte des Umbenennungsprozesses oben ansehen, werden Sie ein Muster in den Dateinamen bemerken. Tatsächlich können wir für eine gegebene Position N eine der folgenden beiden Formeln verwenden, um die neue Position eines Elements in Ihrem Schema zu finden:

  • Elemente bis zur „Halbzeit“ (z. B. 2-6): (Position_N * 2) - 1
  • Artikel jenseits der „Halbzeit“ (z. B. 7-11): (Position_N * 2) - Total_Items

Hinweis: Es ist zwar möglich, diese Formeln auf eine ganze Folge anzuwenden (z. B. 1 und 12), aber das erste und das letzte Element ändern nie ihre Position. Dies macht eine Umbenennung wohl unnötig.


Darüber hinaus sollten diese für allesogar(nicht ungerade) Anzahl von Elementen/Positionen (4 oder mehr), vorausgesetzt, Ihre Dateinamen sind in der richtigen Reihenfolge (z. B. 1 bis 12). Also für Ihre 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
[...]

Die angegebenen Formeln können daher möglicherweise als Grundlage für Batch-Lösungen (oder andere Skriptlösungen) dienen. Wenn Sie sie jedoch als solche verwenden möchten, müssen Sie noch ein paar andere Dinge beachten ...

Sortierung

Das Sortieren (wie oben erwähnt) kann in Dingen wie Skripten praktische Konsequenzen haben, da von Windows „in der falschen Reihenfolge“ zurückgegebene Elemente die angegebenen Formeln „zerstören“. Insbesondere:

  • Windows sortiert Namen inlexikographischstandardmäßig sortiert. Das bedeutet, dass Elemente, die kein 0vor einzelnen Ziffern haben (z. B.bild_1.jpgVergleichebild_01.jpg) erscheinen nicht in (natürlicher) Reihenfolge, wenn sie direkt von Windows zurückgegeben werden. Das heißt, sie werden beispielsweise wie folgt zurückgegeben:

    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 sich auch auf die Reihenfolge auswirken, in der Dateinamen zurückgegeben werden.

Wenn Sie die obigen Formeln verwenden, achten Sie darauf, 0einzelne Ziffern in Ihren Dateinamen mit -aufzufüllen und Dinge wie zu entfernen - Copy(oder ergreifen Sie anderweitig Maßnahmen, um diese Probleme zu mildern).

Schleifen/Zähler beginnend mit 0

Wenn Sie eine Sprache verwenden, die mit dem Zählen beginnt 0(beispielsweise in Schleifen), dann kann dies die Formeln leicht verändern:

  • Elemente bis zur „Halbzeit“ (z. B. 1–5): (Position_N * 2)
  • Elemente nach dem „Halbwegs“-Punkt (z. B. 6–10): (Position_N * 2) - (Total_Items - 1)

Bedenken Sie, dass beim Zählen von 0 an 12 Elemente ausgegeben würden 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11.


Ein Python-Skript

Falls es dich interessiert, habe ich eine kleine (wahrscheinlich schreckliche)Python-Skriptfür Python 3.x (getestet mit 3.6.4), das von der Kommandozeile aus verwendet werden kann, um beliebige Dateien umzubenennen, die in einer Folge stehen (z. B.cropped_01.jpg...zugeschnitten_XX.jpg) in der in Ihrer Frage angegebenen Reihenfolge. Sie müssenhabe eine Kopie von Pythoninstalliert, wenn Sie es ausprobieren möchten.

Einschränkungen

  • Liest keine Informationen aus Textdateien (deshalb kann derzeit keine Liste von Dateien angegeben werden). Ebenso sind in der Befehlszeile ein Bild-/Dateinamenpräfix und eine Erweiterung erforderlich.

  • So wie es ist, erwartet das Skript, dass die Dateinamen automatisch in der richtigen Reihenfolge zurückgegeben werden (siehe „Windows“ und 0„-padding“ oben).

  • Es besteht die Möglichkeit, ein Drittanbietermodul namens natsort(installiert mit eg python -m pip install natsort) zu verwenden, wenn Ihre Elemente nicht mit -padded versehen sind . Um diese Option zu verwenden 0, müssen Sie jedoch nach der Installation Zeile 13 ( from natsort import natsorted) und Zeile 105 ( item_list = list(natsorted(item_list))) im Skript auskommentieren.natsort

Um es klar auszudrücken: „Kommentar entfernen“ bedeutet, das #führende Leerzeichen und am Zeilenanfang zu entfernen. Weitere Anweisungen zur Verwendung sind im Skript enthalten.

verwandte Informationen