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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 231589
Url: https://administrator.de/contentid/231589
Ausgedruckt am: 17.11.2024 um 23:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo Androxin,
sicher ist das möglich, mit ein bißchen VB.Net Code gekapselt in Powershell
Keine Zusatztools nötig !
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:
und hiermit lässt sich dann die DLL einbinden:
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 !
sicher ist das möglich, mit ein bißchen VB.Net Code gekapselt in Powershell
Keine Zusatztools nötig !
Powershell : 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()
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"
add-type -Path "C:\PfadzurDll\tiff.dll"
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 !
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.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?
Du solltest nach dem ausführen der Funktion ein
[GC]::Collect()
Grüße Uwe