nonerd
Goto Top

Imagemagick Buchseiten teilen und umbenennen per Batch

Moin zusammen,

bin hier superneu und hoffe geholfen zu werden face-smile.

Ich suche Hilfe beim teilen und umbenennen von gescannten Buchseiten. Am besten per Batch Aufruf.
Da ich scripte absolut nicht verstehe, hier mein anliegen.

Es sind diverse Ordner mit gescannten Buchseiten vorhanden. Jeweils zwei Buchseiten als ein Bild im Tif Format.
Mit Imagemagick ist es möglich Bilder genau zu halbieren, egal wie Groß das Eingangsbild ist. Also immer die Hälfte.
Wunsch ist es, die Bilder in diversen Unterordnern zu halbieren und den Dateinamen zu erweitern.
Imagemagick ist in den System-Variablen eingetragen. Befehle funktionieren aus beliebigen CMD Fenstern.
Der Befehl
convert -crop 2x1@ -scene 1 "*.tif" Cropped_%05d.tif  


halbiert alle Bilder eines Ordners aus dem der Befehl gestartet wurde und benennt sie in Cropped_00001.tif, Cropped_00002.tif, Cropped_00003.tif, usw..
Alle Dateien müssen hinterher wieder mit z.B. Total Commander oder Bulk Rename umbenannt werden. Recht mühsam.
Jetzt habe ich folgenden Code im Netz gefunden und als split.bat auf dem Desktop abgelegt.

@echo off
pushd "%~dp1"  

convert "%~1" ^  
   -crop 2x1@ -write mpr:img -delete 0--1 ^
   mpr:img -write "%~n1-L.tif" +delete ^  
   mpr:img[1] "%~n1-R.tif"  

popd
exit /b

Jedes Bild welche auf diese Datei gezogen wird, wird halbiert und der Dateiname um -L bzw. -R erweitert. Also nahezu perfekt, aber eben nur für jedes Bild einzeln.
Welche Variablen / Schalter erledigen das für alle Bilder in einem Ordner, bzw.
in allen Unterordnern eines Ordners?
Traum wäre, wenn alle neuen halbierten Seiten eine Ebene höher in einen, dem Dateinamen oder Vaterverzeichnis mit dem Zusatz _Geteilt, entsprechenden Ordner verschoben werden.

Ich bin sicher es geht, nur ich bin zu blöd dazu.

Für Anregungen und Hilfe jetzt schon mal Danke.

Content-Key: 588207

Url: https://administrator.de/contentid/588207

Ausgedruckt am: 29.03.2024 um 14:03 Uhr

Mitglied: TK1987
Lösung TK1987 16.07.2020 aktualisiert um 18:30:52 Uhr
Goto Top
Moin,

Zitat von @NoNerd:
Ich suche Hilfe beim teilen und umbenennen von gescannten Buchseiten. Am besten per Batch Aufruf.
sowas heute noch mit Batch zu machen *würg*
Jedes Bild welche auf diese Datei gezogen wird, wird halbiert und der Dateiname um -L bzw. -R erweitert. Also nahezu perfekt, aber eben nur für jedes Bild einzeln.
Traum wäre, wenn alle neuen halbierten Seiten eine Ebene höher in einen, dem Dateinamen oder Vaterverzeichnis mit dem Zusatz _Geteilt, entsprechenden Ordner verschoben werden.
Entscheide dich mal... soll der neue Ordner nun wie das nun wie das Vaterverzeichnis+"_geteilt" oder wie der Dateiname+"_geteilt" heissen?

Habe jetzt einfach mal angenommen wie das Vaterverzeichnis...
@echo off
SetLocal EnableDelayedExpansion

For %%A in (%*) do (
	For /f "Delims=" %%B in ('dir /s /b "%%~A\*.tif"') do (  
		Set dir=%%~dpB
		for %%C in ("!dir:~0,-1!") do (  
			set ParentPath=%%~dpC
			set ParentDir=%%~nxC
			)
		if "!ParentDir:~-7!" neq "geteilt" (  
			mkdir "!ParentPath!!ParentDir!_geteilt" >nul 2>&1  
			magick convert "%%B" -crop 2x1@ -write mpr:img -delete 0--1 mpr:img -write "!ParentPath!!ParentDir!_geteilt\%%~nB-L.tif" +delete mpr:img[1] "!ParentPath!!ParentDir!_geteilt\%%~nB-R.tif"  
			)
		)
	)

Anstatt der Bilder ziehst du nun einfach den oder die Ordner, die verarbeitet werden sollen, auf die Batchdatei.

Gruß Thomas
Mitglied: NoNerd
NoNerd 16.07.2020 aktualisiert um 17:03:09 Uhr
Goto Top
Hallo Thomas,

vielen Dank für Deine Lösung.
Vaterverzeichnis ist Prima.
Frage:
Es sind Punkte und Leerzeichen im Ordnernamen.
Jetzt wird der Ausgabeordner nach dem ersten Punkt abgeschnitten.
Bei den Dateien wird die Nummerierung nicht mitgenommen.
Es bleiben dann nur zwei Dateien übrig. Eine mit -L und eine mit -R.
Hast du dazu eine Idee?

Mit besten Grüßen
Carsten
Mitglied: TK1987
TK1987 16.07.2020 aktualisiert um 17:45:02 Uhr
Goto Top
Zitat von @NoNerd:
Es sind Punkte und Leerzeichen im Ordnernamen.
Hast du dazu eine Idee?
Ja, die Punkte im Ordnernamen lassen den Ordnernamen wie einen Dateiname inkl. Erweiterung wirken, daher muss Zeile 9 von "%%~nC" auf "%%~nxC" abgeändert werden.

Habe es oben entsprechend angepasst.
Mitglied: NoNerd
NoNerd 16.07.2020 aktualisiert um 17:56:51 Uhr
Goto Top
Super genial. Was ist Dein Getränk face-smile?
Es hängt jetzt nur in einer Dauerschleife.
Die halbierten Dateien werden wieder geteilt.
Buch.1900_Grau_geteilt
Buch.1900_Grau_geteilt_geteilt
Buch.1900_Grau_geteilt_geteilt_geteilt
Danach hört es auf.
Ideen?
Zu Batch hast du "würg" kommentiert. Wie würdest du das handhaben?
Oder hab ich mich mit "Batch" falsch ausgedrückt?

Mit besten Grüßen
Carsten
Mitglied: TK1987
TK1987 16.07.2020 um 18:34:07 Uhr
Goto Top
Zitat von @NoNerd:
Es hängt jetzt nur in einer Dauerschleife.
Die halbierten Dateien werden wieder geteilt.
So, dürfte nun behoben sein.
Zu Batch hast du "würg" kommentiert. Wie würdest du das handhaben?
Batch ist halt ein Dinosaurier und sollte längst ausgestorben verbuddelt und zu Kraftstoff verabreitet sein... sowas macht man heutzutage eigentlich mit Powershell.

Gruß Thomas
Mitglied: NoNerd
NoNerd 16.07.2020 um 19:11:11 Uhr
Goto Top
Wunderbar. Vielen Dank.
Wie würde das mit Powershell aussehen?
Hab zwar keine Ahnung. Aber Dinosaurier.... Wie macht man das heute?

Wir wünschen alles erdenklich Gute, vor allem aber Gesundheit und Lebensfreude.

Mit besten Grüßen
Carsten
Mitglied: TK1987
TK1987 16.07.2020 aktualisiert um 20:10:59 Uhr
Goto Top
Zitat von @NoNerd:
Wie würde das mit Powershell aussehen?
Leg dir iregendwo ein Ordner an der z.B. "Skripte" heisst. Dort legst du folgendes Skript mit der Endung .PS1 rein:
$Args | % {
	ls -r "$_\*.Tif" | ? {$_.DirectoryName -notmatch "_geteilt$"} | % {  
		$Dir=(md -force "$($_.DirectoryName)_geteilt").Fullname  
		magick convert $_.Fullname -crop 2x1@ -write mpr:img -delete 0--1 mpr:img -write "$dir\$($_.BaseName)-L.tif" +delete mpr:img[1] "$dir\$($_.BaseName)-R.tif"  
		}
	}

Auf dieses Skript gehst du nun mit Rechtsklick > Kopieren, gehst anschließend an irgendeinen Ort, an dem du es gerne hättest und wählst Rechtsklick > Verknüpfung einfügen.

Auf diese Verknüpfung Rechtsklick > Eigenschaften und unter Registerkarte Verknüpfung ergänzt du unter "Ziel" vor dem Dateipfad zum Skript noch
powershell -EP ByPass -File
also bei Ziel steht dann zum Beispiel z.B.
Powershell -EP ByPass -File "C:\Skripte\Bilder teilen.PS1"  

Auf diese Verknüpfung kannst du dann wie gewohnt die Ordner draufziehen.

Alternativ kannst du die Verknüpfung auch in den SendTo-Ordner legen. Dann kannst du später einfach die Ordner, die du mit dem Skript bearbweiten willst, auswählen und mit Rechtsklick > Senden An > Skriptname so die Ordner an das Skript schicken.

Zudem kannst du der Verknüpfung optional auch gleich noch ein schickes passendes Icon verpassen.
Mitglied: NoNerd
NoNerd 17.07.2020 um 05:38:57 Uhr
Goto Top
Moin Thomas,

danke für die Ergänzungen.
Bei mir ploppt nur kurz das blaue Powershell Fenster auf.
Sonst passiert nix.
Ich probiere es heute Nachmittag nochmal.
Die Bat-Datei funktioniert tadellos.
Hierfür meinen herzlichen Dank.

Bis zum nächsten Mal.
Mit besten Grüßen
Carsten
Mitglied: TK1987
TK1987 17.07.2020 um 07:39:21 Uhr
Goto Top
Bei mir funktioniert es tadellos.

Gehen wir der Sache auf den Grund: Füge in den Eigenschaften der Verknüpfung bei Ziel hinter powershell noch -NoExit an, so bleibt das Fenster nach dem Ende des Skripts geöffnet. Erscheint dort eine Fehlermeldung? Falls ja, diese bitte hier posten.
Mitglied: NoNerd
NoNerd 20.07.2020 um 08:22:38 Uhr
Goto Top
Sorry für die späte Antwort.

Bei mir erscheint:

Windows PowerShell
Copyright (C) Microsoft Corporation. Alle Rechte vorbehalten.

Lernen Sie das neue plattformübergreifende PowerShell kennen – https://aka.ms/pscore6

In C:\Scripts\splitbook.ps1:1 Zeichen:7

back-to-top@echo off

back-to-top~~~

Unerwartetes Token "off" in Ausdruck oder Anweisung.
In C:\Scripts\splitbook.ps1:4 Zeichen:4

back-to-topFor %%A in (%*) do (

back-to-top~

Öffnende "(" fehlt nach dem Schlüsselwort "for".
In C:\Scripts\splitbook.ps1:6 Zeichen:17

back-to-topSet dir=%%~dpB

back-to-top~

Schließende ")" fehlt in einem Ausdruck.
In C:\Scripts\splitbook.ps1:8 Zeichen:25

back-to-topset ParentPath=%%~dpC

back-to-top~

Schließende ")" fehlt in einem Ausdruck.
In C:\Scripts\splitbook.ps1:11 Zeichen:5

back-to-topif "!ParentDir:~-7!" neq "geteilt" (

back-to-top~

"(" fehlt nach "if" in der "if"-Anweisung.
In C:\Scripts\splitbook.ps1:11 Zeichen:24

back-to-topif "!ParentDir:~-7!" neq "geteilt" (

back-to-top~~~

Unerwartetes Token "neq" in Ausdruck oder Anweisung.
In C:\Scripts\splitbook.ps1:12 Zeichen:53

back-to-topmkdir "!ParentPath!!ParentDir!_geteilt" >nul 2>&1

back-to-top~

Schließende ")" fehlt in einem Ausdruck.
In C:\Scripts\splitbook.ps1:19 Zeichen:4

back-to-top)

back-to-top~

Unerwartetes Token ")" in Ausdruck oder Anweisung.
In C:\Scripts\splitbook.ps1:20 Zeichen:3

back-to-top)

back-to-top~

Unerwartetes Token ")" in Ausdruck oder Anweisung.
In C:\Scripts\splitbook.ps1:21 Zeichen:2

back-to-top)

back-to-top~

Unerwartetes Token ")" in Ausdruck oder Anweisung.
Es wurden nicht alle Analysefehler berichtet. Korrigieren Sie die berichteten Fehler, und versuchen Sie es erneut.
+ CategoryInfo : ParserError: (face-smile , ParentContainsErrorRecordException
+ FullyQualifiedErrorId : UnexpectedToken

PS C:\Scripts>

Hab ich was falsch gemacht?
Mitglied: TK1987
TK1987 20.07.2020 aktualisiert um 15:10:30 Uhr
Goto Top
Moin,

Zitat von @NoNerd:
Hab ich was falsch gemacht?
Jo 🤣.

Du sollst natürlich nicht das Batchscript nehmen, sondern das Powershell-Script, dass ich oben gepostet habe, also das hier:
Zitat von @TK1987 :
$Args | % {
 	ls -r "$_\*.Tif" | ? {$_.DirectoryName -notmatch "_geteilt$"} | % {  
 		$Dir=(md -force "$($_.DirectoryName)_geteilt").Fullname  
 		magick convert $_.Fullname -crop 2x1@ -write mpr:img -delete 0--1 mpr:img -write "$dir\$($_.BaseName)-L.tif" +delete mpr:img[1] "$dir\$($_.BaseName)-R.tif"  
 		}
 	}

Gruß Thomas
Mitglied: NoNerd
NoNerd 20.07.2020 um 15:49:05 Uhr
Goto Top
Der Fehler ist wie so oft vor der Tastatur.

Jetzt klappt es wie du es vorhergesagt hast.

Wenn die Ordner mit den zu teilenden Dateien immer in dem selben Ordner liegen, kann man es dann mit einem Doppelklick starten?
Das Draufziehen hat bei mehr als 100 Ordnern nicht geklappt.
Hatte es dann in einem Konsolenfenster mit
splitbook "E:\Ordnername"  

aufgerufen. Das lief sauber durch.

Danke für dein Nachhaken.

Mit besten Grüßen
Carsten
Mitglied: TK1987
TK1987 20.07.2020 aktualisiert um 16:31:24 Uhr
Goto Top
Zitat von @NoNerd:
Das Draufziehen hat bei mehr als 100 Ordnern nicht geklappt.
Das liegt daran, dass die Argumente immernoch von CMD geparsed werden - 100 Argumente sind da einfach zu viel (dürfte bei der Batch genauso wenig funktionieren).
Du kannst allerdings einfach den übergeordneten Ordner da drauf ziehen, das Skript geht sowieso dann alle Unterverzeichnisse durch.
Mitglied: NoNerd
NoNerd 20.07.2020 um 16:38:31 Uhr
Goto Top
Habe die Powershell- Verknüpfung mit eigenem Symbol versehen und mal einen Testordner mit Unterordnern draufgezogen.
Läuft wie gewünscht.

Bis zum nächsten Mal.
Danke und Grüße
Carsten