Image als Variable soll als File Objekt übergeben werden

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
unique24
User
Beiträge: 69
Registriert: Donnerstag 5. Juli 2018, 14:51

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!
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

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.
unique24
User
Beiträge: 69
Registriert: Donnerstag 5. Juli 2018, 14:51

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
unique24
User
Beiträge: 69
Registriert: Donnerstag 5. Juli 2018, 14:51

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)
narpfel
User
Beiträge: 691
Registriert: Freitag 20. Oktober 2017, 16:10

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.
unique24
User
Beiträge: 69
Registriert: Donnerstag 5. Juli 2018, 14:51

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
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

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.
Antworten