Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Multi-Page Tiff mit Powershell erstellen

Frage Entwicklung Batch & Shell

Mitglied: Androxin

Androxin (Level 1) - Jetzt verbinden

04.03.2014, aktualisiert 05.03.2014, 3947 Aufrufe, 9 Kommentare, 2 Danke

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.
Mitglied: MrNetman
04.03.2014 um 10:53 Uhr
Nutze irfanview als Programm.
da kann man gut steuern.

Gruß
Netman
Bitte warten ..
Mitglied: Androxin
04.03.2014 um 10:57 Uhr
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?
Bitte warten ..
Mitglied: MrNetman
LÖSUNG 04.03.2014, aktualisiert um 11:12 Uhr
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 ...
Bitte warten ..
Mitglied: Androxin
04.03.2014 um 11:11 Uhr
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.
Bitte warten ..
Mitglied: colinardo
LÖSUNG 04.03.2014, aktualisiert 13.03.2014
Hallo Androxin,
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
01.
function initCode() { 
02.
    [String]$SourceCode = @" 
03.
Imports System 
04.
Imports System.Drawing 
05.
Imports System.Drawing.Imaging 
06.
Imports System.Text.RegularExpressions 
07.
Imports System.IO 
08.
 
09.
Namespace colinardo 
10.
Public Class tiff 
11.
    Public Shared Function mergeTiff(bitmaps() As String, outPath As String) As String 
12.
        Dim enc As Encoder = Encoder.SaveFlag 
13.
        Dim info As ImageCodecInfo = Nothing 
14.
        For Each ice As ImageCodecInfo In ImageCodecInfo.GetImageEncoders() 
15.
            If ice.MimeType = "image/tiff" Then 
16.
                info = ice 
17.
            End If 
18.
        Next 
19.
        Dim ep As EncoderParameters = New EncoderParameters(1) 
20.
        ep.Param(0) = New EncoderParameter(enc, EncoderValue.MultiFrame) 
21.
        Dim pages As System.Drawing.Bitmap = Nothing 
22.
        Dim regex As New Regex("bmp|jpg|jpeg|gif|tif|tiff|png", RegexOptions.IgnoreCase) 
23.
        For i As Integer = 0 To bitmaps.Length - 1 
24.
            If Not regex.IsMatch(Path.GetExtension(bitmaps(i).ToLower())) Then 
25.
                Return "Fehler! Ein Bild enthält ein ungültiges Format, erlaubte Formate sind bmp|jpg|jpeg|gif|tif|tiff|png" 
26.
            End If 
27.
        Next 
28.
        For i As Integer = 0 To bitmaps.Length - 1 
29.
            Try 
30.
                If i = 0 Then 
31.
                    pages = System.Drawing.Image.FromFile(bitmaps(i)) 
32.
                    pages.Save(outPath, info, ep) 
33.
                Else 
34.
                    Dim b As Bitmap = Image.FromFile(bitmaps(i)) 
35.
                    ep.Param(0) = New EncoderParameter(enc, EncoderValue.FrameDimensionPage) 
36.
                    pages.SaveAdd(b, ep) 
37.
                    b.Dispose() 
38.
                End If 
39.
                If i = bitmaps.Length - 1 Then 
40.
                    ep.Param(0) = New EncoderParameter(enc, EncoderValue.Flush) 
41.
                    pages.SaveAdd(ep) 
42.
                    pages.Dispose() 
43.
                End If 
44.
            Catch ex As Exception 
45.
                Return "Fehler : " & ex.Message 
46.
            End Try 
47.
        Next 
48.
        Return "OK" 
49.
    End Function 
50.
End Class 
51.
End Namespace 
52.
"@ 
53.
 add-type -TypeDefinition $SourceCode -Language VisualBasic -ReferencedAssemblies System.Drawing 
54.
55.
initCode 
56.
$images = @("D:\Bild1.tiff", "D:\Bild2.tiff", "D:\Bild3.tiff") 
57.
$mergeImage ="D:\merge.tif" 
58.
[colinardo.tiff]::mergeTiff($images,$mergeImage) 
59.
# garbage collection starten / Resourcen freigeben 
60.
[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:
01.
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 !
Bitte warten ..
Mitglied: Androxin
05.03.2014, aktualisiert um 07:48 Uhr
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
Bitte warten ..
Mitglied: Androxin
13.03.2014, aktualisiert um 10:48 Uhr
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?
Bitte warten ..
Mitglied: colinardo
LÖSUNG 13.03.2014, aktualisiert um 12:00 Uhr
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
Bitte warten ..
Mitglied: Androxin
13.03.2014 um 12:01 Uhr
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!
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
Mehrere AD Benutzer aus CSV Datei mit PowerShell erstellen (1)

Frage von windelterrorist zum Thema Batch & Shell ...

Batch & Shell
gelöst CSR erstellen via Powershell ? (4)

Frage von chaos2go zum Thema Batch & Shell ...

Batch & Shell
Eigener Update Dienst erstellen ? mittels Powershell (13)

Frage von today12 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mit PowerShell per CSV-File Ordner erstellen (19)

Frage von windelterrorist zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (22)

Frage von M.Marz zum Thema Windows Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...