[Gelöst] [SDL] Pixelinformation in Array speichern
Übersicht

![]() |
SkabusBetreff: [Gelöst] [SDL] Pixelinformation in Array speichern |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hallo,
Weiß jemand, wie ich Pixelinformationen eines Surfaces in SDL in einen eindimensionalen Array gespeichert kriege? Mein Ansatz funzt nicht: Code: [AUSKLAPPEN] SDL_surface *image = IMG_Load("..."); Uint32 *pixmem32; for(int y=0;image->h;y++) { for(int x=0;image->w;x++) { int bpp = image->format->BytesPerPixel; pixmem32 =(Uint32*) image->pixels+y*image->pitch + x*bpp; texture[x*y] = *pixmem32; } } Ich bekomme zwar keinen Fehler von der IDE aber beim starten des Programm schreibt er mir ständig irgendne Zugriffsverletzung und stürzt ab. Die LockImage/UnlockImage sind bei mir drum, also liegts nicht daran dass ich den Speicher nicht gesperrt habe. Weiß jemand evtl. wo das Prob ist? Ich verzweifle gerade^^" MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
- Zuletzt bearbeitet von Skabus am Di, Feb 16, 2010 17:48, insgesamt einmal bearbeitet
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Das hier kommt mir seltsam vor:
Code: [AUSKLAPPEN] texture[x*y] = *pixmem32;
Nicht eher so? Code: [AUSKLAPPEN] texture[x*image->w+y] = ...
|
||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Hm, macht zwar Sinn, ändert aber leider nix am Problem.
Stimmt, aber, wenns funzen würde, würde es falsch übertragen worden sein^^" MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Nicdel |
![]() Antworten mit Zitat ![]() |
---|---|---|
Wo erstellst du das Array? | ||
Desktop: Intel Pentium 4 2650 Mhz, 2 GB RAM, ATI Radeon HD 3850 512 MB, Windows XP
Notebook: Intel Core i7 720 QM 1.6 Ghz, 4 GB DDR3 RAM, nVidia 230M GT, Windows 7 |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Am Anfang, anhand der Weite und Höhe wird das Array dann dimensioniert^^
Aber ich hab nen Brett vorm Kopf...natürlich muss es so aussehen: for(int y=0;y<image->h;y++) { for(int x=0;x<image->w;x++) { int bpp = image->format->BytesPerPixel; pixmem32 =(Uint32*)image->pixels+y*image->pitch +x*bpp; texture[x*image->w+y] = *pixmem32; } } Hm, jetzt funzt das zwar, aber die Textur wird nicht richtig übertragen...oder ich hab irgendwo was falsch gemacht.... ![]() Auf jeden Fall, danke^^ MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Code: [AUSKLAPPEN] for(int y=0;image->h;y++)
Was soll das denn? Solange image->h ungleich null ist, wird es als True ausgewertet und die Schleife wird zur Endlosschleife. X und Y werden ständig grösser und irgendwann adressierst du ins Nirvana. Richtig wäre das so Code: [AUSKLAPPEN] for(int y=0;y<image->h;y++)
Ausserdem ist der Code relativ unschön - du kannst in C++ natürlich alles explizit mit Zeigerarithmetik lösen, aber mach es lieber ohne Code: [AUSKLAPPEN] SDL_surface *image = IMG_Load("...");
Uint32* PixelBuffer = (Uint32*)image->pixels; for( int Y = 0; Y < image->h; Y++ ) for( int X = 0; X < image->w; X++ ) texture[ X + Y*TextureWidth ] = PixelBuffer[ Y*image->pitch + X ]; Das setzt vorraus, dass das Bild 32bbp besitzt, für allgemeine Fälle kannst du es ja umschreiben. Ich bin nicht mehr ganz sattelfest mit SDL, aber ist die Länge einer Zeile nicht image->w + image->pitch anstatt nur image->pitch? Das würde ich nochmal nachschauen. Und als letzter Tipp: Wenn das Bild und die Textur beide vom gleichgrossen Datentyp (in dem Fall also 32bit) sind, benutze doch memcopy ![]() |
||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Danke für deine Tipps Noobody^^
Hab ich bereits beherzigend umgeschrieben.Wusste zwar das des auch so geht, aber da ich nicht so 100%tig drin stecke, hab ichs lieber so gemacht, wie ichs noch im Kopf hatte. (BlitzMax schädigt XD Vielleicht kannst du mir ja noch bei nem anderen Problem helfen: https://www.blitzforum.de/upload/file.php?id=7977 Wie man sieht wird meine 64x64 Textur die eine Backsteinmauer darstellt irgendwie ausgelesen, nur nicht mit den korrekten Farben. Ich verwende ne Auflösung von 320x240 mit 8 Bit Farben, die Textur is im PNG-Format. Ich hab nun kA was ich da für Uint einstellen muss.Auf jeden Fall hab ich Farbverlust, bis zum erbrechen, wie man sieht. Ich hab auch nirgends ne hinreichende Erklärung zu den Bit-Größen gefunden. Hab das halbe Inet abgegrast. kA warum meine Textur derartig scheiße aussieht XD btw.: Die textur oben links hab ich zum Vergleichen eingefügt.Das ist quasi das was tatsächlich im Texturarray steht. Ich kann mir den Farbverlust allerdings nicht erklären^^" MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Könntest du mal den Code pasten, der sich um das Auslesen der Textur in den Bildschirm kümmert? Die Zeile mit der Definition des Texturarrays wäre auch nicht schlecht. | ||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Klar^^
Ich hab dazu eine Klasse "cTexture" geschrieben, die das Ganze etwas vereinfachen soll. Hier ist die loadTexture-Funktion der Klasse: Code: [AUSKLAPPEN] //diese Funktion läd das durch den Pfad angegebene Bild in einen Texturarray bool cTexture::loadTexture(const char *path) { //lokale Variablen //Uint8 *pixmem32; //Bild wird geladen image = IMG_Load("brick01.bmp"); if(image == NULL) { //sollte ein Fehler aufgetreten sein, wird er ausgegeben printf(IMG_GetError()); MessageBox(NULL,L"Texture load error",L"Can´t load texture image!",MB_OK); exit(1); } //der texturarry wird dimensioniert texLength = image->h*image->w; texture = new Uint8[texLength]; //das Bild wird gelockt if(SDL_MUSTLOCK(image)) SDL_LockSurface(image); Uint8* PixelBuffer = (Uint8*)image->pixels; for( int y = 0; y < image->h; y++ ) for( int x = 0; x < image->w; x++ ) texture[ x + y*texSize_X ] = PixelBuffer[ y*image->pitch + x ]; SDL_UnlockSurface(image); //Vorgang abgeschlossen return true; } Definiert wird der Array in der Header-Datei.Die sieht dann so aus: Code: [AUSKLAPPEN] //Header-Datei der Texture-Klasse #define texSize_X 64 #define texSize_Y 64 #include <vector> #include <math.h> #include <SDL.h> #include <SDL_gfxPrimitives.h> #include <windows.h> #include <SDL_image.h> //Deklaration der Textur-Klasse class cTexture { private: public: //Membervariablen //Array welcher die Farbinformationen der Textur in Uint8-Format enthält Uint8* texture; int texLength; SDL_Surface *image; //Funktionen //Konstruktor und Destruktor //cTexture(); ~cTexture(); //überladenen Ladefunktionen für //das Laden der Textur bool loadTexture(const char *path); }; Und hier dann die Ausgaberoutine.Die ist allerdings etwas kompliziert.Daher würde es jetzt den Rahmen hier sprengen meine komplette Renderroutine zu posten.Ich poste mal "nur" die Ausgaberoutine für die Textur, also nur dafür was oben links gezeichnet wird. Das ist nämlcih auch bereits fehlerhaft. Code: [AUSKLAPPEN] for( int y = 0; y < texSize_Y; y++ ) { for( int x = 0; x < texSize_X; x++ ) { PixelBuffer[ y*screen->pitch + x ] =texture[ x + y*texSize_X ]; } } Als Erklärung will ich hier nochmal sagen, dass ich mir mit dein Uint8/Uint16/Uint32 nicht sicher bin. Ich denke evtl. dass es daran liegt, dass Problem ist allerdings das ich maximal 8-bit-Farben verwende. Vielleicht liegt da der Fehler ich weiß es nicht. Mit Uint32 stürzt das Programm grundsätzlich mit einer Fehlermeldung ab.Mit Uint8 bekomme ich wenigstens oben gepostetes Gebilde XD Danke für deine Hilfe^^ MfG Ska EDT: SO!Ich habs jetzt geschlagene 4 Stunden versucht zu lösen und nur durch ZUFALL die richtige Lösung gefunden.Himmel Herr Gott noch eins, dass aber auch keine Sau dass irgendwo mal ordentlich dokumentieren kann is schrecklich. Waren 3 Fehler: 1. Fehler: Bilder die man mit der SDL_image-Libary läd müssen in das Format konvertiert werden, welches das Screen-Surface beinhaltet, ansonsten stimmt die Farfbinformation nicht. Am einfachsten läd man mit IMG_Load das Bild und speichert das Ergebnis per SDL_DisplayFormat(image) in das Bild das man dann verwenden will.Bild freigeben nicht vergessen. 2. Fehler: Wenn man dann schon nen 32-bit-PNG läd sollte man auch konsequent alles, was 32-bit-Farbinformationen speichern soll, mit Uint32 versehen.Ansonsten funzt da schonmal gar nichts. 3. Fehler: Anstatt screen->pitch screen->w oder image->w nutzen.kA warums mit Pitch nicht geht. Is mir auch Schnuppe.Geht auf jeden Fall nicht. So, endlich texturierte Wände.Hat viel zulange gedauert >_< Dafür kann das Ergebnis sich sehen lassen 100 - 200 FPS und das auf meinem Netbook^^ |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
![]() |
Noobody |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ist das Bild (brick01.bmp) denn wirklich 8-Bit? Überprüf mal die bbp des geladenen Bildes. | ||
Man is the best computer we can put aboard a spacecraft ... and the only one that can be mass produced with unskilled labor. -- Wernher von Braun |
![]() |
Skabus |
![]() Antworten mit Zitat ![]() |
---|---|---|
Ja ich hatte es als 256-Farben Bitmap gespeichert.
Ist allerdings doof, ich verwende lieber PNG.Und das ist halt soweit ich das mitbekommen hab 32-Bit groß. Wie gesagt, wenn nicht überall alles nur halbdokumentiert wäre, hätte ich das Problem nicht gehabt. Wenn 9 von 10 Quellen dir nur die Hälfte erzählen, muss du die 10. erstmal finden^^" Aber trotzdem danke!^^ MfG Ska |
||
"In einer so verrückten Welt, kann man um in ihr zu überleben nur eines tun, nämlich eben jenes werden: Ein Verrückter!" -Selbstzitat
aktuelles Projekt: Aves Certim - Der Galgen ist nicht weit! Ein SNES-RPG mit Handels- und Wirtschaftselemente. Infos?Hier: http://www.blitzforum.de/worklogs/234/ Besucht meine Seite: www.seelenfriedhof.de.vu |
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group