Heightmap einlesen
-
1. Beschätige dich mit dem Aufbau der Dateiformate und schreibe dir selber einen Reader/Writer
oder
2. Nimm eine fertige Bibliothek
-
Du musst den Inhalt der JPEGs erst in Farbwerte umwandeln. Gleiches gilt für PNG.
Entweder du setzest dich mit den Formatspezifikationen auseinander und schreibst selbst einen Loader oder du nimmst eine vorhandene Bibliothek, z.B. DevIL ( http://openil.sourceforge.net/ ).
-
Danke!
Ich habe hier eine image loader Bibliothek, die mir folgende Funktion bereitstellt:// Returns a pointer to the raw image data. This is what OpenGl needs for texture. uint8_t *imageData( const Image *img );
Habe schon verschiedenes ausprobiert um die Rückgabe in ein int-Array zu bekommen. Es will aber leider nicht funktionieren
-
Funktioniert nicht ist keine Fehlerbeschreibung!
Was hast du schon ausprobiert?
-
Ok, ich habe die Bibliothek in mein Programm eingebunden und lege zunächst ein neues Bild img an. Danach kann ich mittels bereitgestellter Funktion "imageLoadFlip()" das Bild laden. Über die Funktion imageData() will ich die Pixel-Daten in ein Array bekommen. Direkte Zuweisung (siehe folgender Code) in ein eindimensionales Array 'pixel' und anschließende transformation in ein Zweidimensionales Array, führt zu einem merkwürdigen Ergebnis: Alle Bildpunkte befinden sich entweder auf der maximalen x-Koordinate oder auf der maximalen y-Koordinate (je nachdem wie das eindimensionale Array in ein zweidimensionales Array überführt wird).
Ich habe auch schon versucht, mit fopen(), fread(), fclose() auf die Rückgabe von imageData() zuzugreifen. Dies führte allerdings zu Fehlermeldungen.
Mein Problem ist in erster Linie, dass ich mit der Rücktabe "pointer to the raw image data" nicht viel anfangen kann. Wäre klasse, wenn mich da jemand in die richtige Richtung lenken könnte.uint8_t pixel[2*gnd*2*gnd]; Image *img = imageNew(); printf("Loading texture... %s\n", (imageLoadFlip( filename, img ) )?"success":"failure" ); pixel = imageData( img ); imageDestroy( img );
-
imageLoadFlip wird die Bilddatei wohl in den Arbeitsspeicher dekodieren sodass Du ueber das Image-Interface darauf zugreifen kannst.
imageData liefert Dir einen Zeiger auf die Daten die innerhalb von Image fuer das Bild alloziert wurden.
Auf so einen Zeiger Dateioperationen anzuwenden macht natuerlich keinen Sinn.
Auch wird nach imageDestroy davon nicht mehr viel uebrig sein.
Du moechtest die Bild-Daten also entweder in Dein Array kopieren oder die entsprechenden Zugriffsfunktionen Deiner Lib nutzen.
-
Danke für die Antwort!
imageLoadFlip wird die Bilddatei wohl in den Arbeitsspeicher dekodieren sodass Du ueber das Image-Interface darauf zugreifen kannst.
imageData liefert Dir einen Zeiger auf die Daten die innerhalb von Image fuer das Bild alloziert wurden.Irgendwie finde ich nirgendwo (weder durch googeln, noch in meinem C++ Buch) etwas zum Image interface. Ich hatte versucht, dies als normalen Text zu behandeln und mittels
c = imageData( img ); fread(&pixel, sizeof(int), 1, c);
darauf zuzugreifen. Dann kommt natürlich der Fehler, dass c ein uint8_t pointer ist, aber von fread() ein FILE* pointer erwartet wird.
Ich habe von Datai I/O in C/C++ noch überhaupt keine Erfahrung. Kann auf mein Bild im Arbeitsspeicher wie auf eine normale Textdatei zugreifen? Unter welches Kapitel fällt mein Problem?
Du moechtest die Bild-Daten also entweder in Dein Array kopieren oder die entsprechenden Zugriffsfunktionen Deiner Lib nutzen.
Ich möchte sie in mein Array kopieren. Frage mich wie man das tun kann, ohne Dateioperationen und ohne einfache Zuweisungen anzuwenden?
-
naja wie im post davor beschrieben, schau nach welche zugriffsfunktionen deine bibliothek hat.
Da gibt es sicher eine Funktion die dir die entsprechenden Daten zurückgibt.
pseudocode:
pixel = imageData(img)->getImageDate();
-
Siegfried1 schrieb:
Irgendwie finde ich nirgendwo (weder durch googeln, noch in meinem C++ Buch) etwas zum Image interface.
Das gehoert ja auch zu Deiner obskuren Bibliothek; guck da doch mal ins entsprechende Header-File.
Wenn Du mal erwaehnen wuerdest was das ueberhaupt fuer'n Ding ist, koennte man dir auch konkreter (bzw ueberhaupt) helfen.Siegfried1 schrieb:
Ich möchte sie in mein Array kopieren. Frage mich wie man das tun kann, ohne Dateioperationen anzuwenden?
Es sollte doch klar sein, dass man keine Dateioperationen anwenden kann wenn es sich nicht um eine Datei handelt, denn deren Inhalt wurde ja bereits in den Arbeitsspeicher geladen - wenn Du einen String im Speicher hast wirst Du ja auch nicht versuchen, den als Datei zu oeffnen...
imageData liefert Dir einen Speicherbereich in dem (wahrscheinlich) jeweils 3 hintereinanderliegende Bytes die Rot-, Gruen- und Blauanteile eines Pixels darstellen.
Falls Deine Bibliothek Alpha-Kanaele unterstuetzt, koennten es auch 4 Bytes sein.Du gehst also alle Pixel durch und kopierst sie in Dein Array:
uint8_t *data= imageData(image); int anzahlZeilen= imageHeight(image); int anzahlSpalten= imageWidth(image); for (int zeile=0;zeile<anzahlZeilen;zeile++) { for (int spalte=0;spalte<anzahlSpalten;spalte++) { uint8_t blau= data[(zeile*anzahlSpalten+spalte)*3]; uint8_t gruen= data[(zeile*anzahlSpalten+spalte)*3+1]; uint8_t rot= data[(zeile*anzahlSpalten+spalte)*3+2]; // tust du dann da hin wo's hin soll... } }
-
Danke!! Läuft.