Announcement

Collapse
No announcement yet.

Automatisches verkleinern und konvertieren aus verschiedenen Unterordnern oder Batch

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

    Automatisches verkleinern und konvertieren aus verschiedenen Unterordnern oder Batch

    Hallo Zusammen,

    ich bastele schon seit längerem an einer Batch-Datei zur Automatischen Sicherung und Bearbeitung von Bildern ( s.o. ) aber da sich einfach keine 100% zufriedenstellende Lösung einstellt, würde ich hier gerne mein Problemchen vortragen :

    Ausgangslage: Ein so gut wie pensionierter Mitarbeiter mit minimalsten PC-Kenntnissen scannt unser gesamtes Microfiche Archiv ein.
    Das Scanprogramm speichert je nach Zeichnungsnummer automatisch in verschiedenen Unterordnern und je nach Qualität des Originals in TIF oder JPG. ( Man hat ein Verhältnis von gut 80% TIF zu 20% JPG)

    Die Aufgabe ist nun die eingescannte Masse jeden Abend per Knopfdruck zu verkleinern und im Netz zu sichern.

    Als Basis nahm ich hierfür eine batch von Foxy aus diesem Forum und passte sie an :




    Code:
    echo off
    cls
    
    echo Hiermit werden die Zeichnungen unter C:\Scans verkleinert und ins Netz nach O:\TF\Scan-Microfiche kopiert. Fortfahren ?  j/n?
     
    set /p Start=
    if "%Start%"=="n" goto :end
    
    xcopy C:\Scans\*.* D:\Trans /D /E /Y
    
    rem Pfad fuer IrfanView
    set iview="C:\Program Files\IrfanView\i_view32.exe"
    
    rem Quellverzeichnis
    set quelle=D:\Trans
    
    rem Dateityp
    set filetype=*.tif
    
    rem Dateityp
    set filetype2=*.jpg
    
    rem Breite
    set width=1600
    
    rem JPEG-Qualitaet
    set quality=70
    
    echo Konvertierung TIF nach JPG  . . .
    for /r "%quelle%" %%a in (%filetype%) do (
    echo Datei %%a
    start /wait "IView" %iview% "%%a"  /convert=$N-1.jpg
    )
    
    del /S /Y D:\Trans\*.tif
    
    echo Verkleinerung . . .
    for /r "%quelle%" %%a in (%filetype2%) do (
    echo Datei %%a
    start /wait "IView" %iview% "%%a" /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert="%%a"
    )
    echo .
    echo .
    echo Konvertierung abgeschlossen.
    echo .
    echo .
    echo Kopiere Dateien nach O:\TF\Scan-Microfiche
    xcopy D:\Trans\*.* Z:\ /D /E /Y
    echo .
    echo .
    explorer.exe Z:\
    echo .
    echo .
    echo Die Daten sind nun auf O:\TF\Scan-Microfiche gesichert
    echo .
    echo .
    
    pause
    
    :end
    Alles unter C:\scans wird inkl Unterordnern nach D:\Trans kopiert. in D:\Trans wird aus jedem TIF ein JPG gemacht, dann werden alle TIFs gelöscht. Anschliessend wir die Größe genormt und die Dateigröse verkleinert.
    Zuletzt wird alles in ein Netzlaufwerk kopiert.

    Nun zu den Fragen :
    Vorneweg: Was bedeutet "%%a" ( ein Prozent bei Batch wäre mir bekannt ) ?

    1. Anstatt bei der Konvertierung von TIF nach JPG immer ein -1 anzuhängen um doppelte Dateinachemn zu verhinden, FALLS es vorkommt, würde ich hier gerne eine "if exist" o.Ä. Abfrage einbauen, sodass nur umbenannt wird, wenn ein Dateiname schon vorhanden ist. Ich weiss nur nicht wie das geht ;-)

    2. Komischerweise funktioniert auf diese Weise nur die Konvertierung von TIF nach JPG, von JPG nach TIF, was mir eigentlich leiber wäre geht nicht.. Jemand eine Idee ?

    3. Könnte man die Konvertierung in ein Dateiformat evtl eleganter lösen als im direkten Anschluss einfach alle`"alten" Dateiformate zu löschen?


    Es würde mich sehr freuen wenn sich jemand kurz die Zeit nehmen könnte um sich die Batch durchzusehen.

    --Sicherlich wäre ein Abarbeiten über die Stapelverarbeitung innerhalb von Iview viel viel einfacher, aber aufgrund der PC Kenntnisse des Mitarbeiters soll eine "1-Klick-Lösung" her.

    Viele Grüße und Dank im Voraus.

    Thommy

    #2
    das klingt fürmich alles furchtbar kompliziert, wie du an die Sache herangehst
    ich nehme die Thumbnailansicht
    Datei suche zB *.TIF und wenn du es brauchst: das exakte Datum angeben -
    dann habe ich alle Dateien beisammen und konvertiere auch via Batch in eine vorbestimmte Grösse - mit JPG natürlich noch einfacher
    Die Fotos bleiben in den erstellten Ordnern -
    Besonderes: entweder kann ein Unterordner erstellt werden, oder die Dateien überschrieben werden (was ich persönlich nicht schätze, da eine hochwertige Scandatei dann nur einmal Mühe bedeutet)
    Besser ist zuvor einen Ordner für die Winzilinge anzulegen und dann den Pfad anzugeben

    JPGs die zu Tiffs werden, sind Dateien mit falscher Erweiterung - jedenfalls kommt eine solche Meldung dann bei mir.


    eine one-klick-lösung ist es nicht, aber auch alte Leute können das lernen.
    ich lasse mich nicht spammen

    Comment


      #3
      Hallo Clara,

      vielen Dank für die Antwort; Sie hilft mir nur irgendwie nicht weiter. Ich würde schon gerne grob bei meiner Vorgensweise bleiben, da es eine "1-Klick-Lösung" ist nur hötte ich halt sie paar oben genannten offnene Puntke.

      Comment


        #4
        Hallo Thommy,

        ich formuliere deine Anforderung nochmal neu:
        Unter C:\scans liegen TIFF- und JPEG-Grafiken. Diese sollen auf Knopfdruck automatisch verkleinert und als JPEG (oder doch lieber TIFF?) nach O:\TF\Scan-Microfiche verschoben werden. Die von die gewünschte JPEG-Qualitätseinstellung ist 70.

        Folgende Punkte schlage ich vor, die zu beachten wären:
        a) kleine Dateien (kleinere Auflösung) nicht vergrößern, sollte zwar nicht vorkommen, aber wenn die Scan-Software schon so intelligent ist, um je nach Vorlage ein TIFF oder JPEG zu erzeugen, könnte bei einer fast leeren Seite so etwas vorkommen
        b) vorhandene Dateien nicht überschreiben
        c) Fehler prüfen (wenn IrfanView eine Datei nicht behandeln kann, dann soll das Original nicht gelöscht werden)
        d) doppelte Dateien: eine -1 an den Namen zu hängen, ist zwar kein Problem, kann aber auf Dauer zu "Bild7-1-1-1-1-1-1-1.jpg" führen. Man könnte natürlich auch versuchen, diese Zahl eifach solange zu erhögen, bis dann "Bild-37.jpg" paßt... alternativen gibt es auch genügen, z.B. das Datum anzuhängen...
        e) wie werden die Dateinamen unter C:\Scans generiert?

        Weiterhin:
        1) Was passiert mit dem Verzeichnis bzw. den Dateien in C:\Scans? Wenn dieses Verzeichnis nicht geleert wird, dann werden dort ja immer mehr Dateien nach D:\Trans kopiert und diese immer wieder konvertiert.
        2) Möchtet ihr die Original erst einmal wegsichern, um sie einfach nochmal durchschauen zu können? Ich meine, Plattenpaltz ist heute nicht mehr soo teuer, wenn ihr diese Bilder nicht als Original im Backup haben möchtet, kann ich das verstehen, aber evtl. solltet ihr die Original mal auf einer USB-Platte ablegen (es kommt natürlich auch auf die Größe der Originale an).
        3) Wenn die Namen der Quelldateien einem bestimmten Schema folgen, kann man z.B. beim Zielnamen ein C- voranstellen. Allerdings würde ich das so nicht machen. Eher die Original-Dateinamen behalten und vor dem Konvertieren prüfen, ob die Zieldatei mit diesem Namen noch nicht existiert.

        Zu deiner Frage: %%a wird bei einem FOR-Befehl in einer Skriptdatei verwendet, um dem ersten Wert der Variable a zuzuweisen. Diese Schleifenvariable muss in einem Skript mit einem doppelten Prozentzeichen angegeben werden.

        Wenn du die Punkte oben klären könntest, kann ich dir wahrscheinlich mit einem Skript helfen.

        Gruß
        Nils

        Comment


          #5
          Hi ,

          wow du hast ja mehr Fragen als ich ;-) Vielen vielen Dank für deine Zeit und Mühe

          OK :

          a) kleinere Auflösungen sollten nicht vorkommen. Falls eine kurze Überprüfiung problemlos einzubinden wäre; warum nicht.
          b) exakt
          c) nicht notwendig, da Originale ohnehin in C:\Scan als Original verbleiben.
          d) da ein Dateiname ( Zeichnungsnummern sind eindeutig) nur höchstens als jpg oder tif vorkommen kann, kann nur maximal einmal "-1" entstehen.
          e) Nein C:\Scan bleibt unberührt. Hier werdne auch die Originale weiterhin gespeichert. Anfangs werden die UNTERSCHIEDE nach D:\Trans kopiert und nur dort wird erstmal weiter gearbeitet.


          1) Ja C:\Scans wird weiter größer. Dies ist nicht tragisch. Der xcopy-Job kopiert nur Unterscheide, bzw in diesem Fall nur diejenigen Dateien, die der Mitarbeiter seit dem letzten Ausführen der Datei in C:\Scans abgelegt hat. Die Dateien auf C:\ bleiben quasi unberührt erhalten.
          2) Ja, am einfachsten wäre es sicherlich mit einer USB-Pflatte zu arbeiten und evtl auch die Daten einmal die Woche eben von Hand zu verkleinern. Aber aufgrund der Fehlertolanz ("1-Klick") wird eben auf die Lösung des Speichern im Netz bestanden. Wenn man davon ausgehen kann, dass der gute Mann die nächsten 4 Jahre nur Microfiche einscannt, wird Plattenspeicher irgendwann ein Thema.
          3)Der Originalname sollte möglichst erhalten bleiben. ("-1" ist glaubei ch schon fast zuviel ) . Der Dateiname ist eine eindeutig zuweisbare Zeichnungsnummer daher sollte er sich nicht grundlegend verändern.

          Ich hoffe das genügt dir um mir zu helfen.

          Vorab schonmal vielen Dank

          Comment


            #6
            Nun, der XCOPY-Befehl kopiert leider nicht die Unterschiede - er üeberschreibt keine neueren Dateien. Bei meinen Tests hier jedenfalls.
            Daher würde ich dir vorschlagen, das Ganze etwas anders anzugehen:
            Scannen weiterhin nach C:\Scans
            Konvertierung und Verkleinerung der TIF-Dateien aus diesem Ordner nach D:\Trans
            Wenn erfolgreich, die jeweilige TIF-Datei nach C:\ScansBackup verschieben.

            Verkleinerung der JPEG-Dateien aus C:\Scans nach D:\Trans
            Wenn erfolgreich, die jeweilige JPEG-Datei nach C:\ScansBackup verschieben.

            Es stellt sich jetzt noch die Frage, ob unter C:\Scans eine Verzeichnisstruktur aufgebaut wird.

            Was hältst du davon?

            Alternativ: man merkt sich, was schon bearbeitet wurde bzw. prüft das Ziel, und wenn die Quelldatei dort nicht liegt, dann erst bearbeiten...

            So, für die Alternative habe ich hier mal etwas, ich hoffe, ich habe es auch ausreichend dokumentiert:
            Code:
            @echo off
            rem **********************************************************************************
            rem * Zeichnungen unter C:\Scans verkleinern und nach O:\TF\Scan-Microfiche kopieren *
            rem **********************************************************************************
            setlocal ENABLEDELAYEDEXPANSION
            cls
            rem ************
            rem * Settings *
            rem ************
            
            rem Pfad fuer Irfan view
            rem Falls IrfanView im Standard-Programmverzeichnis installiert wurde, sollte dieser Teil brauchbar sein.
            rem Ist IrfanView jedoch woanders installiert, dann muss der Pfad dorthin manuell eingetragen werden.
            if /i "%PROCESSOR_ARCHITECTURE%" equ "AMD64" (
             rem Pfad zu IrfanView unter Windows x64
             set iview="%ProgramFiles(x86)%\IrfanView\i_view32.exe"
            ) else (
             rem Pfad zu IrfanView unter Windows x86
             set iview="%ProgramFiles%\IrfanView\i_view32.exe"
            )
            rem set iview="D:\tools\i_view32.exe"
            if not exist %iview% goto noIview
            
            rem Andere Tools
            set xcopy="%SystemRoot%\System32\xcopy.exe"
            set explorer="%SystemRoot%\explorer.exe"
            
            rem Scan-Verzeichnis, Originaldateien
            set ScanDir=C:\Scans
            
            rem Zielverzeichnis
            set DestDir=Z:
            
            rem Dateitypen
            set filetype1=*.tif
            set filetype2=*.jpg
            
            rem Breite
            set /a width=1600
            
            rem JPEG-Qualitaet
            set quality=70
            
            rem temporaere Datei fuer Bildinformationen
            set tmpfile="%temp%\imageinfo.txt"
            
            rem Protokoll
            set logfile="%DestDir%\Protokoll.log"
            
            rem Protokoll loeschen
            if exist %logfile% del %logfile%
            
            
            rem Jetzt gehts los
            echo Hiermit werden die Zeichnungen unter
            echo  %ScanDir%
            echo verkleinert und ins Netz nach
            echo  %DestDir%
            echo kopiert. Fortfahren?  j/n?
            set /p Start=
            if "%Start%"=="n" goto end
            
            rem Protokoll starten
            echo ---------------------------------------------- 1>>%logfile%
            echo %date% %time% - INFO: %0 gestartet 1>>%logfile%
            echo %date% %time% - INFO: Kopiere Dateien von "%ScanDir%" nach "%DestDir%": 1>>%logfile%
            
            rem Konvertierung von TIF nach JPG
            echo %date% %time% - INFO: Konvertierung und Verkleinerung TIF nach JPG: 1>>%logfile%
            echo Konvertierung und Verkleinerung TIF nach JPG  ...
            for /r "%ScanDir%" %%a in (%filetype1%) do call :Konvertiere "%%a"
            
            rem Verkleinerung
            echo %date% %time% - INFO: Verkleinerung der JPEG: 1>>%logfile%
            echo Verkleinerung der JPEG...
            for /r "%ScanDir%" %%a in (%filetype2%) do call :Konvertiere "%%a"
            
            start "Explorer" %explorer% /E,"%DestDir%"
            start "Protokoll" %logfile%
            
            rem Beenden
            echo %date% %time% - INFO: %0 beendet 1>>%logfile%
            goto end
            
            
            rem #################################################################################################
            rem IrfanView wurde nicht gefunden
            :noiview
            echo IrfanView wurde nicht im erwarteten Verzeichnis gefunden:
            echo   %iview%
            goto end
            
            rem Bild nach JPG umwandeln
            :Konvertiere
             set infile=%~1
             set infileext=%~x1
             
             rem Pfad und Dateiname, aber ohne Endung
             set outfile=%~dpn1
             set outfilepath=%~dp1
            
             rem Etwas tricky, aber es geht: hier wird jetzt das Scan-Verzeichnis durch das Zielverzeichnis im Pfad ersetzt
             call set outfile=%%outfile:%ScanDir%=%DestDir%%%.jpg
             call set outfilepath=%%outfilepath:%ScanDir%=%DestDir%%%
            
             rem Zielverzeichnis pruefen und evtl. erstellen
             if not exist "%outfilepath%" (
              echo %date% %time% - INFO:  Erstelle Verzeichnis "%outfilepath%" 1>>%logfile%
              md "%outfilepath%"
             )
             
             rem Pruefe, ob die Datei als .jpg im Zielverzeichnis existiert
             if exist "%outfile%" (
              echo %date% %time% - WARNUNG:  Datei existiert schon: %outfile% 1>>%logfile%
              echo Datei existiert schon: %outfile%
              goto :eof
             )
             
             rem Protokollierung
             echo %date% %time% - INFO:  Datei %infile% =^> %outfile% 1>>%logfile%
             echo Datei %infile% =^> %outfile%
            
             rem Breite ermitteln
             call :BreiteErmitteln "%infile%"
             echo %date% %time% - INFO:     Bildbreite: %imagewidth% Pixel 1>>%logfile%
             if %imagewidth% leq %width% (
              echo %date% %time% - WARNUNG:  keine Verkleinerung. 1>>%logfile%
              if /i "%infileext%" equ ".jpg" (
               echo %date% %time% - INFO:     Dateityp ist JPEG, sie wird nur kopiert. 1>>%logfile%
               copy "%infile%" "%outfile%"
              ) else (
                echo %date% %time% - INFO:     Dateityp ist TIF, Datei wird konvertiert. 1>>%logfile%
               start /wait "IView" %iview% "%infile%" /jpgq=%quality% /convert="%outfile%" [COLOR=#00007f]/silent[/COLOR]
               if !errorlevel! neq 0 (
                rem Fehler
                echo %date% %time% - ERROR:    Fehler bei der Konvertierung: !errorlevel! 1>>%logfile%
               )
              )
              echo %date% %time% - INFO: 1>>%logfile%
              goto :eof
             )
            
             rem Starte Konvertierung der TIF-Datei
             start /wait "IView" %iview% "%infile%" /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert="%outfile%" [COLOR=#00007f]/silent[/COLOR]
             if %errorlevel% neq 0 (
              rem Fehler
              echo %date% %time% - ERROR:  Fehler bei der Konvertierung: %errorlevel% 1>>%logfile%
              echo %date% %time% - INFO: 1>>%logfile%
              goto :eof
             )
            
             rem Kein Fehler
             echo %date% %time% - INFO:     Datei erfolgreich konvertiert. 1>>%logfile%
             echo %date% %time% - INFO: 1>>%logfile%
            goto :eof
            
            
            rem #################################################################################################
            rem Breite der angegebenen Bilddatei ermitteln
            :BreiteErmitteln
             start /wait "IView" %iview% "%~1" /info=%tmpfile%
             set imagewidth=0
             for /f "tokens=4 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do set /a imagewidth=%%b
             if exist %tmpfile% del %tmpfile%
            goto :eof
            
            rem Ende
            :end
            pause
            endlocal
            Es wird nur das Quellverzeichnis C:\Scans sowie das Zielverzeichnis Z: verwendet. Auf das Trans-Verzeichnis verzichte ich.
            Dateien, die im Zielverzeichnis vorhanden sind, werden nicht bearbeitet. Das ist aktuell etwas unschön für den Fall, dass es eine Datei mit gleichem Namen als TIF und als JPG gibt. Wenn das vorkommt, müsste man hier noch etwas anpassen.

            Es gibt ein paar Prüfungen:
            - gibt es das Zielverzeichnis schon? Die Verzeichnisstruktur von C:\Scans wird übernommen und im Ziel erstellt.
            - gibt es das Bild im Ziel schon? Dann überspringen
            - ist das Bild in der Quelle kleiner-gleich der vorgegebenen Breite? Wenn ja, dann den Dateityp noch berücksichtigen: JPG kopieren, TIF konvertieren

            Weiterhin wird alles protokolliert, aber das kannst du ja rausnehmen oder selbst anpassen.

            Gruß
            Nils
            Last edited by derniwi; 13.12.2012, 10:21 PM.

            Comment


              #7
              Hallo Nils,

              ich habe mir dein Werk am Wochenende mehrmals durchgelesen und auch wenn ich ehrlicherweise nicht alles verstanden habe hier in angepasster Form angewandt.


              Was soll ich sagen: Das Programm läuft grossartig.
              Es macht genau das, was ich seit länderem schon versuche hinzu bekommen ;-)

              Vielen lieben Dank für deine Zeit und Mühe.

              Sollte ich nachher noch kleinere Verständlisfragen haben, dürfte ich dich damit auch noch belästigen ? .. Naja aber erst einmal läufts ja .

              /bow Nils

              Comment


                #8
                Jetzt ist noch etwas erst nach einem Langzeitversuch aufgefallen:
                Die Batch bricht nach fast 10 Minuten und 2367 Dateien ab ( bei einem Gesamtvolumen von bisher 29.800 ) .

                Die Dos-Box verschwindet einfach, ohne jegliche Fehlermeldung.
                Das Log enthält auch keine Rückmeldung:
                Code:
                17.12.2012 15:09:30,95 - INFO:  Datei C:\Scans\104500-106999\ 01046693EANTRIEBSPLAN           .TIF => Z:\\104500-106999\ 01046693EANTRIEBSPLAN           .jpg 
                17.12.2012 15:09:31,12 - INFO:     Bildbreite: 9376 Pixel 
                17.12.2012 15:09:31,65 - INFO:     Datei erfolgreich konvertiert. 
                17.12.2012 15:09:31,66 - INFO:
                Hast du eine Idee, woran das liegen könnte ?


                EDIT:

                Auch nach mehrmaligem Starten bricht die Batch kommentarlos immer bei der 2367 bis 2373. Datei ab.

                Es wird also nur gemeldet :

                xxx existiert schon
                xxy existiert schon
                xxz existiert schon Ende. Zu neuen Konvertierungen kommt es nicht
                Last edited by Thommy81; 17.12.2012, 02:31 PM.

                Comment


                  #9
                  Du kannst am Anfang mal das "@echo off" auskommentieren und das Skript direkt aus einer DOS-Box starten. Evtl. kommt dann ein Fehler.

                  Ich könnte mir vorstellen, dass vielleicht ein Dateiname nicht richtig verarbeitet werden kann. Unter Windows kann man z.B. "Test(x).jpg" verwenden, unter DOS machen diese Klammern evtl. Ärger.

                  Weiterhin könnte es sein, dass der Speicher der DOS-Boxk für die for-Schleife zu klein ist.

                  Ersetze mal die for-Befehle wie folgt:
                  Code:
                  for /f "delims=" %%a in ('dir /s /b "%ScanDir%\%filetype1%"') do call :Konvertiere "%%a"
                  und
                  Code:
                  for /f "delims=" %%a in ('dir /s /b "%ScanDir%\%filetype2%"') do call :Konvertiere "%%a"
                  Evtl. hilft das etwas.

                  Comment


                    #10
                    das ersetzen der Zeilen ändert leider nichts, ausser dass der Job später anfängt.

                    Kann man in einer Batch wie sonst möglich das loglevel erhöhen, sodass evtl etwas im log auftaucht ?


                    Führe ich die Batch direkt in der DOS-Box aus , so bleibt die batch bei

                    "start /wait "IView" %iview% "%~1" /info=%tmpfile%"

                    stehn ;-(

                    Comment


                      #11
                      Nein, den Log-Level kann man hier kaum ändern. Das Protokoll wird ja mit den vielen
                      Code:
                      echo xxx 1>>%logfile%
                      erstellt.

                      Aber die Zeile, an der er hängen bleibt, liest eigentlich die Bilddaten aus der Datei aus.
                      Füge mal bitte noch ein
                      echo Ermittle Bildgröße: %~1
                      ein ud hänge mal an die IrfanView-Zeile noch ein /silent an:
                      Code:
                      :BreiteErmitteln
                      echo Ermittle Bildgröße: %~1
                      start /wait "IView" %iview% "%~1" /info=%tmpfile% /silent
                      Das "/silent" soll Fehlermeldungen bei der Batch-Verarbeitung verhindern. Und wenn es immer noch hängen bleibt, musst du dir mal das Bild anschauen, ob man da etwas erkennen kann.

                      Comment

                      Working...
                      X