Announcement

Collapse
No announcement yet.

Multipage TIF auftrennen

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

    Solved Multipage TIF auftrennen

    Hallo.

    Ich möchte keine Konvertierung sondern nur ein Splitting eines Multipage TIF erstellen.
    Dabei sollte die Seitenzahl von-bis angeben werden können und die Ausgabe in eine neue TIF-Datei geleitet.

    Geht das bereits oder ist hierfür ein Feature-Request nötig ?
    vielen Dank für Tipps oder Batch

    Gruss
    Silvio

    #2
    Kein Tipp ?

    Comment


      #3
      Hallo,

      spontan fällt mir kein passender Parameter ein. Man müsste aktuell also erst einmal alle Seiten extrahieren und dann die gewünschten wieder zu einem TIF zusammenfügen.
      Geht bestimmt mit einem Skript. Aber dazu muß ich mir noch ein paar Gedanken machen.

      Gruß
      Nils

      Comment


        #4
        Hallo,

        Ich habe es in der Zwischenzeit fertiggebracht alle Seiten aus einem Multipage-TIFF zu extrahieren.
        Die geeigenten Optionen scheinen /extraxt und /multitif zu sein. /killmesoftly funktioniert aus irgend einem Grund nicht.
        Was ich hierbei nicht fertig gekriegt habe ist die LOOP-Schlaufe die mir die *_page_NNNN.tif durchzählt.

        ***
        @echo off
        set "srcFile=%cd%\%1%"
        set "tmpDir=%cd%\extract"
        set "dstDir=splitted"
        set "dstFile=%cd%\%dstDir%\%1%"
        echo source: %srcFile%
        echo tmpDir: %tmpDir%
        echo extracting all pages to: %dstDir%
        "C:\Program Files (x86)\IrfanView\i_view32.exe" %srcFile% /killmesoftly /extract=("%tmpDir%",tif)
        echo create Multipage TIFF with pages from %2 to %3
        md %dstDir%
        "C:\Program Files (x86)\IrfanView\i_view32.exe" /multitif=(%dstFile%,%tmpDir%\00001050.TIF_page_000 2.tif,%tmpDir%\00001050.TIF_page_0003.tif)
        pause
        ***

        Diese Batch wird mit 3 Parametern wie folgt aufgerufen :
        Syntax: "Lw:\...\Split-tiff_from-to.cmd" File.tif from-N to-N
        zB.: "C:\temp\Split-tiff_from-to.cmd" 00001050.TIF.tif 2 3

        Hat noch jemand eine Idee wie die LOOP-Schlaufe 4-Stellig gezählt werden kann ?

        Gruss
        Silvio

        Comment


          #5
          Hallo,

          Ich bin nochmals ein Schritt weitergekommen.
          Leider macht IV430 nicht das was es sollte.
          ***
          @echo off
          set "srcFile=%cd%\%1%"
          set "tmpDir=%cd%\extracted"
          set "dstDir=splitted"
          set "dstFile=%cd%\%dstDir%\%1%"
          echo source: %srcFile%
          echo tmpDir: %tmpDir%
          echo extracting pages to: %dstDir%
          "C:\Program Files (x86)\IrfanView\i_view32.exe" %srcFile% /killmesoftly /extract=("%tmpDir%",tif)
          echo create multipage tiff with pages from %2 to %3

          Setlocal Enabledelayedexpansion
          set /p fst= first page?
          set /p lst= last page?

          md %dstDir% >nul
          "C:\Program Files (x86)\IrfanView\i_view32.exe" /killmesoftly /multitif=(%dstFile%,%tmpDir%\00001050.TIF_page_%fs t%.tif)

          for /l %%N in (1000%fst:~3%, 1, 1000%lst:~3%) do (
          set n=%%N
          echo. adding page !n:~-4!
          "C:\Program Files (x86)\IrfanView\i_view32.exe" %dstFile% /killmesoftly /append=%tmpDir%\00001050.TIF_page_!n:~-4!.tif
          )
          pause
          ***

          Dieses Batch funktioniert nun grundsätzlich, ABER die Dateien aus dem \extracted werden nicht in dem splitted angehängt.
          Zudem kommt immer noch eine MessageBox mit OK. auch ohne /killmesoftly ist immer nur die erste Page im dstFile.
          Wo stolppert IV noch ?

          Gruss
          Silvio

          Comment


            #6
            Hallo Silvio,

            ich habe mal ein neues Skript basierend auf deiner Idee und deiner Vorlage erstellt. Man kann einfach ein TIF auf die Skriptdatei ziehen, dann wird diese in das Unterverzeichnis "_tmpDir" entpackt.

            Das TIF selbst wird dort reinkopiert und in "p.tif" umbenannt, somit habe ich einen recht kurzen Dateinamen und eine feste Basis für die extrahierten Seiten.

            Über die Zeilen
            Code:
            set lstn=0000%lst%
            set lstn=%lstn:~-4%
            wird eine vierstellige Zahl mit führenden Nullen in der Variablen "lstn" gespeichert. Also erst einmal vier Nullen, dann den Wert von "lst" anhängen. Und im nächsten Schritt nur die vier rechten Zeichen nehmen und erneut zuweisen. Das geht halt leider nicht als Einzeiler. Aber das hast du ja auch schon so ähnlich in Verwendung.

            Die Zeile "call :getNumPages" ruft einen Teil auf, der einfach von 0 bis 9999 durchzählt und prüft, ob die entsprechende Datei da ist. Ging bei mir relativ schnell, wenn das aber zu sehr bremst, kann man die Zeile rausnehmen / auskommentieren. Wichtig ist sie nicht, denn es wird nur zur Hilfe die Nummer der ersten (0) und der letzten (n-1) Seite angezeigt.

            Code:
            @echo off
            rem *****************************************************
            rem * IrfanView script for mulit page TIF file creation *
            rem *****************************************************
            rem This file creates a new multi page TIF file from a
            rem multi page TIF file where you enter a page range.
            setlocal ENABLEDELAYEDEXPANSION
            
            rem ************
            rem * Settings *
            rem ************
            
            rem Path to IrfanView
            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
            
            echo Create multi page tif file
            echo --------------------------
            
            rem Picture path variables
            set srcFile=%~1
            set tmpDir=%~d1%~p1_tmpdir
            echo Source file: %srcFile%
            echo Temporary directory: %tmpDir%
            
            rem If the temp. directory exist ask for deleting
            if exist "%tmpDir%" rd /s "%tmpDir%"
            
            rem Copy source file to temp directory for assuring a short file name
            if not exist "%tmpDir%" md "%tmpDir%"
            copy "%srcFile%" "%tmpDir%\p.tif" >nul
            
            rem Extracting images from TIF file
            echo Extracting pages to %tmpDir% ...
            start "IV: Extracting" /wait %iview% "%tmpDir%\p.tif" /extract=("%tmpDir%",tif) /silent /killmesoftly
            
            rem Get the number of files
            call :getNumPages
            if "%last%" equ "" goto nopages
            
            rem Ask for the first and last pages
            echo.
            echo First page number: %first%
            echo Last page number: %last%
            set /p fstdsp=First page? 
            set /p lstdsp=Last page? 
            
            rem Fix for different page number bases, in the frontend the first page starts with 1
            rem in the command line the extracted pages starts with 0.
            set /a fst=fstdsp - 1
            set /a lst=lstdsp - 1
            
            rem Create file name for destination TIF
            set fstn=0000%fst%
            set fstn=%fstn:~-4%
            set lstn=0000%lst%
            set lstn=%lstn:~-4%
            rem File name in format <source file name>_firstPage-lastPage.tif
            rem set dstFile=%~d1%~p1%~n1_%fstn%-%lstn%%~x1
            
            rem File name in format <source file name>_new.tif
            rem This allows to create a TIF with pages i.e. 0-3, 7-10, 350-354...
            set dstFile=%~d1%~p1%~n1_new%~x1
            
            rem Delete temporary TIF file
            if exist "%tmpDir%\p.tif" del "%tmpDir%\p.tif"
            
            rem Multi page TIF creation
            echo Create multipage tiff with pages from %fstdsp% to %lstdsp%
            for /l %%n in (%fst%, 1, %lst%) do call :append %%n
            
            rem Clean up
            call :cleanup
            
            rem After finishing go to the end
            goto end
            
            rem Get number of extracted pages
            :getNumPages
            echo Counting pages...
            if not exist "%tmpDir%\p_page_0000.tif" goto :eof
            set first=0
            set last=0000
            rem Max. 10000 pages are allowed due to file name definition
            for /l %%n in (0, 1, 9999) do (
             set lasttmp=0000%%n
             set laststmp=%%n
             set lasttmp=!lasttmp:~-4!
             if exist "%tmpDir%\p_page_!lasttmp!.tif" set last=!laststmp!
            )
            set /a first=first - 1
            set /a last=last - 1
            goto :eof
            
            rem Append images
            :append
            rem Create four digit appendix for file name
            set number=0000%1
            set number=%number:~-4%
            
            rem First check if the image file exists
            if exist "%tmpDir%\p_page_%number%.tif" (
             start "IV: Appending" /wait %iview% "%tmpDir%\p_page_%number%.tif" /tifc=6 /jpgq=75 /append="%dstFile%" /silent /killmesoftly
            ) else (
             echo ERROR: File "%tmpDir%\p_page_%number%.tif" not found!
            )
            goto :eof
            
            rem IrfanView could not be found.
            :noiview
            echo ERROR: IrfanView not found in the given path:
            echo   %iview%
            goto end
            
            rem There are no extracted files
            :nopages
            echo ERROR: no pages were extracted.
            call :cleanup
            goto :eof
            
            rem Clean up
            :cleanup
            rem Delete temporary TIF file
            if exist "%tmpDir%\p.tif" del "%tmpDir%\p.tif"
            
            rem Remove temporary directory
            if exist "%tmpDir%" rd /s "%tmpDir%"
            goto :eof
            
            rem End of the script
            :end
            pause
            endlocal
            Zu dem Problemen in deinem Skript:
            1. die Parameter müssen in einer bestimmen - leider nicht dokumentierten - Reihenfolge angegeben werden. Bei mir hat sich bewährt, die Parameter "/silent /killmesoftly" an das Ende der Zeile zu hängen, wenn ich sie brauche...
            2. Man muß kein /multitif verwenden, /append funktioniert auch prima, wenn die Zieldatei nicht existiert.
            3. for /l %%N in (1000%fst:~3%, 1, 1000%lst:~3%) do ... set n=%%N
            das kann man so machen, sollte dann aber nicht wieder "n" verwenden (Groß- Kleinschreibung ist bei Variablen egal), also lieber set m=%%N
            echo. adding page !m:~-4!
            4. du solltest IrfanView mit <start "Titel" /wait> aufrufen. Hierbei ist zu beachten, dass man einen Titel verwendet, weil hier die Reihenfolge nicht so eng gesehen wird:
            start /wait "c:\program files\irfanview\i_view32.exe" %datei%
            würde einfach nur den Titel setzen: "c:\program files\irfanview\i_view32.exe" und %datei% mit dem dafür vorgesehenen Standardprogramm öffnen.
            Und warum start /wait? Damit die Kommandozeile anhält, bis das Programm beendet ist. Nicht jedes Programm hält die Kommandozeile an...

            Hoffe, ich konnte dir helfen.

            Gruß
            Nils

            Edit: Fix für die unterschiedliche Nummerierung in Gui und Kommandozeile
            Last edited by derniwi; 06.09.2011, 10:40 AM. Reason: Fix für die unterschiedliche Nummerierung in Gui und Kommandozeile

            Comment


              #7
              Hallo Nils

              Bin wieder zurück aus dem Urlaub. Danke fürs ausführliche erklären.
              Ich werde das Batch mal so umsetzen und Feedbackgeben

              Danke

              Comment


                #8
                Funktioniert Suuuuuuuuuuuper bis auf eine Kleinigkeit.
                First beginnt bei 0 statt 1. In iView wird auch bei 1 und nicht bei 0 zu zählen begonnen.
                Irgendwo noch ein BASE=1 oder so einbauen ?
                Danke

                Comment


                  #9
                  Hallo,

                  so, die Änderung ist drinnen. Jetzt kannst du die Nummern so eingeben, wie man sie im IrfanView-Fenster sieht.

                  Gruß
                  Nils

                  Comment


                    #10
                    Vielen Dank
                    funktioniert bestens.
                    ... Thema geschlossen

                    Comment


                      #11
                      Hallo zusammen,

                      sry, dass ich diesen Thread aus der Versenkung hervorhole.
                      Aber der Skript von derniwi ist genau das was ich gesucht habe.
                      Zwar musste ich einige Anpassungen vornehmen, da ich die 64-Bit Version von IrfanView benutze und die Dateien mit 0001 statt mit 0000 anfangen, aber die Grundlogik des Skriptes funktioniert prima

                      Auf dieser Grundlage möchte ich eine zweite Abfrage einbauen:
                      Der Nutzer bekommt die Aufforderung "Dateiname?". Hier soll er festlegen, welchen Dateinamen die erzeugte Datei bekommen soll.
                      Daher habe ich in den Skript folgenden Code noch zwischen "File name in format <source file name>_new.tif" (die ich auf rem und somit außer Kraft gesetzt habe) und "Delete temporary TIF file" hinzugefügt:

                      echo.
                      set /p name=Dateiname?
                      set dstFile=%~d1%~p1%name%~x1

                      Allerdings erzeugt es bei mir keine Datei. Gibt es etwas, was ich noch beachten muss?

                      Vielen Dank!

                      €dith: folgende Änderung schaffte Abhilfe:

                      set dstFile=%~d1%~p1%name%%~x1



                      Dennoch vielen Dank!
                      Last edited by LordPiccolo; 03.02.2017, 01:51 PM.

                      Comment

                      Working...
                      X