androxin
Goto Top

Multi-Page Tiff mit Powershell erstellen

Guten Tag,

ich möchte mittels eines Powershell Skripts (v2) aus mehreren TIFF Dateien eine Multi-Page Tiff erzeugen und bin momentan ein wenig ratlos wie ich das anstellen soll.
Gibt es dafür ein unter Windows lauffähiges Framework, welches die Aufgabe übernehmen kann? Oder kann das die PS schon direkt?

Mit besten Grüßen
Androxin


PS: PS Version, Bilddateityp, Betriebssystem sind fix. Ein Wechsel auf PDF, Linux o.Ä. ist nicht möglich.

Content-ID: 231589

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

Ausgedruckt am: 17.11.2024 um 23:11 Uhr

MrNetman
MrNetman 04.03.2014 um 10:53:42 Uhr
Goto Top
Nutze irfanview als Programm.
da kann man gut steuern.

Gruß
Netman
Androxin
Androxin 04.03.2014 um 10:57:35 Uhr
Goto Top
Zitat von @MrNetman:

Nutze irfanview als Programm.
da kann man gut steuern.

Gibt irfanview das zusammenfügen von TIFFs denn her, wenn es über die PS aufgerufen wird?
MrNetman
Lösung MrNetman 04.03.2014 aktualisiert um 11:12:12 Uhr
Goto Top
Ich habe das noch nicht gemacht, aber bislang sind alle Funktionen des Programms auch von der Commandozeile nutzbar gewesen.
Multipage TIFFs kann es.
Optionen - Mehrseitige Bilder - Multipage TIF erzeugen ...
oder
Optionen - Mehrseitige Bilder - aktuelles Bild an TIF anhängen ...
Androxin
Androxin 04.03.2014 um 11:11:14 Uhr
Goto Top
Zitat von @MrNetman:

Ich habe das noch nicht gemacht, aber bislang sind alle Funktionen des Programms auch von der Commandozeile nutzbar gewesen.
Multipage TIFFs kann es.
Optionen - Merhseitige Bilder - Multipage TIF erzeugen ...
oder
Optionen - Merhseitige Bilder - aktuelles Bild an TIF anhängen ...

Klasse. Vielen Dank für die Information.
colinardo
Lösung colinardo 04.03.2014, aktualisiert am 13.03.2014 um 11:40:00 Uhr
Goto Top
Hallo Androxin,
sicher ist das möglich, mit ein bißchen VB.Net Code gekapselt in Powershell face-wink
Keine Zusatztools nötig !
back-to-topPowershell : Bilder zu einem MultiPage-Tiff zusammenfügen
function initCode() {
    [String]$SourceCode = @"  
Imports System
Imports System.Drawing
Imports System.Drawing.Imaging
Imports System.Text.RegularExpressions
Imports System.IO

Namespace colinardo
Public Class tiff
    Public Shared Function mergeTiff(bitmaps() As String, outPath As String) As String
        Dim enc As Encoder = Encoder.SaveFlag
        Dim info As ImageCodecInfo = Nothing
        For Each ice As ImageCodecInfo In ImageCodecInfo.GetImageEncoders()
            If ice.MimeType = "image/tiff" Then  
                info = ice
            End If
        Next
        Dim ep As EncoderParameters = New EncoderParameters(1)
        ep.Param(0) = New EncoderParameter(enc, EncoderValue.MultiFrame)
        Dim pages As System.Drawing.Bitmap = Nothing
        Dim regex As New Regex("bmp|jpg|jpeg|gif|tif|tiff|png", RegexOptions.IgnoreCase)  
        For i As Integer = 0 To bitmaps.Length - 1
            If Not regex.IsMatch(Path.GetExtension(bitmaps(i).ToLower())) Then
                Return "Fehler! Ein Bild enthält ein ungültiges Format, erlaubte Formate sind bmp|jpg|jpeg|gif|tif|tiff|png"  
            End If
        Next
        For i As Integer = 0 To bitmaps.Length - 1
            Try
                If i = 0 Then
                    pages = System.Drawing.Image.FromFile(bitmaps(i))
                    pages.Save(outPath, info, ep)
                Else
                    Dim b As Bitmap = Image.FromFile(bitmaps(i))
                    ep.Param(0) = New EncoderParameter(enc, EncoderValue.FrameDimensionPage)
                    pages.SaveAdd(b, ep)
                    b.Dispose()
                End If
                If i = bitmaps.Length - 1 Then
                    ep.Param(0) = New EncoderParameter(enc, EncoderValue.Flush)
                    pages.SaveAdd(ep)
                    pages.Dispose()
                End If
            Catch ex As Exception
                Return "Fehler : " & ex.Message  
            End Try
        Next
        Return "OK"  
    End Function
End Class
End Namespace
"@  
 add-type -TypeDefinition $SourceCode -Language VisualBasic -ReferencedAssemblies System.Drawing
}
initCode
$images = @("D:\Bild1.tiff", "D:\Bild2.tiff", "D:\Bild3.tiff")  
$mergeImage ="D:\merge.tif"  
[colinardo.tiff]::mergeTiff($images,$mergeImage)
# garbage collection starten / Resourcen freigeben
[GC]::Collect()
In Zeile 54 übergibst du deine Bilder die du zusammenfügen möchtest in einem Array und und in Zeile 55 gibst du den Pfad zum zusammengesetzten Bild an.

Das ganze lässt sich auch zu einer DLL compilieren damit man es nachher mit weniger Code-Zeilen nutzen kann:
add-type -TypeDefinition $SourceCode -Language VisualBasic -ReferencedAssemblies System.Drawing -OutputType Library -OutputAssembly "C:\PfadzurDll\tiff.dll"
und hiermit lässt sich dann die DLL einbinden:
add-type -Path "C:\PfadzurDll\tiff.dll"  
dann steht einem der Namespace und die Funktion zur Verfügung [colinardo.tiff]::mergeTiff()

Grüße Uwe

p.s. Ich würde im Titel des Beitrags noch das PS in Powershell ändern. Andere Nutzer könnten das fälschlicherweise als PhotoShop interpretieren !
Androxin
Androxin 05.03.2014 aktualisiert um 07:48:09 Uhr
Goto Top
Hallo colinardo,

vielen Dank für dein code snippet. Ich hätte nicht gedacht, dass das Erstellen einer Bilddatei mit der Shell so simpel ist. Der Code funktioniert wunderbar.

Mit besten Grüßen
Androxin
Androxin 13.03.2014 aktualisiert um 10:48:23 Uhr
Goto Top
Velen Dank noch einmal für das kleine Programm.

Beim weiteren Programmieren in der Shell bin ich noch auf ein kleines, aber feines, Problem(chen) gestoßen.

Nach dem Mergen der Dateien sollen die Quelldateien umbenannt/gelöscht werden.
An dieser Stelle tritt scheinbar ein Timingproblem auf.
Die Bilddateien können teilweise nicht umbenannt werden, weil die Ressource noch verwendet wird.

Leider kenne ich mich in der VB Programmierung nicht gut genug aus um das Problem aus dem Stand beheben zu können.
Gibt es eine Möglichkeit die Bilddateien direkt wieder frei zu geben oder kann man der Shell sagen, dass sie erst umbenennen soll, wenn der Merge-Teil komplett fertig ist?
colinardo
Lösung colinardo 13.03.2014 aktualisiert um 12:00:09 Uhr
Goto Top
Zitat von @Androxin:
Gibt es eine Möglichkeit die Bilddateien direkt wieder frei zu geben oder kann man der Shell sagen, dass sie erst umbenennen
soll, wenn der Merge-Teil komplett fertig ist?
Danke für die Info, habe ich gerade nachvollziehen können. Der Code ist oben angepasst.
Du solltest nach dem ausführen der Funktion ein
[GC]::Collect()
ausführen damit eventuell noch offene Resourcen in der PS freigegeben werden. Danach solltest du die Bilder löschen oder umbenennen können.

Grüße Uwe
Androxin
Androxin 13.03.2014 um 12:01:38 Uhr
Goto Top
Zitat von @colinardo:

Danke für die Info, habe ich gerade nachvollziehen können. Der Code ist oben angepasst.
Du solltest nach dem ausführen der Funktion ein
[GC]::Collect()
ausführen damit eventuell noch offene Resourcen in der PS freigegeben werden. Danach solltest du die Bilder löschen oder
umbenennen können.

Klasse! Das hat das Problem lösen können. Vielen Dank!