Seite 1 von 1
Bild aus Wert erstellen
Verfasst: Sonntag 12. März 2023, 19:42
von horst_w
Hallo,
ich würde gerne den numerischen Wert aus einer Variable in ein Bild umwandeln.
Gibt es dafür eine Bibliothek?
Mit Tkinter kann man GUIs erstellen, ich suche etwas ähnliches um JPGs zu erstellen.
Danke,
Horst
Re: Bild aus Wert erstellen
Verfasst: Sonntag 12. März 2023, 21:07
von __deets__
Ein bisschen weiter ausholen, was da wie dargestellt werden soll, musst du schon. Sonst kann man da nur raten.
Re: Bild aus Wert erstellen
Verfasst: Sonntag 12. März 2023, 22:29
von DeaD_EyE
Klar, überhaupt kein Problem:
Code: Alles auswählen
from urllib.request import urlopen
from PIL import Image
variable = urlopen(
"https://www.python-forum.de/ext/planetstyles/flightdeck/store/logo-2.png"
)
img = Image.open(variable)
img.show()
Wie war noch mal die Frage?
Re: Bild aus Wert erstellen
Verfasst: Montag 13. März 2023, 17:01
von horst_w
Danke.
Das ist noch nicht ganz was ich will ...
Code: Alles auswählen
file = open('/sys/bus/w1/devices/28-6064dd0664ff/w1_slave')
filecontent = file.read()
file.close()
stringvalue = filecontent.split("\n")[1].split(" ")[9]
temperature = float(stringvalue[2:]) / 1000
temperatur1 = str('%4.1f' % temperature)
from urllib.request import urlopen
from PIL import Image
variable = urlopen(
"https://www.python-forum.de/ext/planetstyles/flightdeck/store/logo-2.png"
)
img = Image.open(variable)
img.show()
... und jetzt soll die temperatur1 als Zahl im logo-2 abgebildet sein und das Gesamtbild als JPG geschrieben werden.
Danke,
Horst
Re: Bild aus Wert erstellen
Verfasst: Montag 13. März 2023, 18:52
von __deets__
Ich weiß nicht, warum dead_eye den Code gepostet hat - er hat nix mit deiner Frage zu tun. Die immer noch spektakulär schlecht gestellt ist. Aber das Modul, dass er nutzt, kann sowas:
https://pillow.readthedocs.io/en/stable ... eDraw.text
Damit kannst du Werte in ein Bild schreiben, und das im gewünschten Format speichern. JPEG ist bei Text übrigens eine sehr schlechte Wahl, benutze lieber PNG.
Re: Bild aus Wert erstellen
Verfasst: Montag 13. März 2023, 20:08
von horst_w
Danke __deets__!
Trotz meiner spektakulär schlecht gestellten Frage hast Du verstanden was ich suche

Ich werde mir das ansehen. Obwohl ich schon auf der ersten blick sehe, dass das etwas länger dauert bis ichs kapier.
Danke ,
Horst
Re: Bild aus Wert erstellen
Verfasst: Montag 13. März 2023, 21:37
von Sirius3
Warum wird eigentlich immer nur der furchtbar schlechteste Code zum Parsen dieser Temperaturdateien aus dem Internet kopiert?
Re: Bild aus Wert erstellen
Verfasst: Montag 13. März 2023, 22:13
von __blackjack__
@Sirius3: Das wird sich ändern — in Zukunft wird das nicht mehr aus dem Internet kopiert, sondern von ChatGPT vorgelesen.

Re: Bild aus Wert erstellen
Verfasst: Mittwoch 15. März 2023, 16:14
von DeaD_EyE
__deets__ hat geschrieben: ↑Montag 13. März 2023, 18:52
Ich weiß nicht, warum dead_eye den Code gepostet hat - er hat nix mit deiner Frage zu tun.
Welche Frage? Worum geht es denn überhaupt?
Die immer noch spektakulär schlecht gestellt ist.
Genau das wollte ich erreichen:
... und jetzt soll die temperatur1 als Zahl im logo-2 abgebildet sein und das Gesamtbild als JPG geschrieben werden.
Ich muss da immer an den Kollegen denken, der ein paar tausend Euro für etwas bezahlt hat, was nicht genau spezifiziert worden ist.
Ergebnis: Genau die Funktion, die er braucht, muss ich jetzt programmieren, obwohl ich mit dem Projekt nichts mehr zu tun haben wollte!
Code: Alles auswählen
import re
import math
from urllib.request import urlopen
from PIL import Image
from PIL.Image import Resampling
from PIL.ImageDraw import ImageDraw
from PIL.ImageFont import truetype
from PIL.ImageOps import invert
def get_img(url):
"""Bild von URL holen"""
return Image.open(urlopen(url))
def read(device_id: str) -> float:
"""
Temperatur auslesen und als float zurückgeben
"""
with open(f"/sys/bus/w1/devices/{device_id}/w1_slave") as fd:
data = fd.read()
if not (match := re.search(r"t=(\d+)", data)):
raise ValueError("Could not find t=xxxx")
return int(match.group(1)) / 1_000
def main():
# Habe keine Sensoren, musst du selbst testen
# device_id = "28-6064dd0664ff"
# temperatur = read(device_id)
# temperatur einfach als Variable gesetzt
temperatur = 13.1337
text = f"{temperatur} °C"
# festlegen der Auflösung
width, height = 640, 480
# neues Bild
img = Image.new("RGB", (width, height))
# z.B. Bild vom Forum als Hintergrund verwenden
forum_bild = get_img("https://www.python-forum.de/ext/planetstyles/flightdeck/store/logo-2.png")
# größe ändern -> nach RGB umwandeln -> invertieren (geht nicht mit RGBA)
forum_bild = invert(forum_bild.resize((width, height), Resampling.BICUBIC).convert("RGB"))
# jetzt das forum_bild nach img (leeres Bild) pasten
img.paste(forum_bild)
# ImageDraw kann zeichnen und Text zum Bild hinzufügen
drw = ImageDraw(img)
# du musst eine Schriftart verwenden, die auf deinem System
# installiert ist
font = truetype("/usr/share/fonts/TTF/JetBrainsMono-Regular.ttf", 46)
# hatte jetzt keine bessere möglichkeit gefunden an
# die Länge und Höhe des Textes zu kommen
# aber die Funktion liefert wenigstens integer zurück
_, _, text_length, text_height = font.getbbox(text)
# xy berechnen, um den Text in der Mitte zu positionieren
xy = (width - text_length) // 2, (height - text_height) // 2
# Text zeichnen
drw.text(xy, text, font=font, fill=(0,0,0), stroke_fill=(255,0,0), stroke_width=5)
# Bild zeigen, besser du machst img.save("bild.jpg")
# img.save("test.jpg")
img.show()
PS: PIL nutze ich vielleicht einmal im Jahr und kenne deswegen nicht alle Funktionen auswendig. Du wirst die Dokumentation von PIL lesen müssen.