Seite 1 von 1

Image als Variable soll als File Objekt übergeben werden

Verfasst: Mittwoch 2. Dezember 2020, 17:55
von unique24
Hallo,

ich lese von der Kamera des Raspberry die Kamerabilder als JPG ein.

Mit einer Funktion von PushOver möchte ich dieses Bild mitsenden, aber die Library erwartet ein File Object.

Kann ich es dennoch mit übergeben oder muss ich es erst speichern?

Danke!

Re: Image als Variable soll als File Objekt übergeben werden

Verfasst: Mittwoch 2. Dezember 2020, 19:08
von narpfel
Moin,

`io.BytesIO` ist ein dateiartiges Objekt, dessen Daten im Speicher leben. Wenn die Bibliothek richtig programmiert ist und nicht irgendwas komisches macht, sollte es damit funktionieren.

Re: Image als Variable soll als File Objekt übergeben werden

Verfasst: Mittwoch 2. Dezember 2020, 20:34
von unique24
klappt leider noch nicht ... in der Push Nachricht wird ein kaputte Image Icon angezeigt.

Ich lese von der Kamera:

Code: Alles auswählen

if not (self.cam is None or not self.cam.isOpened()):
                _, Coop.cam_image = self.cam.read()
                _, Coop.data_image = cv2.imencode('.jpg', Coop.cam_image)
und hab fast alles probiert.

Coop.cam_image und Coop.data_image ... mit io.BytesIO und auch als base64

Code: Alles auswählen

def pushOver(message):
    try:
        po = Pushover(Coop.PUSHOVER_TOKEN)
        po.user(Coop.PUSHOVER_USER)
        msg = po.msg(message)
        msg.set("title", "Test")
        try:
            # image = base64.b64encode(Coop.data_image.tostring()).decode('utf-8') 
            msg.set("attachment", io.BytesIO(Coop.cam_image))
        except Exception as e:
            logger.error(e)
        po.send(msg)
    except Exception as e:
        logger.error(e)
Wenn ich io.BytesIO nutze, erhalte ich die Push ohne image ... wenn ich das weg lasse, habe ich das "kaputte" Image Icon

Re: Image als Variable soll als File Objekt übergeben werden

Verfasst: Mittwoch 2. Dezember 2020, 20:37
von unique24
Beschrieben bei PushOver ist es so:

Attachments can be sent with the attachment parameter which takes as argument as file object:

with open('/path/to/my/image.png', 'rb') as image:
client.send_message('Message with image', attachment=image)

Re: Image als Variable soll als File Objekt übergeben werden

Verfasst: Mittwoch 2. Dezember 2020, 21:04
von narpfel
In dem Beispiel hast du doch jetzt nicht das JPG-encodete Bild sondern die Rohdaten in ein `BytesIO` eingepackt? Funktioniert es mit `Coop.data_image`?

Wo kommt `Coop` her? So wie du es jetzt benutzt, ist es eine globale Variable. `pushOver` sollte die Bilddaten als Argument erhalten, und das Einlesen sollte sie als Rückgabewert zurückgeben.

`pushOver` entspricht nicht den in Python üblichen Namenskonventionen (`snake_case` für Funktionen). Siehe auch PEP 8.

Re: Image als Variable soll als File Objekt übergeben werden

Verfasst: Mittwoch 2. Dezember 2020, 21:31
von unique24
Ja, habs mit beiden probiert!

Coop ist die Hauptklasse. Ich hab das mal so aus dem Netz zusammen gestellt.
Ohne Bilder klappt es.

Hab nun dies gefunden:

Code: Alles auswählen

import requests
r = requests.post("https://api.pushover.net/1/messages.json", data = {
  "token": "APP_TOKEN",
  "user": "USER_KEY",
  "message": "hello world"
},
files = {
  "attachment": ("image.jpg", open("your_image.jpg", "rb"), "image/jpeg")
})
print(r.text)
Eventuell besser geeignet .. aber klappt das dann mit io.BytesIO als File?

oder dies noch besser?:
https://github.com/Thibauth/python-pushover

Re: Image als Variable soll als File Objekt übergeben werden

Verfasst: Donnerstag 3. Dezember 2020, 06:54
von sparrow
Hauptklasse?
In der als Klassenattribut ein Bild von einer Kamera liegt? Das klingt falsch.

Schreib den Code ohne BytesIO. Speicher das Bild auf die Platte, öffne die Datei und häng es wie in der Dokumentation beschtieben an.
Wenn das funktioniert, dann kann man das einfach auf BytesIO umstellen.

Dieses Konstrukt mit der uninitialisierten "Hauptklasse" lässt mich vermuten, dass da eine Klasse als Finktionscontainer missbraucht wird (riecht nach Java) und da gar kein Bild ist.