follyx
Goto Top

Bilder in Ordner automatisch konvertieren. Ab Win 7

Wer kann mir sagen wie ich einen Ordner "beobachten" kann? Wir brauchen im Netz einen Ordner zum automatischen konvertieren von Bildern. Diese sollen nach Umwandlung in einen anderen Ordner gespeichert werden. Das Ganze soll automatische ablaufen. Also bei Speichern eines neuen Images in den Eingangsordner soll dieses automatisch konvertiert und eben wieder woanders im Netz abgespeichert werden.

Danke im Vorraus

Content-ID: 285033

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

Ausgedruckt am: 25.11.2024 um 12:11 Uhr

beidermachtvongreyscull
beidermachtvongreyscull 08.10.2015 um 16:12:07 Uhr
Goto Top
Du kannst es mit "Directory Monitor" versuchen oder auch mittels eines VB-Scripts.
Ich mache es mit VB-Script welches jede Minute einmal abgefeuert wird.
Snowman25
Snowman25 08.10.2015 um 16:33:31 Uhr
Goto Top
Hallo @Follyx,

da brauchst du schon einen Rechner, der immer dieses Verzeichnis beobachtet und alle neuen Dateien nach einer kurzen Wartezeit (Übertragunsdauer unbedingt beachten!) verschiebt und konvertiert.
Von was in was wollt ihr denn konvertieren?

Gruß,
@Snowman25
colinardo
Lösung colinardo 08.10.2015, aktualisiert am 31.12.2015 um 09:01:55 Uhr
Goto Top
Hallo zusammen,
es gibt zwar genug Tools dazu im Netz, aber wenn man es z.B. selber mit Bordmitteln machen möchte, reicht z.B. auch Powershell:

Beispielskript das einen Ordner auf neue Dateien des Typs "bmp|jpg|jpeg|gif|tif|tiff|png" via effizientem Filesystemwatcher überwacht und dann in einen Unterordner mit Namen converted als JPG ablegt.
Das ganze lässt sich natürlich flexibel anpassen oder auch ein anderes Tool wie etwa ImageMagick einbinden das mehr Formate unterstützt als nur die nativ von .NET unterstützen Formate.

Zur Info: Wer eine Funktion braucht die Bilder in der Größe anpasst, die habe ich hier auch schon als PS Skript zur Verfügung gestellt: Powershell: Bilder verkleinern oder an bestimmte Größe anpassen. Ließe sich also ebenfalls damit problemlos kombinieren...
# Ordner der zu überwachen ist
$folder = 'd:\bilder'  

function Convert-Image([string]$inPath,[string]$outPath,[System.Drawing.Imaging.ImageFormat]$format){
    Add-Type -AssemblyName System.Drawing
    try{
        if (Test-Path $inPath){
            $ext = [System.IO.Path]::GetExtension($inPath)
            if ($ext -match "bmp|jpg|jpeg|gif|tif|tiff|png"){  
                $img = [System.Drawing.Bitmap]::FromFile($inPath)
                if (!(Test-Path $outPath)){md ([IO.Path]::GetDirectoryName($outpath))}
                $newPath = $outPath; $cnt = 1
                while(Test-Path $newPath){
                    $newpath = [io.Path]::GetDirectoryName($outpath) + "\" + [io.Path]::GetFileNameWithoutExtension($outpath) + "(" + $cnt + ")" +  [io.Path]::GetExtension($outpath)  
                    $cnt++
                }
                $img.Save($newPath, $format)
                $img.Dispose()
                return $true
            }else{
                throw "Kein unterstütztes Format (bmp|jpg|jpeg|gif|tif|tiff|png)!"  
            }
        }
    }catch{
        return $_.Exception.Message
    }
}

# Unregister-Event wenn bereits registriert
Get-EventSubscriber -SourceIdentifier ImageWatcher -EA SilentlyContinue | Unregister-Event
# FS Watcher erstellen
$fsw = New-Object IO.FileSystemWatcher $folder,"*.*" -Property @{IncludeSubdirectories = $false;NotifyFilter = [IO.NotifyFilters]'FileName'}   

Register-ObjectEvent $fsw Created -SourceIdentifier ImageWatcher -Action { 
    $name = $Event.SourceEventArgs.Name
    $fullpath = $Event.SourceEventArgs.FullPath
    $timestamp = get-date $Event.TimeGenerated -Format 'g'  
    Write-Host "$timestamp : Konvertiere: '$fullpath' ... " -fore green -NoNewline  
    $result = Convert-Image -inPath $fullpath -outPath "$([IO.Path]::GetDirectoryName($fullpath))\converted\$([IO.Path]::GetFileNameWithoutExtension($name)).jpg" -format "jpeg"  
    if ($result -eq $true){
        write-host "OK" -fore Cyan  
    }else{
        write-host "$result" -fore Red  
    }
   # Original-Bild wieder löschen 
   Remove-Item $fullpath -Force
}
cls
write-host "Überwache '$folder' auf neue Dateien..." -ForegroundColor Green  

while($true){
    sleep(1)
}
HINWEIS: Im Beispiel werden nur Bilder konvertiert die nach dem Start des Skriptes im Ordner landen, bereits darin liegende Bilder werden nicht beachtet, ließe sich aber bei Bedarf nachrüsten.

Viel Spaß damit
Grüße Uwe

Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Follyx
Follyx 01.11.2015 um 09:32:38 Uhr
Goto Top
prima, klasse vielen Dank auch.
colinardo
colinardo 30.12.2015 aktualisiert um 20:00:43 Uhr
Goto Top
Wenns das dann war, den Beitrag bitte noch "dieses Jahr" auf gelöst setzen. Merci.

Guten Rutsch.