setPixmap fuer jpg daten im speicher?

  • folgendes: habe jpg file daten in einer sql database und moechte sie anzeigen.

    kann ich irgendwie aus den daten einen gPixmapPtr erzeugen, den ich dann mit setPixmap anzeigen koennte?

    moechte ungern den umweg gehen, die daten zuerst als file abzuspeichern und dann wieder mit LoadPixmap wieder zu laden.

    danke.

    • Offizieller Beitrag

    Moin,


    das kam erst relativ kürzlich dazu....

    Aber in neueren enigma2 versionen gibt es

    ePicload.startDecodeBuffer


    Python
        def startDecodeBuffer(self, picbuf, n, async=True):
            """
            startDecodeBuffer(ePicLoad self, unsigned char const * picbuf, size_t n, bool async=True) -> RESULT
            startDecodeBuffer(ePicLoad self, unsigned char const * picbuf, size_t n) -> RESULT
            """


    Wenn ich mich recht entsinne müssten das python-seitig mit "bytes(....)" funktionieren.

  • ich hab das jetzt mal probiert...

    habe in meiner routine "startDecode" durch "startDecodeBuffer" ersetzt und die jpg-daten vorher von einem jpg-file eingelesen.

    habe sowohl mit den daten direkt als auch mit bytes(daten) probiert... crasht leider.

    Reichi: hast du vielleicht noch einen tipp? danke.

    hier der code:

  • Am Anfang hast du gesagt, dass du die Daten direkt lesen willst, aber jetzt hast du ja doch wieder eine Datei...dann kannst du gleich setPixmapFromFile() nutzen.

    Gruss
    Dre


    Boxen (im Einsatz): DM920, DM900, DMOne
    Developer Project Merlin - we are OpenSource

  • das war nur ein schneller test, ob startDecodeBuffer funktioniert. wenn ich die daten direkt vom file lese, dann habe ich ja die unveraenderten jpeg daten.

    wenn das mal tut, verwende ich dann die daten aus der db. mit de daten aus der db bekomme ich denselben crash.

  • mit bytearray(cover_data) crasht es leider auch:

    • Offizieller Beitrag

    Ich habs schon ne weile nicht mehr benutzt, ich such nach mal nach dem code in dem ich es selbst benutzt hab... (ich weiß es nicht mehr, sorry)

    Achso, welches Format haben denn deine Quelldaten?



    Nachtrag:


    Hier nochmal der konkrete Eintrag aus dem Changelog, damit muss es eigentlich funktionieren.


    Code
      - use bytearray() or any <sequence>(int) on the python side)  - example call: self._picload.startDecodeBuffer(bytearray(data), len(data))        
  • also genau so rufe ich es auf:

    Code
    self._picload.startDecodeBuffer(bytearray(data), len(data), True)

    data ist das binaerformat wie man es bekommt, wenn man das jpeg file liest:


    Code
    f = open("/tmp/cover.jpg", "rb")
    cover_data = f.read()                  
    f.close()

    das ist erstmal nur zum test... spaeter kommen die daten aus der db.

    • Offizieller Beitrag

    Naja doch, wenn du es async machst, ist deine funktion ja sofort beendet wo du dein jpg in den speicher lädst... sprich der async call kehrt sofort zurück... die funktion wird beendet.. python gibt den speicher frei, und der enigma2 c++ teil hat dann internen einen pointer auf daten im speicher die nicht mehr vorhanden sind... es wird intern KEIN kopie der Daten angelegt!


    Mit den Daten aus der Datenbank sollte es funktionieren, wenn nicht solange e2 noch das jpg dekodiert der datensatz aus der Datenbank nicht gelöscht wird. Vermute ich zumindest.


    Nunja.. wie dem auch sei.. das Problem ist die Lebenszeit der daten...

  • ich meinte die definition in der reichi doc... die sagt:

    Code
    def     startDecodeBuffer (self, picbuf, n, async=True)

    das heisst doch, dass async auf True gesetzt wird, wenn ich den parameter nicht angebe... von daher duerfte es keinen unterschied machen, ob ich den parameter nicht angebe oder auf True setze.

  • wundert mich aber gerade, dass es mit async überhaupt funktioniert..

    Ghost: brauchst dich nicht zu wundern, denn es funktioniert auch nicht zuverlaessig... nur manchmal.

    deswegen teste ich jetzt mit async=False. das scheint nach ersten tests zu funktionieren.

    p.s. mit den daten aus der db (blob) funktioniert es auch.

  • funktioniert soweit

    noch ne frage:

    anscheinend wird bei async=false auch die callback funktion aufgerufen.

    koennte ich nach startBufferDecode auch gleich ohne callback die getData funktion aufrufen?