Page 3 of 4 FirstFirst 1 2 3 4 LastLast
Results 21 to 30 of 37

Thread: Über Kommandozeile Bilder in unterschiedlichen Ordnern verkleinern

  1. #21

    Default

    Hallo Nils,
    toll! Vielen Dank. Ich werds heute Abend ausprobieren.
    Könntest du mir vielleicht die Zeilen "for..." und ":resize..." etwas erklären, damit ich auch mal verstehen kann was da im einzelnen passiert? Die Irfan-Hilfe bringt mich hier bei meinem "Wissesdurst" nicht wirklich weiter. :-(
    Vielen herzlichen Dank nochmal und auch schon mal im Voraus
    Liebe Grüße
    Claudi

  2. #22

    Default

    Hallo zusammen,

    ich habe mir dieses Thema im Forum intensiv durchgelesen, weil ich hoffe, dass es mich meinem Ziel näher bringt. Allerdings gebe ich zu anscheinend nicht genug von der Batchprogrammierung zu verstehen!

    :was ist das Ziel?
    ==================
    Mein Ziel ist mein komplettes Fotoarchiv, das auf d:\bilder\digitalkamera\'unterordner'\ liegt, auf meinem Samsung Galaxy S2 Smartphone synchron zu haben. Aus Platzgründen sollen die Fotos allerdings nicht in voller Auflösung, sondern verkleinert dort landen.
    Ich weiß, es gibt Picasa web alben + Apps für Android usw., aber ich möchte gerne selbst den Daumen darauf haben und dies steuern.

    :wie ist der Plan?
    ==================
    Schritt 1: Die Fotos werden per regelmäßig per Windows Aufgabenplanung verkleinert (lange Seite 800px) und mit der kompletten Unterordnerstruktur in d:\bilder\digitalkamera-lq\'unterordner'\ und der Namensergänzung "-LQ".jpg gespeichert.

    Schritt 2: Mein lieblings Schweizer Synchronisationsallzweckwerkzeug "AllwaySync pro" synchronisiert diesen Ordner dann auf meinen HiDrive cloud Account.

    Schritt 3: Mein Smartphone synchronisiert diesen Ordner von HiDrive per App zeitgesteuert auf seine microSD-Karte. Somit steht die Fotosammlung relativ aktuell auch immer auf dem Smartpphone zur Verfügung.

    :was kann ich schon?
    ====================
    Schritt 2 und Schritt 3 :-). Das mache ich mit einer Reihe von PDF Dateien bereits.

    :was kann ich noch nicht?
    =========================
    Schritt 1! Und genau hier suche ich eure Hilfe, um eine Batchdatei zu erstellen, die mit IrfanView genau diese Aufgabe erledigt.

    Kann jemand helfen?


    Viele Grüße
    Jan

  3. #23
    Moderator
    Join Date
    Aug 2007
    Location
    Germany
    Posts
    855
    Version
    IrfanView 4.51
    OS
    64-bit Win 10
    CPU Cores
    8

    Default

    Hallo Jan,

    wenn du nicht noch ein paar Tage geduldest, kann ich mir das anschauen. Ein großes Problem sollte das nicht sein.

    Gruß
    Nisl

  4. #24

    Default

    Hallo Nils,

    alles klar! Vielen Dank. Ich bin schon ganz gespannt.

    Gruß,
    Jan

  5. #25
    Moderator
    Join Date
    Aug 2007
    Location
    Germany
    Posts
    855
    Version
    IrfanView 4.51
    OS
    64-bit Win 10
    CPU Cores
    8

    Default

    Hi,

    ich habe noch ein paar Fragen:
    a) sollen die Dateien immer neu verkleinert werden? Das wäre ja nicht unbedingt notwendig. Wenn die Zieldatei bereits existiert, kann man die überspringen. Problematisch wird es nur, wenn du die Bilder bearbeitest. Das Dateidatum mitzuverwalten ist ungleich mehr aufwand.
    b) wie sieht es mit Löschungen aus? Wenn aus d:\bilder\digitalkamera\'unterordner'\ Bilder gelöscht werden, wie löschst du die entsprechenden aus d:\bilder\digitalkamera-lq\'unterordner'\ ? Könnte man auch über ein Skript machen, was aber nichts mehr mit IrfanView zu tun hat.

    Hier ist schon mal eine Version, die funktionieren sollte. In der Annahme, dass bestehende Dateien nicht erneut verkleinert werden und Löschungen oder Umbenennungen in der Quelle manuell im Ziel durchgeführt werden. ;-)

    Code:
    @echo off
    rem ********************
    rem * BatchResize2.cmd *
    rem ********************
    rem This script will convert all the JPGs in the source directory and save
    rem them into the destination directory. Existing pictures won't be changed.
    rem If an image is small enough to not be converted it is just copied.
    
    rem Drag and drop a folder or folder structure to this script and IrfanView will
    rem resize all pictures of the given file type to the given pixel size. Smaller
    rem pictures will not be touched.
    rem Also the jpeg quality could be set.
    cls
    setlocal
    
    rem Path to Irfan view
    if /i "%PROCESSOR_ARCHITECTURE%" equ "AMD64" (
     rem Path to IrfanView on x64 Windows
     set iview="%ProgramFiles(x86)%\IrfanView\i_view32.exe"
    ) else (
     rem Path to IrfanView on x86 Windows
     set iview="%ProgramFiles%\IrfanView\i_view32.exe"
    )
    if not exist %iview% goto noIview
    
    rem *********************************************
    rem * You may change the variables in this part *
    rem *********************************************
    rem Source directory
    set source=d:\bilder\digitalkamera
    
    rem Destination directory
    set dest=d:\bilder\digitalkamera-lq
    
    rem File name extension
    set ext=-LQ
    
    rem File type
    set filetype=*.jpg
    
    rem Maximum size of the long side
    set /a length=800
    
    rem JPEG quality
    set quality=75
    
    rem *********************************************
    rem * End of Changes                            *
    rem *********************************************
    
    rem Temporary file
    set tmpfile="%temp%\imageinfo.txt"
    
    rem Count lengths
    call :strlen sourcelen source
    call :strlen destlen dest
    
    echo Converting...
    for /r "%source%" %%a in (%filetype%) do call :Resize "%%a" "%%~dpa" "%%~na" "%%~xa"
    
    echo.
    echo Finished converting.
    
    rem After finishing go to the end
    goto end
    
    
    rem IrfanView could not be found.
    :noiview
    echo IrfanView not found in the given path:
    echo   %iview%
    goto end
    
    :resize
    setlocal EnableDelayedExpansion
    echo.
    echo Checking file "%~1"
    set sourcedir=%~2
    set filename=%~3
    set fileext=%~4
    
    rem Cut of the base source directory from the path
    set sd=!sourcedir:~%sourcelen%!
    
    rem if the file is already converted, skip
    if exist "%dest%%sd%%filename%%ext%%fileext%" (
     echo File
     echo  "%dest%%sd%%filename%%ext%%fileext%"
     echo exists. Skipping.
     goto resizeend
    )
    
    rem Check destination directory
    if not exist "%dest%%sd%" md "%dest%%sd%"
    
    rem Get the image dimensions of the source file
    start /wait "IrfanView" %iview% %1 /info=%tmpfile%
    set /a imagewidth=0
    for /f "tokens=4,6 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do (set /a imagewidth=%%b) & (set /a imageheight=%%c)
    
    rem Check which is the longer side
    if %imagewidth% lss %imageheight% set /a imagewidth=%imageheight%
    
    rem Check if the image has to be converted
    if %imagewidth% gtr %length% (
     echo Resizing file "%~1"
     start /wait "IView" %iview% "%~1" /resize_long=%length% /aspectratio /resample /jpgq=%quality% /convert="%dest%%sd%%filename%%ext%%fileext%"
    ) else (
     copy "%~1" "%dest%%sd%%filename%%ext%%fileext%"
    )
    
    :resizeend
    endlocal
    goto :eof
    
    
    rem Count string length
    rem Source: http://stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file
    :strlen <resultVar> <stringVar>
    (   
     setlocal EnableDelayedExpansion
     set "s=!%~2!#"
     set "len=0"
     for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
      if "!s:~%%P,1!" NEQ "" ( 
       set /a "len+=%%P"
       set "s=!s:~%%P!"
      )
     )
    )
    ( 
     endlocal
     set "%~1=%len%"
     exit /b
    )
    
    rem End of the script
    :end
    if exist %tmpfile% del %tmpfile%
    endlocal

    Gruß
    Nils
    Last edited by derniwi; 09.08.2012 at 04:51 PM.

  6. #26

    Default

    Hallo Nils,

    wow! Vielen Dank für die ausführliche Antwort. Deine Annahme zu a) ist sehr richtig. Bereits existierende Dateien können natürlich übersprungen werden. Zu b) wäre eine Automatisierung natürlich super, aber ich werde erst einmal das Skript ausprobieren :-).


    Gruß,
    Jan

    == Nachtrag 14.08.2012 - 20:31 ==

    Hallo Nils,

    ich bin echt platt. Habe das Skript in die xyz.CMD Datei kopiert und nach einem kurzen Test mit einem Dummy Verzeichnis möchte ich 'vielen Dank' sagen. Das Skript macht genau(!) das was ich möchte. Lob und Anerkennung für Deine Hilfe :-).

    Nach dem kurzen Dummy Test konvertiert nun das Skript das echte Verzeichnis. Und wird wohl noch ein bisschen dafür brauchen ;-).

    Einzig bleibt noch die Frage wie im Zielverzeichnis ein(e) im Quellverzeichnis gelöschte Datei/gelöschter Ordner wieder entfernt werden kann. Über einen Tipp in welcher Ecke des Skriptinguniversums das zu finden ist, bin ich dankbar.


    Viele Grüße
    Jan
    Last edited by between_everything; 14.08.2012 at 06:38 PM.

  7. #27

    Default

    Hallo,

    ich habe auch mal eine Frage dazu,

    Die Bilder konnte ich reibungslos verkleinern, allerdings wird ja das geänderte Datum dadurch leider geändert.

    Gibt es eine Lösung die dieses Datum vor der Änderung auffängt und danach wieder zurückschreibt?

    Des weiteren wäre noch interessant wie man Unterordner auschließen kann.

    zB. C:\Bilder

    mit Unterordnern

    Fotos
    Bilder
    Groß
    .
    .
    .


    ausgeschlossen werden soll z.B. der Ordner Groß

    Vielen Dank schonmal vorraus für die Hilfe

    matzeer

    Achso das Script hab ich fast vergessen:

    @echo off
    cls
    setlocal

    set Datum=%date%
    echo Start_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
    echo INFO: hier werden nur Dateien aufgeführt die konvertiert wurden! >> "C:\Kit\Bilder_%Datum%.log"

    rem Pfad fuer IrfanView
    set iview="%ProgramFiles(X86)%\IrfanView\i_view32.exe"

    rem Quellverzeichnis
    set quelle=c:\bilder

    rem Dateityp
    set filetype=*.jpg;*.jpeg

    rem Breite
    set width=2048

    rem JPEG-Qualitaet
    set quality=100

    rem temporaere Datei
    set tmpfile="%temp%\imageinfo.txt"

    if not exist %iview% goto noIview
    if "%quelle%"=="" goto fehler

    echo Bilder Konvertierung laueft . . .
    for /r "%quelle%" %%a in (%filetype%) do call :check_size "%%a"

    echo.
    echo Konvertierung abgeschlossen.
    goto end

    :fehler
    echo Kein Pfad angegeben!
    goto end

    :noiview
    echo IrfanView wurde nicht im angegebenen Pfad gefunden: %iview%
    goto end

    :check_size
    echo Datei %1
    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 %imagewidth% gtr %width% goto resize %1
    goto :eof

    :resize
    echo %1 >> "C:\Kit\Bilder_%Datum%.log"
    start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert=%1
    goto :eof

    :end
    if exist %tmpfile% del %tmpfile%

    echo Ende_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
    pause
    endlocal
    Last edited by matzeer; 10.08.2012 at 12:45 PM.

  8. #28
    Moderator
    Join Date
    Aug 2007
    Location
    Germany
    Posts
    855
    Version
    IrfanView 4.51
    OS
    64-bit Win 10
    CPU Cores
    8

    Default

    Hi,

    ändere mal die Zeile
    Code:
     start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /convert=%1
    in
    Code:
     start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /ini=%inidir% /advancedbatch /convert=%1
    Am Anfang fügst du noch ein
    Code:
    set inidir=C:\Bilder_ini
    ein und erstellst ein Verzeichnis
    C:\Bilder_ini
    Darin legst du eine Datei i_view32.ini mit folgendem Inhalt an:
    Code:
    [Batch]
    AdvSaveOldDate=1
    Das sollte das Problem mit dem Dateidatum beheben., sieht dann also so aus:
    Code:
    @echo off
    cls
    setlocal
    
    set Datum=%date%
    echo Start_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
    echo INFO: hier werden nur Dateien aufgeführt die konvertiert wurden! >> "C:\Kit\Bilder_%Datum%.log"
    
    rem Pfad fuer IrfanView
    set iview="%ProgramFiles(X86)%\IrfanView\i_view32.exe"
    
    rem Quellverzeichnis
    set quelle=c:\bilder
    
    rem Verzeichnis der Ini-Datei
    set inidir=C:\Bilder_ini
    
    rem Dateityp
    set filetype=*.jpg;*.jpeg
    
    rem Breite
    set width=2048
    
    rem JPEG-Qualitaet
    set quality=100
    
    rem temporaere Datei
    set tmpfile="%temp%\imageinfo.txt"
    
    if not exist %iview% goto noIview
    if "%quelle%"=="" goto fehler
    
    echo Bilder Konvertierung laueft . . .
    for /r "%quelle%" %%a in (%filetype%) do call :check_size "%%a"
    
    echo.
    echo Konvertierung abgeschlossen.
    goto end
    
    :fehler
    echo Kein Pfad angegeben!
    goto end
    
    :noiview
    echo IrfanView wurde nicht im angegebenen Pfad gefunden: %iview%
    goto end
    
    :check_size
    echo Datei %1
    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 %imagewidth% gtr %width% goto resize %1
    goto :eof
    
    :resize
    echo %1 >> "C:\Kit\Bilder_%Datum%.log"
    start /wait "IView" %iview% %1 /resize_long=%width% /aspectratio /resample /jpgq=%quality% /ini=%inidir% /advancedbatch /convert=%1
    goto :eof
    
    :end
    if exist %tmpfile% del %tmpfile%
    
    echo Ende_Konvertierung_%date%_%time:~0,2%-%time:~3,2%-%time:~6,2% >> "C:\Kit\Bilder_%Datum%.log"
    pause
    endlocal
    Das Problem mit dem Ausschluss von Verzeichnissen würde auch gehen, da muß ich aber nochmal an mein Skript ran.

    Edit:
    Hier meine Version mit Ausschluß von Verzeichnisses:
    Code:
    @echo off
    rem ********************
    rem * BatchResize2.cmd *
    rem ********************
    rem This script will convert all the JPGs in the source directory and save
    rem them into the destination directory. Existing pictures won't be changed.
    rem If an image is small enough to not be converted it is just copied.
    
    rem Drag and drop a folder or folder structure to this script and IrfanView will
    rem resize all pictures of the given file type to the given pixel size. Smaller
    rem pictures will not be touched.
    rem Also the jpeg quality could be set.
    cls
    setlocal
    
    rem Path to Irfan view
    if /i "%PROCESSOR_ARCHITECTURE%" equ "AMD64" (
     rem Path to IrfanView on x64 Windows
     set iview="%ProgramFiles(x86)%\IrfanView\i_view32.exe"
    ) else (
     rem Path to IrfanView on x86 Windows
     set iview="%ProgramFiles%\IrfanView\i_view32.exe"
    )
    if not exist %iview% goto noIview
    
    rem *********************************************
    rem * You may change the variables in this part *
    rem *********************************************
    rem Source directory
    set source=d:\bilder\digitalkamera
    
    rem Destination directory
    set dest=d:\bilder\digitalkamera-lq
    
    rem Exclude directories
    set exclude=d:\bilder\digitalkamera\exclude.txt
    set excludesub=d:\bilder\digitalkamera\excludesub.txt
    
    rem ini-directory
    set inidir=d:\bilder\digitalkamera\iviewini
    
    rem File name extension
    set ext=-LQ
    
    rem File type
    set filetype=*.jpg
    
    rem Maximum size of the long side
    set /a length=800
    
    rem JPEG quality
    set quality=75
    
    rem *********************************************
    rem * End of Changes                            *
    rem *********************************************
    
    rem Temporary file
    set tmpfile="%temp%\imageinfo.txt"
    
    rem Count lengths
    call :strlen sourcelen source
    call :strlen destlen dest
    
    echo Converting...
    for /r "%source%" %%a in (%filetype%) do call :Resize "%%a" "%%~dpa" "%%~na" "%%~xa"
    
    echo.
    echo Finished converting.
    
    rem After finishing go to the end
    goto end
    
    
    rem IrfanView could not be found.
    :noiview
    echo IrfanView not found in the given path:
    echo   %iview%
    goto end
    
    :resize
    setlocal EnableDelayedExpansion
    echo.
    echo Checking file "%~1"
    set sourcedir=%~2
    set filename=%~3
    set fileext=%~4
    
    rem Cut of the base source directory from the path
    set sd=!sourcedir:~%sourcelen%!
    
    rem Exclude exactly named directories
    if exist "%exclude%" (
     type "%exclude%" | find.exe /i "#%ds%#"
     if !errorlevel! equ 0 goto resizeend
    )
    
    rem Exclude directories and sub directories
    if exist "%excludesub%" (
     type "%excludesub%" | find.exe /i "#%ds%"
     if !errorlevel! equ 0 goto resizeend
    )
    
    rem if the file is already converted, skip
    if exist "%dest%%sd%%filename%%ext%%fileext%" (
     echo File
     echo  "%dest%%sd%%filename%%ext%%fileext%"
     echo exists. Skipping.
     goto resizeend
    )
    
    rem Check destination directory
    if not exist "%dest%%sd%" md "%dest%%sd%"
    
    rem Get the image dimensions of the source file
    start /wait "IrfanView" %iview% %1 /info=%tmpfile%
    set /a imagewidth=0
    for /f "tokens=4,6 delims= " %%b in ('type %tmpfile% ^| find /i "image dimensions"') do (set /a imagewidth=%%b) & (set /a imageheight=%%c)
    
    rem Check which is the longer side
    if %imagewidth% lss %imageheight% set /a imagewidth=%imageheight%
    
    rem Check if the image has to be converted
    if %imagewidth% gtr %length% (
     echo Resizing file "%~1"
     start /wait "IView" %iview% "%~1" /resize_long=%length% /aspectratio /resample /jpgq=%quality% /ini=%inidir% /advancedbatch /convert="%dest%%sd%%filename%%ext%%fileext%"
    ) else (
     copy "%~1" "%dest%%sd%%filename%%ext%%fileext%"
    )
    
    :resizeend
    endlocal
    goto :eof
    
    
    rem Count string length
    rem Source: http://stackoverflow.com/questions/5837418/how-do-you-get-the-string-length-in-a-batch-file
    :strlen <resultVar> <stringVar>
    (   
     setlocal EnableDelayedExpansion
     set "s=!%~2!#"
     set "len=0"
     for %%P in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
      if "!s:~%%P,1!" NEQ "" ( 
       set /a "len+=%%P"
       set "s=!s:~%%P!"
      )
     )
    )
    ( 
     endlocal
     set "%~1=%len%"
     exit /b
    )
    
    rem End of the script
    :end
    if exist %tmpfile% del %tmpfile%
    endlocal
    In deinem Bilderverzeichnis legst du zwei Dateien an:
    d:\bilder\digitalkamera\exclude.txt
    d:\bilder\digitalkamera\excludesub.txt

    In der Datei exclude.txt kommen die Verzeichnisse rein, die ausgeschlossen werden. Dabei solltest du folgendes Format verwenden:
    #\verzeichnis1\verzeichnis2\#

    Die "#" am Anfang und am Ende brauche ich, damit gleiche Verzeichnisnamen in verschiedenen Unterverzeichnissen vorkommen dürfen. "verzeichnis1" startet relativ zum Bilderverzeichnis, also
    d:\bilder\digitalkamera\verzeichnis1\verzeichnis2\

    Damit kannst du dann relativ einfach das Skript ändern, wenn du das Basisverzeichnis umbenennst.

    Die zweite Datei, excludesub.txt, ist ähnlich aufgebaut, nur fehlt am Ende jedes Eintrags das "#". Damit werden dann auch Unterverzeichnisse nicht berücksichtigt.

    Getestet habe ich das aber aktuell nicht.

    Gruß
    Nils
    Last edited by derniwi; 10.08.2012 at 07:54 PM. Reason: Ausschluss von Verzeichnissen

  9. #29

    Default

    Hallo Nils,

    ich habe Dein Skript nun im vollen Einsatz. Wie oben schon gesagt macht es genau das was ich möchte. Allerdings kommt bei bei 0,01% der Bilder eine Popup Meldung von IrfanView hoch, die besagt "d:\bilder\digitalkamera\20xx\xyz.jpg : kann Dateiheader nicht lesen. Unbekanntes Dateiformat oder kann Datei existiert nicht." Wenn ich den Batchlauf abbreche, kann ich die Datei ganz normal mit IrfanView mir anzeigen lassen.

    Was unterbindet diesen Fehler oder wie kann ich den zumindest automatisch übergehen?


    Gruß,
    Jan

  10. #30
    Moderator
    Join Date
    Aug 2007
    Location
    Germany
    Posts
    855
    Version
    IrfanView 4.51
    OS
    64-bit Win 10
    CPU Cores
    8

    Default

    Hallo Jan,

    das ist eine gute Frage.
    Was passiert, wenn du das Skript mehrfach laufen läßt? Hat es dann immer bei den gleichen Dateien dieses Problem?

    Hänge mal an die Zeile zur Umwandlung noch ein /slient an. Evtl. hilft dir das, damit das Skript nicht stehen bleibt.
    Ich schaue mal, ob ich da noch eine Fehlerabfrage reinkriege und ob ich noch eine Protokolldatei erzeugen kann.

    Gruß
    Nils

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Tags for this Thread

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •