Openjpeg Array



  • Hi zusammen,
    ich möchte mit Hilfe von Openjpeg ein JP2 Bild öffnen.

    Dafür verwende ich folgenden Code:

    int BufferSize = InputStream->Size;
    BYTE* Buffer = new BYTE[BufferSize];
    
    InputStream->ReadBuffer(Buffer, BufferLen);
    opj_cio_open(opj_common_ptr(dinfo), Buffer, BufferSize);
    

    Beim verarbeiten des Buffer in "opj_cio_open" scheint jetzt aber irgendwas schief zu gehen(Farbfehler).

    Wenn ich aber ein Konstantes BYTE Array verwende also:

    int BufferSize = InputStream->Size;
    BYTE Buffer[999999];
    
    InputStream->ReadBuffer(Buffer, BufferLen);
    opj_cio_open(opj_common_ptr(dinfo), Buffer, BufferSize);
    

    ist alles tatellos, keine Bildfehler, oder sonstiges.

    Habe es auch schon mit

    DynamicArray<BYTE> Buffer;
    

    versucht, aber das gibt das selbe Ergebnis wie mit new. Aber eigentlich müßte es doch ziemlich egal sein, da opj_cio_open als Buffer ein unsigned char* erwartet.

    Ich verstehs nicht, kann mich einer aufklären?

    mfg



  • Könnte es daran liegen dass du einmal "BufferSize" und einmal "BufferLen" verwendest, sind die beiden gleich groß ?



  • Hallo,

    Du verwendest mal BufferSize und mal BufferLen. Was ist hier richtig? Wo kommt dieses BufferLen her?
    TStream::size gibt __int64 zurück. Du schreibst es in ein int. Hier kann es evtl. zu Überläufen kommen.



  • Hier kann es evtl. zu Überläufen kommen.

    Falls das Bild größer als 2GB ist ja. Wird es aber wohl nie sein.



  • DarkShadow44 schrieb:

    Falls das Bild größer als 2GB ist ja. Wird es aber wohl nie sein.

    Ja, und niemand braucht mehr als 640kB RAM. 🙂



  • Oh, sorry für die Verwirrung.
    Hab das ausm Src zusammenkopiert mit verschiedenen Versuchen.
    BufferSize = BufferLen.

    WegA:

    int BufferSize = InputStream->Size;
    BYTE* Buffer = new BYTE[BufferSize];
    
    InputStream->ReadBuffer(Buffer, BufferSize);
    opj_cio_open(opj_common_ptr(dinfo), Buffer, BufferSize);
    

    Weg B:

    int BufferSize = InputStream->Size;
    BYTE Buffer[999999];
    
    InputStream->ReadBuffer(Buffer, BufferSize);
    opj_cio_open(opj_common_ptr(dinfo), Buffer, BufferSize);
    

    Danke für den Hinweis mit __int64, werde ich berücksichtigen, aber das Bild ist in dem Fall ~160kB groß.

    mfg



  • 1. Benutze std::vector statt dynamischer Byte Arrays:

    #include <vector>
    
    void func()
    {
       std::vector<BYTE> Buffer( InputStream->Size );
       if( !Buffer.empty() )
       {
          opj_cio_open( opj_common_ptr(dinfo), &Buffer[0], Buffer.size() );
          ...
       }
    }
    

    2. was gibt opj_cio_open zurück? Vielleicht einen Fehlercode, der dir beim Suchen des Fehlers hilft?



  • Danke, aber leider gleiches Ergebnis.

    opj_cio_open gibt einen Pointer auf die Struktur opj_cio_t, oder im Fehlerfall NULL zurück.

    Das Problem ist aber ja, das es eigentlich kein wirklicher Fehler ist. Nur scheint was am Buffer falsch gelesen zu werden, wenn er nicht statisch ist. Und genau das versteh ich einfach nicht.

    mfg



  • Hallo,

    Sowas könnte auch durch undefiniertes Verhalten in irgendeiner Anweisung vorher verursacht werden. Kommentier doch mal alles unnötige vorher aus und schau was passiert.



  • Hey, danke Braunstein, dein Tipp hat mir sehr weitergeholfen.

    Ich hatte meine Klasse von Graphics::TBitmap abgeleitet, und vor dem Lesen des Buffers, den InputStream zum Erkennen des Grafikheaders (BMP, JPG, PNG, JP2k, etc.) verwendet.
    Nach vielen rumprobieren, hab ich gemerkt, dass wohl TBitmap irgendwas mit dem Stream anstellt, da man z.b. mit einem TFileStream das Bild während dem Ladevorgang nicht öffnen konnte, war also währendessen wohl Lesegeschützt.

    Wenn ich das Auslesen des Headers weggelassen habe, also den Stream vor dem Pufferlesen nicht angefasst habe (ich habe natürlich auch nach dem Lesen immer die Position zurückgesetzt), hat das Bildauslesen meistens funktioniert (aber auch nicht immer 🙄 ).

    Momentane Lösung:
    - Klasse nicht mehr von TBitmap vererbt.
    - Header auslesen und Puffer lesen mit getrennten TFileStreams

    Ganz verstehen tue ich das Ganze zwar noch nicht, aber vorerst funktioniert jetzt alles.

    Danke für die Denkanstöße

    mfg


Anmelden zum Antworten