
Für die
Gadgets
Gadget (englisch für: "Apparat", "technische Spielerei" oder auch "Schnickschnack") bezeichnet ein technisches Werkzeug oder Gerät mit bisher so nicht bekannter Funktionalität und/oder besonderem Design... Eine große Rolle spielt der Spaßfaktor eines Gadgets: Geräte, die sich als Gadget definieren, sind oft Grenzgänger zwischen sinnvoller Funktionalität und Verspieltheit. (Quelle: Wikipedia) im Rahmen der Erfassung von Messwerten im Haus verwende ich verschiedene Varianten von ESP8266 Boards. Da die Messwerte in einer WEB GUI im Browser
angezeigt werden, finde ich es nett, wenn die jeweilige Anzeige ein passendes Icon in der Tableiste des Browsers anzeigt. Legt man einen Link zu so einer Seite auf den Desktop,
erhält dieser Link automatisch ebenfalls das Icon. Damit dieses Desktop-Icon durch Upscaling nicht zu pixelig ausfällt, verwende ich für die Favicons Abmessungen von 92 x
92 Pixeln. Der Browser schrumpft die Icons passend auf 16 x 16 Pixel, auf dem Desktop sehen die 92 x 92 Pixel großen
Bildchen
ganz schick aus, selbst auf einem aktuellen 4k-Monitor.
Bis vor kurzem habe ich die Icons in einem mehrschrittigen Prozess manuell erstellt. Zuallererst musste das PNG-Bild in passender Größe - z.B. 96 x 96 Pixel - auf weißem Hintergrund abgebildet und als PNG-Bild gespeichert werden. Dann kam die Nutzung einer Website zur Formatwandlung (PNG -> ICO) und mehrere nachfolgende Behandlungen im HEX-Editor (ICO -> 2-stellige HEX-Werte) und in Notepad++ (HEX -Werte mit “, 0x” versehen und Zeilenlänge einstellen, damit es C++-Code wird, der in das Programm eingezogen werden kann.
Um diesen Prozess zu verkürzen - ich habe inzwischen viele Favicons erstellen müssen - habe ich zusammen mit Gemini eine Python Routine erstellt, die die Umwandlung eines beliebigen Bildes in ein Favicon der Größe 92 x 92 Pixel zu einem einzelnen Drag&Drop-Vorgang macht:
-> Nimm das Bild und lasse es im Explorer auf das Python-Skript fallen, quittiere die Vorschau und vergib einen Namen für die zu erstellende Header-Datei. Fertig :)
Hier der Python Code:![]()
import sys
import os
# Voraussetzung: Python ist schon installiert
# Pillow muss installiert werden, falls es nicht schon vorhanden ist
# pip install Pillow
# oder
# python -m pip install Pillow
# Diese Aufrufe installieren Pillow unter 'APPDATA'
# Pfad-Fix für Pillow-Suche:
h_path = os.path.join(os.environ['APPDATA'], 'Python', 'Python313', 'site-packages')
if h_path not in sys.path:
sys.path.append(h_path)
try:
from PIL import Image
except ImportError:
print("Fehler: Pillow konnte nicht geladen werden.")
sys.exit(1)
def convert_to_header(image_path, size=92): # hier ggf. Groesse aendern
if not os.path.exists(image_path):
print(f"Fehler: '{image_path}' wurde nicht gefunden!")
return
# 1. Bild laden und Proportionen wahren
img_raw = Image.open(image_path).convert("RGBA")
img_raw.thumbnail((size, size), Image.Resampling.LANCZOS)
# 2. Auf weißes Quadrat (Canvas) setzen
new_img = Image.new("RGB", (size, size), (255, 255, 255))
x_offset = (size - img_raw.width) // 2
y_offset = (size - img_raw.height) // 2
new_img.paste(img_raw, (x_offset, y_offset), mask=img_raw.split()[3])
# 3. VORSCHAU: Das Bild vor dem Export anzeigen
print(f"\n--- VORSCHAU: {size}x{size} ---")
print("Ein Fenster mit dem fertigen Icon sollte sich gleich öffnen.")
new_img.show()
# 4. Benutzereingabe
antwort = input("Sieht das Icon gut aus? (j/n): ").lower()
if antwort != 'j':
print("Abbruch. Es wurde kein Code generiert.")
return
array_name = input("Wie soll das Array heißen? (Standard: thermometer): ") or "thermometer"
header_filename = array_name + ".h"
# 5. Hex-Export
temp_filename = "temp_export.png"
new_img.save(temp_filename, "PNG")
with open(temp_filename, "rb") as f:
data = f.read()
with open(header_filename, "w") as f_out:
f_out.write(f"// Automatisch generiertes Icon-Array\n")
f_out.write(f"// Original: {image_path} | Format: {size}x{size}\n")
f_out.write(f"const unsigned char {array_name}[] PROGMEM = {{\n")
for i in range(0, len(data), 16):
chunk = data[i:i+16]
hex_line = ", ".join([f"0x{b:02X}" for b in chunk])
f_out.write(f" {hex_line}{',' if i+16 < len(data) else ''}\n")
f_out.write("};\n")
os.remove(temp_filename)
print(f"\nFERTIG! Datei '{header_filename}' wurde erfolgreich erstellt.")
if __name__ == "__main__":
target = sys.argv[1] if len(sys.argv) > 1 else "input.png"
convert_to_header(target)
input("\nBeliebige Taste zum Beenden drücken...")![]()
Im Code ist als Kommentar angegeben, wo ggf. die resultierende Icon-Größe eingestellt werden kann. Genauso können verschiedene Default-Einstellungen vorgegeben werden.