hushpuppies
Goto Top

Gesucht: Programm zum automatischen Verkleinern von Bildern anhand bestimmter Kriterien

Hallo zusammen!

Erstmal hoffe ich, dass ich die richtige Kategorie für das Thema erwischt habe face-smile

Folgendes Problem:
Ich würde gern ein Laufwerk von einem Tool durchsuchen lassen, welches dann die gefundenen Bilder automatisch nach gewissen Kriterien bearbeitet.
Als Beispiel:
Wenn Bild xyz grösser ist als 1,5MB und die Auflösung größer als 1920x1080, dann verkleinere das Bild proportional auf 1920x1080 (oder der nächstmöglichen Größe bei der das Bild proportional bleibt).

Händisch geht das auf Grund der Menge und der komplexen Ordnerstruktur nicht oder nur mit *sehr* viel Aufwand, deshalb suche ich da eine Möglichkeit das möglichst automatisch zu erledigen.


Weiß da jemand zufällig Rat?

Content-Key: 255849

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

Printed on: April 19, 2024 at 16:04 o'clock

Mitglied: 114757
114757 Nov 25, 2014 updated at 15:48:33 (UTC)
Goto Top
Einfacher Task mit
den ImageMagick Tools face-wink
http://www.imagemagick.org/Usage/resize/

Gruß jodel32
Member: Roadrunner0815
Roadrunner0815 Nov 25, 2014 at 18:23:23 (UTC)
Goto Top
Ich glaube es gibt für Irwanview ein entsprechendes Plugin.
Member: Criemo
Criemo Nov 25, 2014 at 19:07:41 (UTC)
Goto Top
Hi,
Picasa kann das auch face-wink

VG
Criemo
Member: colinardo
colinardo Nov 25, 2014 updated at 22:22:58 (UTC)
Goto Top
Oder man nimmt nur die Powershell face-smile
(gibt jpeg-Bilder aus)
function Resize-Image(){
param(
    [parameter(mandatory=$true)][string]$imgPath,
    [string]$saveAs,
    [parameter(mandatory=$true)][int]$size,
    [ValidateRange(0,100)][int]$quality = 100
)
    Add-Type -AssemblyName System.Drawing
    
    if (!$saveAs){$saveAs = $imgPath}

    $ext = [System.IO.Path]::GetExtension($imgPath)
    if ($ext -match "bmp|jpg|jpeg|gif|tif|tiff|png"){  
        $img = [System.Drawing.Bitmap]::FromFile($imgPath)

        $percentWidth = [float]$size / [float]$img.Width
        $percentHeight = [float]$size / [float]$img.Height
        $percent = 1
        if ($percentHeight -lt $percentWidth){
            $percent = $percentHeight
        }else{
            $percent = $percentWidth
        }
        [int32]$newWidth = [int32]$img.Width * $percent
        [int32]$newHeight = [int32]$img.Height * $percent

        [System.Drawing.Image]$newImage = New-Object System.Drawing.Bitmap $newWidth,$newHeight
        [System.Drawing.Graphics]$graphics = [System.Drawing.Graphics]::FromImage($newImage)
        $graphics.InterpolationMode = [System.Drawing.Drawing2D.InterpolationMode]::HighQualityBicubic
        $graphics.Drawimage($img,0,0,$newWidth,$newHeight)
        $img.Dispose()

        # JPG Qalität festlegen
        [System.Drawing.Imaging.ImageCodecInfo]$jpgEncoder = [System.Drawing.Imaging.ImageCodecInfo]::GetImageDecoders() | ?{$_.FormatID -eq [System.Drawing.Imaging.ImageFormat]::jpeg.GUID} | select -First 1
        $myEncoder = [System.Drawing.Imaging.Encoder]::Quality
        $encoderParams = new-object System.Drawing.Imaging.EncoderParameters(1)
        $encoderParam = new-object System.Drawing.Imaging.EncoderParameter($myEncoder,85)
        $encoderParams.Param = $encoderParam
        # --------------------
        # Bild speichern
        $newImage.Save($saveAs,$jpgEncoder,$encoderParams)
        $newImage.Dispose()
    }
    
}
function Get-ImageSize(){
    param(
        [parameter(mandatory=$true)][string]$imgPath
    )
    Add-Type -AssemblyName System.Drawing
    $img = [System.Drawing.Bitmap]::FromFile($imgPath)
    $w = $img.Width; $h = $img.Height
    $img.Dispose()
    return @($w,$h)
}

# Ordner festlegen
$ordner = "E:\Bilder"  

$maxSize = 1920

# Dateien nach Kriterien filtern und in der Größe anpassen und speichern
dir $ordner -Filter *.jpg -recurse | %{
    $s = Get-ImageSize $_.Fullname
    if (($s -gt $maxSize -or $s[1] -gt $maxsize) -and $_.Length -gt 1.5MB){
        write-host "Verkleinere Bild '$($_.Fullname)'" -ForegroundColor Green  
        Resize-Image $_.Fullname -size $maxSize
    }
}
Grüße Uwe
Member: hushpuppies
hushpuppies Nov 27, 2014 at 18:32:35 (UTC)
Goto Top
Vielen Dank für die Tipps.

Ich versuche mal morgen umzusetzen - der Ansatz mit der PowerShell sieht sehr nett und flexibel aus, auch der Tipp mit ImageMagick klingt gut.

IrfanView hab ich schon probiert, das Problem dort ist, dass man nur ein Ausgabeverzeichnis wählen kann und es keine Option a la "schreib es wieder dorthin, wo es ursprünglich lag" gibt. Sprich man müsste sich durch alle Ordner hangeln und Ordner für Ordner konvertieren - bei gut 4.000 oder eher knapp 5.000 Ordner eher nicht so doll face-smile
Member: hushpuppies
hushpuppies May 07, 2015 at 06:54:32 (UTC)
Goto Top
Ich würde gern diese Frage nochmal vorkramen.
Ich habe mich mit den vorgeschlagenen Methoden beschäftigt, musste aber feststellen, dass mir da einfach die programmiertechnischen Grundlagen fehlen um das auf meinen Anwendungsfall anzupassen.

Daher nochmal die Frage, ob jemand ein "fertiges" Programm kennt, welches in der Lage ist sich rekursiv durch Ordner zu wühlen, Bilder einzulesen und anhand von einfachen Kriterien wie Größe oder Maße ggf. zu verkleinern und an der selben Stelle wieder abzuspeichern.

Es darf auch gerne etwas kosten auch wenn mir ein open source oder freeware Programm natürlich lieber wäre face-smile