Python-Script für Bildkonvertierung und Metadatenbereinigung

Liebe Mitgrowerinnen und Mitgrower,

hier findet Ihr ein Python-Script, das Bilder von JPG/JPEG in PNG konvertiert, sie verkleinert und die sämtliche Metadaten löscht.

Das Programm ist nicht destruktiv (löscht und verändert die Originalbilder nicht).

Da ich das geschrieben habe, gebe ich hiermit bekannt, dass dieses Python-Script zum Public Domain gehört. Jeder kann es einsetzen, verändern und weitergeben.

Um das Script zum Laufen zu bringen, kopiert es einfach heraus in ein Texteditor und speichert Ihr als PY-Datei (zum Beispiel Bildverarbeiter.py).

Viel Spaß damit.

################################################################################
# Das ist ein Programm, das JPG/JPEG-Bilddateien verkleinert und ohne seine    #
# Metadaten im PNG-Format abspeichert.                                         #
#                                                                              #
# Geschrieben wurde es von einem Kiffer, um Bilder zu bearbeiten, bevor diese  #
# auf das Forum von cannabisanbauen.net hochgeladen werden.                    #
#                                                                              #
# Um es zu starten, braucht Ihr Python auf Eurem Rechner zu installieren und   #
# das Bibiothek PIL (pillow) herunterzuladen.                                  #
#                                                                              #
# Da der Autor verständlicher Weise anonym bleiben möchte, gibt es keinerlei   #
# Garantie oder Gewährleistung oder wie auch immer zu diesem Code.             #
#                                                                              #
# Der Einsatz dieses Programmes erfolg auf eigener Gefahr.                     #
################################################################################



# Die entsprechende Module werden importiert
# ------------------------------------------------------------------------------
# BEGIN
import os
import tempfile

from os import listdir
from os.path import isfile, join

from PIL import Image
from PIL import ExifTags
from PIL.ExifTags import TAGS

from pathlib import Path
# ENDE
# ------------------------------------------------------------------------------



# Konfiguration bzw. Parameter
# ------------------------------------------------------------------------------
# BEGIN

# Hier den Pfad zum Verzeichnis, wo sich das Rohbilder befinden, eingeben
QUELLVERZEICHNIS = "D:\\Bearbeitung\\Bilder\\Quelle"

# Hier den Pfad zum Zielverzeichnis, wo die bearbeiteten Bildern gespechert werden sollen, eingeben
ZIELVERZEICHNIS = "D:\\Bearbeitung\\Bilder\\Ziel"

# Hier den Verkleinerungsfaktor eigeben
FAKTOR = 0.3

#ENDE
# ------------------------------------------------------------------------------


# Diese Funktion zeigt an Dimensionen und Metadaten eines Bildes
# ------------------------------------------------------------------------------
# BEGIN
def ZeigeBilddaten(bild):
    print(" 1. Dimensionen")
    print("    Höhe: ", bild.height, ", Breite: ", bild.width)
    print()
    
    print(" 2. Metadaten")
    metadaten = bild.getexif()
    metadatenSucher = {i.value: i.name for i in ExifTags.IFD}
    for name, wert in metadaten.items():
        if name in metadatenSucher:
            ifd_name = metadatenSucher[name]
            ifd_wert = metadaten.get_ifd(name).items()
            for sub_schluessel, sub_wert in ifd_wert:
                sub_name = ExifTags.GPSTAGS.get(sub_schluessel, None) or ExifTags.TAGS.get(sub_schluessel, None) or sub_schluessel
                print(f"    {sub_name}: {sub_wert}")
        else:
            print(f"    {ExifTags.TAGS.get(name)}: {wert}")

    print()
#ENDE
# ------------------------------------------------------------------------------



# Diese Funktion verkleinert ein Bild
# ------------------------------------------------------------------------------
# BEGIN
def BildVerkleinern(bild):
    hoehe, breite = bild.size
    dimensionen = int(FAKTOR * hoehe), int(FAKTOR * breite)
    print(" 3. Das bild wird auf ", dimensionen, "verkleinert")
    print()
    verkleinertesBild = bild.resize(dimensionen, Image.LANCZOS)
    return verkleinertesBild
#ENDE
# ------------------------------------------------------------------------------



# Diese Funktion erstellt eine Kopie des Bildes, ohne die Metadaten daraus zu
# übernehmen.
# ------------------------------------------------------------------------------
# BEGIN
def BildBereinigen(bild):
    print(" 4. Alle Metadaten werden entfernt")
    print()
    bildDaten = list(bild.getdata())
    bereinigtesBild = Image.new(bild.mode, bild.size)
    bereinigtesBild.putdata(bildDaten)
    return bereinigtesBild
#ENDE
# ------------------------------------------------------------------------------



# Das ist der Hauptteil des Programms. Hier startet die Ausführung.
# ------------------------------------------------------------------------------

# Die Begrüßung wird angezeigt
print("********************************************************************************")
print("*                 WILKOMMEN ZUM BILDKONVERTER UND BEREINIGER                   *")
print("*                                  version 0.1                                 *")
print("********************************************************************************")
print()

# Quell- und Zielverzeichnis werden angezeigt
print("Quellverzeichnis ................ ", QUELLVERZEICHNIS)
print("Zielverzeichnis ................. ", ZIELVERZEICHNIS)
print()

# Sämtliche JPG/JPEG-Dateien aus dem Quellverzeichnis werden aufgelistet
quellDateien = []
quellDateien += [each for each in os.listdir(QUELLVERZEICHNIS) if (each.upper().endswith('.JPG') or each.upper().endswith(".JPEG"))]

# Wenn mindestens eine Datei gefunden wurde, wird die Liste abgearbeitet
if(len(quellDateien) > 0):
    quellGroesse = 0
    print("Es wurden ", len(quellDateien), " JPG/JPEG Datei(en) im Quellverzeichnis gefunden")
    print()
    print("+++++++++++++++++++++++++++++++ KONVERTIERUNG ++++++++++++++++++++++++++++++++++")
    print()
    for quellDatei in quellDateien:
        quellDateiname = QUELLVERZEICHNIS + "\\" + quellDatei
        quellGroesse += os.path.getsize(quellDateiname)
        print("--------------------------------------------------------------------------------")
        print("Die Datei ", quellDatei, " wird bearbeitet.")
        print("--------------------------------------------------------------------------------")
        bild = Image.open(quellDateiname)
        ZeigeBilddaten(bild)
        verkleinertesBild = BildVerkleinern(bild)
        bereinigtesBild = BildBereinigen(verkleinertesBild)
        zielDatei = Path(quellDatei).stem
        zeilDateiname = ZIELVERZEICHNIS + "\\" + zielDatei + ".png"
        print(" 5. Das Bild wird im PNG-Format gespeichert.")
        bereinigtesBild=bereinigtesBild.rotate(270, expand=True)
        bereinigtesBild.save(zeilDateiname, dpi=(96, 96))
        
    print()
    print("Insgesamt", len(quellDateien), "Datei(en) mit einer Gesammtgröße von", quellGroesse, " Bytes wurden konvertiert.")
    print("--------------------------------------------------------------------------------")
    print()
    print("++++++++++++++++++++++++++++++++ GEGENPROBE ++++++++++++++++++++++++++++++++++++")
    print()
    zielDateien = []
    zielDateien += [each for each in os.listdir(ZIELVERZEICHNIS) if each.upper().endswith('.PNG')]
    if(len(quellDateien) != len(zielDateien)):
        print("++++++ ACTHUNG: Es gibt ", len(quellDateien), " und ", len(zielDateien), "!")
    else:
        print("Alle ", len(quellDateien), " Datei(en) wurden erfolgreich konvertiert.")
    print()
    zielGroesse = 0
    for zielDatei in zielDateien:
        zielDateiname = ZIELVERZEICHNIS + "\\" + zielDatei
        zielGroesse += os.path.getsize(zielDateiname)
        print("--------------------------------------------------------------------------------")
        print("Die Datei ", zielDatei, " wird überprüft.")
        print("--------------------------------------------------------------------------------")
        bild = Image.open(zielDateiname)
        ZeigeBilddaten(bild)
    print()
    print("Insgesamt", len(zielDateien), "Datei(en) mit einer Gesammtgröße von", zielGroesse, " Bytes wurden gefunden.")
    groessenReduktion = 100 * ((zielGroesse - quellGroesse) / quellGroesse)
    print("Die Größenänderung beträgt", '{:.2f}'.format(groessenReduktion), "%.")
        
# Wenn keine Dateien im Quellverzeichnis gefunden wurden, gibt es eine Warnung
else:
    print("++++++ ACTHUNG: Es gibt keine JPG/JPEG Dateien im Quellverzeichnis.")

# Das Programm endet hier
print()
print("ENDE DES AUSDRUCKS")
print("ENDE DES PROGRAMMS")
print("********************************************************************************")
4 „Gefällt mir“

Hallo
Nettes Tool,
aber wenn ich mich richtig erinnere wird das mit den Metadaten bei den Bildern automatisch auf dem Server gelöscht auf dem das Forum läuft.

Grüße :grin::call_me_hand:

3 „Gefällt mir“

Danke.

Das stimmt. Ich wollte aber mich ein bisschen ins Thema Metadaten einarbeiten. Es hat sich gelohnt, denn das Ganze war etwas komplexer als gedacht.

3 „Gefällt mir“

Klingt nach einem nützlichen Tool wobei ich bis jetzt immer IrfanView genutzt habe wenn ich mal schnell viele Dateien konvertieren oder umbenennen wollte.

1 „Gefällt mir“

Danke.

Das habe ich auch gemacht und ich bin mit IrfanView eigentlich auch zufrieden, aber das Gefühl, etwas Kreatives zu leisten hat in mir die Gewohnheit in den Flucht geschlagen :slight_smile:

Ich werde bei meinem nächsten Beitrag zu meinem aktuellen Grow die Ergebnisse des Scripts mit denen von IrfanView vergleichen.

1 „Gefällt mir“

Immer wenn ich sowas sehe kommt in meinem hirn nur das an… :exploding_head:

:rofl: :victory_hand:t3:

2 „Gefällt mir“

Liebe Mitgrowerinnen und Mitgrower,

ich habe heute meinen Growbericht (siehe unter Growreport Original Sensible Seeds Tiramisu) forgesetzt und die neuesten Bilder mit dem Phython-Script bearbeitet.

Zusätzlich habe ich eine Batch-Bearbeitung mit IrfanView vorgenommen.

In beiden Fällen wurden Länge und Breite jedes Bildes halbiert.

Kriterium IrfanView Phython-Script
Ausführungszeit 13 Sekunden und 30 Millisekunden 19 Sekunden und 26 Millisekunden
Gesparter Speicherplatz 17,18 % 11,77%

Es sieht aus, als würde IrfanView eine etwas bessere Leisung bringen.

Gibt’s das auch mit

<br> 

Ist etwas unübersichtlich.
Und eher unnütz. :thinking:

Aber schön gemacht. :victory_hand:

Da gibt’s halt schon fertige Apps für.

LG

1 „Gefällt mir“

Für mich war das immer Magic hinter verschlossenen Türen :slight_smile:

Nach einer Ausbildung in der IT kann ich das jetzt lesen und schreiben

2 „Gefällt mir“

Und, macht es Spaß?

Es ist einfacher als man denkt.
Logiker verstehen das sofort.
Ich bin Legastheniker, kann 3 „Sprachen“ sprechen, aber keine schreiben. :rofl::rofl:

Code kann ich in jeder Form lesen, mit genug Aufwand. (Leider wenig Zeit dafür)
Es ist immer das selbe Prinzip. Ganz einfach. Ja, nein. :rofl::rofl:

Es erschließt sich alles aus Logik.
Schriftlich gibts keine „Logik“ im klassischen Sinn.

Aber mathematisch ist es was ganz anderes!
Naturgemäß ist es so bestimmt.

Ein „Rechtschreibfehler“ ändert nicht den Sinn im Kontext (obwohl autokorrektur ist ausgeschlossen!!!)

Aber eine falsch Formel ist einfach falsch!!!

So ungefähr..

Sorry dicht und soo…

Wie die Mechanik von einer Kirchenglocke :bell:
wenn es dir jemand erklärt und dich hinter die Kulisse blicken lässt, und du Interesse zeigst, dann teilt man gerne sein wissen

Interesse an Dingen bringen Glück und Freude.
Und Menschen die einen verstehen, und unterstützen.