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:
(image2.jpg) Rückseite der sechs 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.)
- 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), statt0
.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 (zB33.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
+repage
diese 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 for
Schleifen und if
Anweisungen 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
0
vor 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, 0
einzelne 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 egpython -m pip install natsort
) zu verwenden, wenn Ihre Elemente nicht mit -padded versehen sind . Um diese Option zu verwenden0
, 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.