Zum Inhalt springen

Batch Skript zur automatischen Komprimierung von JPG Dateien?


Empfohlene Beiträge

Geschrieben

 

Hallo zusammen,

ich plane, ein Batch-Skript zu erstellen, das täglich auf unserem Fileserver ausgeführt werden soll.

Das Ziel des Skripts ist es, jede JPG-Datei zu komprimieren, die an dem Tag auf dem Fileserver abgelegt wurde. Bereits komprimierte Dateien sollen übersprungen werden.

 

Ich bin schon mit dem Programm IrfanView am testen, aber so richtig funktioniert es nicht. Die bereits komprimierten Dateien werden immer wieder komprimiert, aber leider nicht übersprungen. 

 

Habt ihr eine Idee wie so ein Skript aussehen könnte?

Danke und Gruß

 

Geschrieben (bearbeitet)

Dazu müsste IrFan die EXIF Daten herausgeben und die passenden Tags müssen analysiert werden.
Oder das Skript versucht ohne IrFan an die Tags zu kommen und dann zu entscheiden.

Bearbeitet von hellerKopf
Geschrieben

Wäre das hier ungefähr was du suchst?

https://administrator.de/knowledge/powershell-bilder-verkleinern-oder-an-bestimmte-groesse-anpassen-268427.html

Damit könntest du alle Bilder auf dem Filer auf ein bestimmtes Maximalformat zusammen stutzen. Bilder die klein genug sind werden übersprungen und mit LastWriteTime könntest du noch nach Datum filtern.

Ich würde aber vorher sehr genau abklären, ob das Verkleinern der Bilder auch wirklich i.O. ist. ggf. liegen da auch Bilder die absichtlich in verschwenderischer Größe abgelegt wurden, entweder vom Marketing (weil für Print, Kataloge...) oder - schlimmer - von der QS Abteilung zur Dokumentation von Reklamationen o.Ä.

Also Fragen, schriftlich absichern, Backup ziehen, verkleinern und nach max 3 Monaten Bilder aus dem Backup zurückholen (so meine Erfahrung damit).

Geschrieben

Ich lese hier was von Komprimieren. Das in Verbindung mit JPEG Dateien. JPEG ist ja schon ein Komprimierungsformat. Was soll das also grundsätzlich bringen??

Geschrieben

Ich habe das Problem so verstanden, dass das Skript bereits einmal komprimierte Dateien überspringen soll, damit die BIlder nicht kontinuierlich unschärfer werden.

Aber ohne mehr Details, oder Teile des Skripts vom TE kommen wir da sowieso nicht weiter.

Geschrieben
vor 36 Minuten schrieb fi23:

Ich lese hier was von Komprimieren. Das in Verbindung mit JPEG Dateien. JPEG ist ja schon ein Komprimierungsformat. Was soll das also grundsätzlich bringen??

Dateigröße wird kleiner

Geschrieben
vor 12 Minuten schrieb lorqnz:

Dateigröße wird kleiner

Du kannst eine bereits komprimierte Datei nicht weiter komprimieren. Ausnahme: Verlustbehaftete Kompressionsverfahren, wie bei JPGs verwendet. Das bedeutet aber im Umkehrschluss, die Qualität der Bildinhalte wird auf jeden Fall verschlechtert.

Es hängt also vom Ausgangsmaterial ab, ob Du damit wirklich ein nennenswertes Ergebnis erzielen kannst, dass noch brauchbar ist. In der Regel ist es so, das die Änderung der Bildmaße, bzw. der Auflösung mehr bringt, als eine weitere verlustbehaftete Kompression.

Um Dir also wirklich eine qualifizierte Antwort geben zu können, musst Du mit mehr Infos rausrücken. Was ist die Ausgangslage und was ist das Ziel? Dabei ist: "Ich habe Bilder die kleiner werden sollen" keine Info, die weiterhilft. Wie groß sind die Bilder im Moment von der Datenmenge her? Welche Auflösung haben sie? Wofür werden sie in Zukunft noch benötigt? Wieviel Speicherplatz soll eingespart werden, damit sich der Aufwand überhaupt lohnt? Usw.

Um einem Bild anzusehen, ob es bereits einmal den Vorgang durchlaufen hat, kannst Du entweder das Datum der letzten Änderung verwenden oder Du tagst bearbeitete Bilder entsprechend. Taggen kannst Du entweder über IPTC oder die Manipulation der Exif Daten. https://www.pixpa.com/de/blog/photo-metadata

Geschrieben
vor 16 Stunden schrieb ZwennL:

Du kannst eine bereits komprimierte Datei nicht weiter komprimieren. Ausnahme: Verlustbehaftete Kompressionsverfahren, wie bei JPGs verwendet. Das bedeutet aber im Umkehrschluss, die Qualität der Bildinhalte wird auf jeden Fall verschlechtert.

Es hängt also vom Ausgangsmaterial ab, ob Du damit wirklich ein nennenswertes Ergebnis erzielen kannst, dass noch brauchbar ist. In der Regel ist es so, das die Änderung der Bildmaße, bzw. der Auflösung mehr bringt, als eine weitere verlustbehaftete Kompression.

Um Dir also wirklich eine qualifizierte Antwort geben zu können, musst Du mit mehr Infos rausrücken. Was ist die Ausgangslage und was ist das Ziel? Dabei ist: "Ich habe Bilder die kleiner werden sollen" keine Info, die weiterhilft. Wie groß sind die Bilder im Moment von der Datenmenge her? Welche Auflösung haben sie? Wofür werden sie in Zukunft noch benötigt? Wieviel Speicherplatz soll eingespart werden, damit sich der Aufwand überhaupt lohnt? Usw.

Um einem Bild anzusehen, ob es bereits einmal den Vorgang durchlaufen hat, kannst Du entweder das Datum der letzten Änderung verwenden oder Du tagst bearbeitete Bilder entsprechend. Taggen kannst Du entweder über IPTC oder die Manipulation der Exif Daten. https://www.pixpa.com/de/blog/photo-metadata

Danke erstmal für deine Antwort.

Mit IrfanView lassen sich Dateien erheblich verkleinern. Selbst bei JPG-Bildern wird die Größe um bis zu 80% reduziert, ohne erkennbaren Qualitätsverlust. Die Bilder sind zwischen 5-15 MB groß. Auf dem Fileserver sind alle JPG Dateien zusammen bestimmt 5TB groß. Wenn man einmalig alle komprimiert und dann täglich das Skript für die neuen Bilder ausführt, spart man erheblich an Speicherplatz. Die Bilder sollen am selben Ort bleiben, nur die Dateigröße soll verringert werden. Als Test habe ich einen Ordner vom Fileserver kopiert und mit IrfanView die Bilder komprimiert. Dadurch konnte ich die Ordnergröße von 90 GB auf 50 GB reduzieren. Das von mir erstellte Skript sieht folgendermaßen aus:


for /r "ZIELPFAD" %%i in (*.jpg) do (
    "C:\Program Files\IrfanView\i_view64.exe" "%%i" /resample /convert="%%i"
)

 

 

Ich müsste nur noch wissen, wie man dieses Skript umwandelt. Es sollen wie gesagt nur die neusten Bilder komprimiert werden und nicht alle bereits komprimierten nochmal.

Geschrieben (bearbeitet)

Das ist ein nettes Thema hier.
Aber es gibt viele Ansätze um das Problem zu meistern.
Mal abgesehen von den Wünschen des TE, und wer antwortet hier schon exakt auf die Frage?

1. Irfan dazu kriegen, schon mal komprimierte Bilder neu zu komprimieren.
2. Skript so ausgestalten, dass es Dateien, die schon bearbeitet wurden, ignoriert.

3. Organisatorische Maßnahmen

zu 1: Irfan Doku lesen, kann die Software das? Wenn ja, mit welchem Schalter?
zu 2: Im Skript anhand eines eindeutigen Merkmals bestimmen, ob die Datei behandelt werden soll oder nicht
zu 3: Am einfachsten, schon mal komprimierte Bilder in ein anderes Verzeichnis verschieben

Empfehlenswert ist eine Kombi aus 2 und 3.

 

# Set the path to the IrfanView executable
$irfanViewPath = "C:\Path\To\IrfanView\i_view64.exe"

# Set the input and output folders
$inputFolder = "InputFolder"
$outputFolder = "OutputFolder"

# Ensure the output folder exists, create it if not
if (-not (Test-Path -Path $outputFolder -PathType Container)) {
    New-Item -Path $outputFolder -ItemType Directory
}

# Get a list of all JPEG files in the input folder
$jpegFiles = Get-ChildItem -Path $inputFolder -Filter *.jpg

# Loop through each JPEG file
foreach ($file in $jpegFiles) {
    $outputFilePath = Join-Path -Path $outputFolder -ChildPath $file.Name
    
    # Check if the file already exists in the output folder
    if (-not (Test-Path -Path $outputFilePath -PathType Leaf)) {
        # File doesn't exist in the output folder, so it hasn't been converted
        Write-Host "Converting $($file.Name)"
        & $irfanViewPath /convert="$($file.FullName)" /resample /tifc=1 /q=80 /convertto=jpg /jpgq=85 /o /c
    }
    else {
        # File already exists in the output folder, skip conversion
        Write-Host "$($file.Name) already converted, skipping."
    }
}

created with Default (GPT-3.5), not tested

 

Bearbeitet von hellerKopf
Geschrieben
vor 49 Minuten schrieb allesweg:

Einmal schreibst du 80% Reduktion, dann sind es nur 50%.

Ja bei einzelnen Bildern kann es bis zu 80% Reduktion geben, aber der Durchschnitt ist 50%?🤨

Was hat das denn mit damit zu tun? Es geht doch hauptsächlich darum, dass ich die Bildgröße verringern will, ob's jetzt 80% sind oder 50..

vor 51 Minuten schrieb allesweg:

Wozu werden diese Bilder fachlich benötigt? Es gibt da nämlich eine Option, noch mehr Speicherplatz zu sparen!

Zur Schadensanalyse von Getrieben.

Geschrieben
vor 20 Minuten schrieb hellerKopf:

Das ist ein nettes Thema hier.
Aber es gibt viele Ansätze um das Problem zu meistern.
Mal abgesehen von den Wünschen des TE, und wer antwortet hier schon exakt auf die Frage?

1. Irfan dazu kriegen, schon mal komprimierte Bilder neu zu komprimieren.
2. Skript so ausgestalten, dass es Dateien, die schon bearbeitet wurden, ignoriert.

3. Organisatorische Maßnahmen

zu 1: Irfan Doku lesen, kann die Software das? Wenn ja, mit welchem Schalter?
zu 2: Im Skript anhand eines eindeutigen Merkmals bestimmen, ob die Datei behandelt werden soll oder nicht
zu 3: Am einfachsten, schon mal komprimierte Bilder in ein anderes Verzeichnis verschieben

Ja Irfan kann das. Ich muss wirklich nur wissen, wie das Skript aussehen müsste, damit es die komprimierten Bilder überspringt. Dann wäre mir schon geholfen. 

Geschrieben
vor 5 Stunden schrieb hellerKopf:

Lieber lorqnz
ich habe genau 1:30 gebraucht, um das oben stehende Skript zu ermitteln.
Du kannst es jetzt testen und beurteilen. Wäre nett, wenn wir erfahren, ob es was taugt.

Hallo nochmal,

habe alles soweit eingetragen, aber beim ausführen bekomme ich die Meldung: Error! Can't load "

 

Idee? 

 

 

# Set the path to the IrfanView executable
$irfanViewPath = "C:\Program Files\IrfanView\i_view64.exe"

# Set the input and output folders
$inputFolder = "C:\Users\user\Desktop\Test"
$outputFolder = "C:\Users\user\Desktop\Test2"

# Ensure the output folder exists, create it if not
if (-not (Test-Path -Path $outputFolder -PathType Container)) {
    New-Item -Path $outputFolder -ItemType Directory
}

# Get a list of all JPEG files in the input folder
$jpegFiles = Get-ChildItem -Path $inputFolder -Filter *.jpg

# Loop through each JPEG file
foreach ($file in $jpegFiles) {
    $outputFilePath = Join-Path -Path $outputFolder -ChildPath $file.Name
    
    # Check if the file already exists in the output folder
    if (-not (Test-Path -Path $outputFilePath -PathType Leaf)) {
        # File doesn't exist in the output folder, so it hasn't been converted
        Write-Host "Converting $($file.Name)"
        & $irfanViewPath /convert="$($file.FullName)" /resample /tifc=1 /q=80 /convertto=jpg /jpgq=85 /o /c
    }
    else {
        # File already exists in the output folder, skip conversion
        Write-Host "$($file.Name) already converted, skipping."
    }
}

 

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...