Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

29.07.2014, 23:54

Farben eines Pixels einer Bitmap auslesen

Hallo! :)
Dies ist mein erster Post hier auf dieser Seite, ich hoffe also dass ich mich im richtigen Forum befinde :whistling:
Zu meinem Problem:
Ich bin dabei eine Funtkion zu schreiben, mit der ich die Farben (R, G, und B Wert als int) eines Pixels (x, y) auslese.
Bis jetzt bin ich so weit:

Header:
...
SDL_Surface *m_pBitmap;
Uint8 r, g, b;
SDL_PixelFormat *format;
...

Funktionen:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void GetRGB()
{
    m_pBitmap = new SDL_Surface();
    m_pBitmap = SDL_LoadBMP ("Data/Bild.bmp");
    if (m_pBitmap != NULL)
        cout << "Bitmap wurde geladen" << endl;

    SDL_LockSurface (m_pBitmap);

format = new SDL_PixelFormat;format =  m_pBitmap->format;   Uint32 pixel = get_pixel32(m_pBitmap, 0, 0);

    SDL_GetRGB(pixel, format, &r, &g, &b);

    cout << "Rot: " << (int)(r) << " Grün: " << (int)(g) << " Blau: " << (int)(b) << endl;
    cout << "BytesPerPixel: " << (int) m_pBitmap->format->BytesPerPixel;
    cout << endl;

    SDL_UnlockSurface (m_pBitmap);
}

Uint32 get_pixel32( SDL_Surface *surface, int x, int y )
{
    //Convert the pixels to 32 bit
    Uint32 *pixels = (Uint32 *)surface->pixels;
    
    //Get the requested pixel
    return pixels[ ( y * surface->w ) + x ];
}


Die erste habe ich selbst geschrieben, die zweite von Lazy Foo.

Mein Problem ist nun, dass das Programm abstürzt, wenn diese Zeile aufgerufen wird:
SDL_GetRGB(pixel, format, &r, &g, &b);


Wäre nett, wenn mir jemand sagen kann, woran das liegt.
Wenn ich irgend welche Informationen vergessen haben sollte, einfach Schreiben ;)
Gruß,
4I_Fr3d0

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »4I_Fr3d0« (30.07.2014, 22:34)


David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

30.07.2014, 00:17

Wo sind denn r, g und b definiert?
Und ist der Zeiger format gültig?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

30.07.2014, 06:45

Wenn das Format nicht 32-Bit ist, hat der Code so oder so ein Problem.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

30.07.2014, 07:53

Sorry, das habe ich vergessen :S
Habs in der Header-Datei geschrieben.
Gruß

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

5

30.07.2014, 09:26

Meine Frage nach der Gültigkeit des format-Pointers hast du nicht beantwortet.
Und bist du sicher, dass das Programm wirklch in dieser Zeile abstürzt?
Was sagt der Debugger?

6

30.07.2014, 14:55

Sorry, aber wie ist das Gemeint mit der Gültigkeit? :S Meinen Sie damit den Gültigkeitsbereich? Wenn ja, dann ist Format schon gültig.

Wenn ich diese Zeile auskommentiere, stürzt das Programm nicht ab. Ebenso wenn ich vor und nach dieser Zeile einen Text in die Konsole schreibe, wird nur der Text davor angezeigt.
Debuggen kann ich irgendwie nicht, da mein Programm, wenn ich den Debugger aufrufe, eine Bitmap nicht finden kann (Die Bitmap hat nichts mit den beiden Funktionen zu tun. Diese sind nur Teile meines Programms). Wenn ich es normal ausführe, funktioniert es einwandfrei. Vielleicht ist mein Debugger nicht richtig konfiguriert? :huh:

7

30.07.2014, 16:29

Zeigt 'Format' auf einen gültigen Speicherbereich? Wenn das Bild nicht geladen wird, nicht. Das mit dem Debugger liegt wahrscheinlich am falschen Arbeitsverzeichnis. Probiere mal für diesen Zweck einen absoluten Pfad.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

8

30.07.2014, 17:53

Ja, ich meinte, ob der Zeiger nicht vielleicht irgendwo ins Nirwana zeigt.
Und wir reden uns hier übrigens mit "du" an.

9

30.07.2014, 20:21

Ok, ich werde Absolute Pfade verwenden und mein Ergebnis dann hier posten.
Also zum Zeiger:
Ich initialisiere meine Variablen mit:

C-/C++-Quelltext

1
2
3
    m_pBitmap = NULL;
    r = g = b = 0;
    format = NULL;


Ok, ich werde mich bemühen David ;)

FSA

Community-Fossil

  • Private Nachricht senden

10

30.07.2014, 21:37

Teste doch mal folgenden Code:

C-/C++-Quelltext

1
2
3
int* myInt = nullptr;

int anotherInt = *myInt;

Vielleicht wird dann klarer, dass man mit einem Null-Zeiger nicht arbeiten kann.

Zitat

Der RCCSWU (RandomCamelCaseSomtimesWithUndersquare) Stil bricht auch mal mit den veraltet strukturierten Denkmustern und erlaubt dem Entwickler seine Kreativität zu entfalten.

Werbeanzeige