Bild aus Wert erstellen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
horst_w
User
Beiträge: 3
Registriert: Sonntag 12. März 2023, 19:04

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ein bisschen weiter ausholen, was da wie dargestellt werden soll, musst du schon. Sonst kann man da nur raten.
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

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?
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
horst_w
User
Beiträge: 3
Registriert: Sonntag 12. März 2023, 19:04

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
__deets__
User
Beiträge: 14493
Registriert: Mittwoch 14. Oktober 2015, 14:29

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.
horst_w
User
Beiträge: 3
Registriert: Sonntag 12. März 2023, 19:04

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
Sirius3
User
Beiträge: 17711
Registriert: Sonntag 21. Oktober 2012, 17:20

Warum wird eigentlich immer nur der furchtbar schlechteste Code zum Parsen dieser Temperaturdateien aus dem Internet kopiert?
Benutzeravatar
__blackjack__
User
Beiträge: 13004
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Das wird sich ändern — in Zukunft wird das nicht mehr aus dem Internet kopiert, sondern von ChatGPT vorgelesen. 😜
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Benutzeravatar
DeaD_EyE
User
Beiträge: 1012
Registriert: Sonntag 19. September 2010, 13:45
Wohnort: Hagen
Kontaktdaten:

__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.
sourceserver.info - sourceserver.info/wiki/ - ausgestorbener Support für HL2-Server
Antworten