Graustufenbild -> Array



  • Erstmal danke für Eure Anworten. Mein erstes Posting war offensichtlich etwas unglücklich formuliert. 😉

    Es soll nicht jedes beliebige Format gelesen werden können, sondern lediglich eines. Dabei ist es mir egal welches das ist, solange es sich leicht einlesen lässt.
    Es geht nur darum eine einzige Heightmap zu laden, daher möchte ich keine riesen Bibliotheken wie OpenCV oder ähnliches einbinden müssen. (Das meinte ich mit "Overkill")

    Ich dachte da z.B. an Windows Funktionen, für die man keine extra Library braucht. (LoadImage()?)
    Oder bei .raw Dateien soll das Einlesen ja auch sehr leicht funktionieren.



  • Heightmap schrieb:

    Es soll nicht jedes beliebige Format gelesen werden können, sondern lediglich eines. Dabei ist es mir egal welches das ist, solange es sich leicht einlesen lässt.

    Na dann hast du doch freie Wahl.

    Heightmap schrieb:

    Ich dachte da z.B. an Windows Funktionen, für die man keine extra Library braucht. (LoadImage()?)

    Damit wärest du dann aber nicht mehr Platformunabhängig.

    Neben RAW- und Bitmap-Texturformaten ist wohl, wie bereits gesagt, TGA ganz schön. Soweit ich das übersehe gibt es auch nur einen Fileheader, was das lesen ziemlich einfach gestaltet.



  • Du kannst mit WinAPI-Funktionen relativ leicht BMP-Dateien öffnen und an die Bilddaten gelangen. Ich würde dir zwar schon lieber zu OpenCV raten (damit arbeite ich auch), aber ich kann deine Overkill-Bedenken verstehen. Ich kenne mich mit den WinAPI-Funktionen zwar nicht gut aus, habe in diesem Mega-Thread

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-241662-and-postdays-is-0-and-postorder-is-asc-and-highlight-is-matze+getbitmapbits-and-start-is-20.html

    aber für denjenigen mal schnell was zusammengebastelt. Du brauchst dir nur die main anzuschauen (der ganze Quatsch darüber ist nur zum Speichern).Bitmap öffnen, Bilddaten kopieren und dann mit y*breite+x drin rumwurschteln. Ist nur eine Möglichkeit, und sicher nicht die beste (ich arbeite halt eher mit OpenCV, wie gesagt, und kenne den ganzen Kram nicht so). Vielleicht ist es eine kleine Anregung.

    EDIT: An dem Thread kann man auch schön sehen, wie geduldig ich sein kann, wenn ich will! 😉



  • Naja, du kannst ja mal nach TGA Loader googlen. Es gibt fertige Klassen und das Iterieren ueber die Pixel wird recht einfach. Hier z.B. http://gpwiki.org/index.php/LoadTGACpp



  • Danke für Eure Antworten! 🙂

    @ Kóyaánasqatsi: Plattformabhängigkeit ist für mich, wie gesagt, nicht wichtig.

    @ _matze: Ah, danke! Bei mir meckert aber der Compiler bei:

    Speicher=malloc(sizeInBytes);
    

    (cannot convert from 'void *' to 'int *')
    Was kann ich da machen?

    @ knivil: Werde ich mir mal anschauen. 🙂



  • Heightmap schrieb:

    @ _matze: Ah, danke! Bei mir meckert aber der Compiler bei:

    Speicher=malloc(sizeInBytes);
    

    (cannot convert from 'void *' to 'int *')
    Was kann ich da machen?

    Ach ja, war ein C-Programm...

    Die Rückgabe von malloc nach int* casten oder statt malloc/free new/delete benutzen.



  • Heightmap schrieb:

    @ Kóyaánasqatsi: Plattformabhängigkeit ist für mich, wie gesagt, nicht wichtig.

    Wo hast du es denn gesagt?



  • In meinem ersten Beitrag. 😉

    Heightmap schrieb:

    ..Dabei ist es total egal, welches Format und es muss auch nur auf Windows laufen.
    ..

    @ _matze: Ok, so klappt es. Nur durch "getchar()" hängt sich das Programm auf.
    Wenn ich es weglasse und mir die Pixelwerte ausgeben lasse bekomme ich Werte im Millionenbereich. 😕



  • Heightmap schrieb:

    Wenn ich es weglasse und mir die Pixelwerte ausgeben lasse bekomme ich Werte im Millionenbereich. 😕

    Ein Pixel hat (in einem 32-Bit-Bild) eine Größe von 4 Bytes. Daher nehme ich da einen int-Pointer. Willst du an die einzelnen Kanäle (r,g,b,alpha), musst du mit bitwise and und bitshift arbeiten. Solche Werte sieht man sich auch besser hexadezimal an.

    Beispiel:

    Pixel x,y (nennen wir mal px) ist 0x00fe0a1e

    Willst du nun an den roten Kanal (dritte Stelle, sag ich jetzt mal), machst du Folgendes:

    unsigned char r=(px & 0x00ff0000)>>16 (damit kriegst du 0x00fe0000 und verschiebst die Bits um 16 Stellen nach rechts, um 0xfe zu erhalten)

    Wenn dir nicht klar sein sollte, was hier passiert, solltest du dir mal grundlegende Dinge bzgl. Operatoren usw. ansehen.

    Du hast dir wahrscheinlich einfach den gesamten Pixel angesehen und als einen Wert interpretiert, richtig?



  • Ah, alles klar! Klappt jetzt wunderbar.

    Danke! 🙂


Anmelden zum Antworten