Mein neues ProjektImage Slice & Stitchist ein vielseitiges Python-Programm, das es ermöglicht, Bilder in Streifen zu schneiden und sie anschliessend neu zusammenzusetzen. Es ist der Nachfolger von meinem Programm «Streifenbilder erzeugen mit Python«. Dieses Tool eignet sich hervorragend für kreative Bildbearbeitung und die Erstellung einzigartiger Designs.
Hauptfunktionen:
Flexible Streifenerstellung: Das Programm kann Bilder horizontal oder vertikal in Streifen zerteilen. Dabei besteht die Möglichkeit, zufällige Streifenbreiten zu verwenden, um interessante visuelle Effekte zu erzielen.
Integration von Leerstreifen: Es können optionale leere Streifen mit benutzerdefinierten Farben eingefügt werden, um zusätzliche Gestaltungsmöglichkeiten zu bieten.
Schwarz-Weiss-Konvertierung: Für einen klassischen Look können Bilder in Schwarz-Weiss umgewandelt werden.
Benutzerfreundliche Oberfläche: Das Programm bietet eine Vorschau des Originalbildes sowie des bearbeiteten Bildes und unterstützt Drag & Drop für eine einfache Bildauswahl.
Systemanforderungen:
Python 3.8 oder höher
Abhängigkeiten, die in der Datei requirements.txt aufgeführt sind
Das Programm starten: python tci_main_image_slice_stitch_26.py
Nach dem Start können Bilder per Drag & Drop in das Programm gezogen werden. Anschliessend lassen sich verschiedene Parameter wie die Anzahl der Streifen, deren Ausrichtung und die Farben der Leerstreifen einstellen. Das bearbeitete Bild wird in der Vorschau angezeigt und kann bei Bedarf gespeichert werden.
Anwendungsbeispiele:
Künstlerische Fotobearbeitung: Durch das Zerschneiden und Neuarrangieren von Bildern können einzigartige Kunstwerke geschaffen werden.
Design von Werbematerialien: Erstellung auffälliger Grafiken für Flyer, Poster oder digitale Medien.
Dieses Python-Skript verwendet die PIL (Python Imaging Library) Bibliothek, um Bilder in Schwarzweiss umzuwandeln und dabei Kontrast und Helligkeit anzupassen. Hier ist eine kurze Anleitung zur Verwendung des Skripts:
-i oder --input: Pfad zum Eingabebild (JPG).
-o oder --output: Optionaler Pfad zum Ausgabebild (JPG). Wenn nicht angegeben, wird ein Standardname im selben Verzeichnis erstellt.
-c oder --contrast: Kontrastfaktor (Standard: 1.0).
-b oder --brightness: Helligkeitsfaktor (Standard: 1.0).
Mehrere Bilder im Verzeichnis konvertieren:
Installiere PIL: Falls noch nicht installiert (wie oben beschrieben). Führe das Skript aus: Verwende die Kommandozeile, um das Skript für ein Verzeichnis mit Bildern auszuführen. Hier ist ein Beispiel:
-d oder --directory: Pfad zum Verzeichnis mit Bildern für die Stapelverarbeitung.
-o oder --output: Optionaler Pfad zum Ausgabeverzeichnis. Wenn nicht angegeben, wird ein Ordner mit dem Namen "converted_images" im Eingabeverzeichnis erstellt.
-c oder --contrast: Kontrastfaktor (Standard: 1.0).
-b oder --brightness: Helligkeitsfaktor (Standard: 1.0).
Hinweis:
Stelle sicher, dass das Skript im gleichen Verzeichnis wie die Bilder oder im Systempfad liegt, damit es ohne Pfadangabe ausgeführt werden kann.
Das Modul kann verwendet werden, um einen HEX Farbcode (ff0000) in verschiedene Repräsentationen umzuwandeln. Das Modul ist entstanden, dass die Dokumentation von «colorsys» ziemlich rudimentär ist und ich lange Suchen musste, bis ich den richtigen Ansatz gefunden hatte.
Beschreibung der fünf Funktionen, die mit der Umwandlung von Farbwerten arbeiten.
Die Funktion hex_to_rgb akzeptiert einen Hexadezimalcode als Eingabe (z.B. «#ffffff») und gibt ein Tupel zurück, das die Werte für Rot, Grün und Blau in Dezimal- und Normalisierungsformaten sowie eine RGB-Farbkodierung enthält. Wenn der Eingabewert kein gültiger Hexadezimalcode ist, gibt die Funktion eine Fehlermeldung aus.
Die Funktion hex_to_name akzeptiert auch einen Hexadezimalcode als Eingabe und gibt den Namen der Farbe zurück, die dem Code am nächsten kommt, basierend auf den CSS-Namen. Wenn der Eingabewert kein gültiger Hexadezimalcode ist oder kein Name gefunden werden kann, gibt die Funktion den Wert «no css name» zurück.
Die Funktionen rgb_to_hsl und rgb_to_hsv akzeptieren die normalisierten Werte für Rot, Grün und Blau als Eingabe und geben die Werte für die entsprechenden Farbräume HSL und HSV sowie die Farbkodierungen zurück. Die Funktionen verwenden die in Python eingebaute colorsys-Bibliothek, um die Umrechnungen durchzuführen.
Schliesslich gibt es die Funktion grb_to_yiq, die die normalisierten Werte für Rot, Grün und Blau akzeptiert und die entsprechenden Werte für den Farbraum YIQ zurückgibt. Die Funktion verwendet auch die colorsys-Bibliothek.
Python
'''Ein keines Pyton Modul um Hex-Farbwerte in verschiedene Formate um zu wandeln.Das Modul wurde durch diesen Artikel inspieriert: https://coderz.club/RGB-to-HSL-HSV-YIQ/Das Error Handling ist mur ganz rudimentaer implementiert.Autor: Thomas Cigolla, 16.02.2023'''import colorsysimport webcolorsimport redefhex_to_rgb(hex_string): # input Format #ffffff match = re.search(r'^#(?:[0-9a-fA-F]{3}){1,2}$', hex_string) # Test if strin a hex valueif match: iflen(hex_string) ==4: # if hex code only 3 digit then expand it to 6 digit hex_string = webcolors.normalize_hex(hex_string)iflen(hex_string) ==7:# Strips the newline characters and '#' hexCodeStr = hex_string.strip("#\r\n")# Convert hex to decimal r =int(hexCodeStr[0:2], 16) g =int(hexCodeStr[2:4], 16) b =int(hexCodeStr[4:6], 16)# normalize 0 to 1 r_norm = r /255 g_norm = g /255 b_norm = b /255 rgb =f'rgb({r},{g},{b})'return r, g, b, r_norm, g_norm, b_norm, rgbelse:print ("String is not valid: ", hex_string )else:print ('Hex is not valid: ', hex_string)defhex_to_name(hex_string):try: name = webcolors.hex_to_name(hex_string)return nameexceptValueError: #print (f'{hex_string} has no defined color name in html4.')return"no css name"defrgb_to_hsl(r_norm, g_norm, b_norm): # Convert RGB to HLS (more commonly known as HSL) h,l,s = colorsys.rgb_to_hls(r_norm, g_norm, b_norm) h *=360 s *=100 l *=100 hsl =f'hsl({h:0.0f}, {s:0.0f}%, {l:0.0f}%)'return h, s, l, hsldefrgb_to_hsv(r_norm, g_norm, b_norm):# Convert RGB to HSV h,s,v = colorsys.rgb_to_hsv(r_norm, g_norm, b_norm) h *=360 s *=100 v *=100 hsv =f'hsv({h:0.0f}, {s:0.0f}%, {v:0.0f}%)'return h, s, v, hsvdefgrb_to_yiq(r_norm, g_norm, b_norm):# Convert RGB to YIQ y,i,q = colorsys.rgb_to_yiq(r_norm, g_norm, b_norm)return y, i, q
Beispiel:
Python
# example for usagedefprint_codes_comma_delimiter(hex_string):# Output r, g, b, r_norm, g_norm, b_norm, rgb = hex_to_rgb(hex_string) h, s, l, hsl = rgb_to_hsl(r_norm, g_norm, b_norm) h, s, v, hsv = rgb_to_hsv(r_norm, g_norm, b_norm) y, i, q = grb_to_yiq(r_norm, g_norm, b_norm) name = hex_to_name(hex_string)print(f'{hex_string},"{name}","{rgb}","rgb({r},{g},{b})","{hsl}","hsl({h:0.0f}°, {s:0.1f}%, {l:0.1f}%)","{hsv}","hsv({h:0.0f}°, {s:0.1f}%, {v:0.1f}%)","yiq({y:0.4f},{i:0.4f},{q:0.4f})"')
PIP der Paketmanager unter Python kennt kein Update oder Upgrade von installierten Paketen. Das ist auch sinnvoll, wenn man in einer Virtual Umgebung (virtualenv) arbeitet. Aber wenn man alleine auf einer Umgebung arbeitet, wünscht man sich manchmal eine einfache Möglichkeit um alle Paket, die nicht mehr aktuell sind zu aktualisieren.
Anzeigen und upgrade kann mit folgendem Script gemacht werden.
Zuerst muss das Script installiert werden.
pip install pip-upgrade-outdated
Danach kann das Script einfach laufengelassen werden und alle Pakete werden upgegradet.
pip_upgrade_outdated
Hier noch die restlichen Parameter.
usage: pip_upgrade_outdated [-h] [-3 | -2 | --pip_cmd PIP_CMD] [--serial | --parallel | --sequential] [--user] [--dry_run] [--verbose] [--version] [--exclude PKG]
Upgrade outdated python packages with pip. Any unknown arguments will be passed to pip.
options:
-h, --help show this help message and exit
-3 use pip3
-2 use pip2
--pip_cmd PIP_CMD use PIP_CMD (default pip)
--serial, -s upgrade in serial via a single batch pip upgrade command (default)
--parallel, -p upgrade in parallel via individual pip ugrade commands
--sequential, -q upgrade in serial via individual pip ugrade commands
--user, -u Adds the --user flag when installing the packages
--dry_run, -n get list, but don't upgrade
--verbose, -v may be specified multiple times
--version show program's version number and exit
--exclude PKG, -x PKG
exclude PKG; may be specified multiple times
Um dies zu erreichen, öffnet das Programm zunächst das Bild und berechnet dann die Breite und Höhe des Bildes.
Anschliessend wird das Bild in die vorgegebene Anzahl an Streifen zerschnitten, entweder in horizontaler oder vertikaler Richtung.
Danach werden die Streifen in zufälliger Reihenfolge wieder zusammengesetzt und ein neues Bild erstellt.
Das Programm erzeugt dann einen eindeutigen Dateinamen und speichert das neue Bild.
Python
importPILimport Imageimport randomimport uuiddefhorizontal_strips (img, width, height, num_strips):# Calculate the strip height strip_height =int(height/num_strips) strips = []for i inrange(num_strips):# Get the current strip box = (0, i*strip_height, width, (i+1)*strip_height) strip = img.crop(box) strips.append(strip)return strip_height, stripsdefvertical_strips (img, width, height, num_strips):# Calculate the strip width strip_width =int(width/num_strips) strips = []for i inrange(num_strips):# Get the current strip box = (i*strip_width, 0, (i+1)*strip_width, height) strip = img.crop(box) strips.append(strip)return strip_width, stripsdefmain(inFile, num_strips, direction):try:# Open the image img = Image.open(inFile) except:print("Something went wrong when opening the file: ", inFile) # Get the height and width of the image width, height = img.sizeif (direction =="h"): strip_dim, strips = horizontal_strips (img, width, height, num_strips)else: strip_dim, strips = vertical_strips (img, width, height, num_strips)# Shuffle the strips random.shuffle(strips)# Reassemble the image reassembled_img = Image.new('RGB', (width, height))# for i in range num_strips: offset =0for strip in strips:if (direction =="h"): reassembled_img.paste(strip, (0, offset))else: reassembled_img.paste(strip, (offset, 0)) offset += strip_dim# make Filenameid=str(uuid.uuid4())# Save the reassembled image reassembled_img.save(f'reassembled_image-{id}.jpg')if __name__ =="__main__":# ------- Init ------- inFile ="berg.jpg"# Filename of input File num_strips =12# Define the number of strips direction ="v"# corp direction h = horizontal or v = vertical main(inFile, num_strips, direction)
Falls Sie kurze eindeutige IDs als Dateinamen oder für andere Fälle benötigen, versuchen Sie shortuuid. shortuuid verwendet Klein- und Grossbuchstaben und Ziffern und entfernt ähnlich aussehende Zeichen wie l, 1, I, O und 0.
Das Paket shortuuid muss über den Paketmanager nachinstalliert werden.