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

N1klas

Frischling

  • »N1klas« ist der Autor dieses Themas

Beiträge: 2

Beruf: Student

  • Private Nachricht senden

1

29.01.2009, 21:00

SDL Farbwert eines Pixels auslesen

hi,
ich habe mit der SDL ein Bild geladen, und möchte von diesem Bild die Farbe eines bestimmten Pixels in eine Variable speichern.

Ich habe schon versucht es selber zu lösen und, bin dabei auf die Funktion SDL_GetRGB gestoßen, weiß jedoch nicht wie ich sie anwenden soll.

Ich brauche den Farbwert des Pixels für eine Kollisionsabfrage, um zu überprüfen, ob der Pixel des Bildes, durchsichtig sein soll.

Ich bedanke mich schoneinmal :)

TrommlBomml

Community-Fossil

Beiträge: 2 117

Wohnort: Berlin

Beruf: Software-Entwickler

  • Private Nachricht senden

2

29.01.2009, 21:06

schaue dir mal SDL_LockSurface an ;)

NicoWe

Treue Seele

Beiträge: 126

Wohnort: Bielefeld / NRW

  • Private Nachricht senden

3

31.01.2009, 13:38

http://de.wikibooks.org/wiki/SDL:_Video

Da sollte sich was finden...
Erfolg ist die Fähigkeit, von einem Misserfolg zum anderen zu gehen,
ohne seine Begeisterung zu verlieren.
-Winston Churchill-

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

4

31.01.2009, 16:41

1. Surface auf dem du arbeiten willst locken:

C-/C++-Quelltext

1
SDL_LockSurface(deinSurface);  // evtl. noch rückgabewert beachten


2. Pixel format rausholen

Quellcode

1
SDL_PixelFormat *format =  deinSurface.format;


3. Pixel rausholen

C-/C++-Quelltext

1
2
3
Uint8 r,g,b;
r = g = b = 0;
SDL_GetRGB(PixelNr, format, &r, &g, &b);

Nun sollten in deinen variablen r, g, und b eben der rgb-farbwert des pixels stehen.

so verstehe ich zumindest die doku :)

N1klas

Frischling

  • »N1klas« ist der Autor dieses Themas

Beiträge: 2

Beruf: Student

  • Private Nachricht senden

5

31.01.2009, 23:38

hi,
ich bedanke mich schonmal für eure Antworten :)
Konnte leider nicht eher antworten.

Ich habe jetzt folgenden Code


C-/C++-Quelltext

1
2
3
4
5
6
7
8
SDL_LockSurface (MeinSurface);

SDL_PixelFormat *format =  MeinSurface->format;

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

        
SDL_UnlockSurface (MeinSurface->GetImage());


wie kann ich das jetzt weiter verarbeiten?
Muss ich die Uint8 Variablen (r,g,b) in Char casten, um es z.B. mit Cout in die Konsole auszugeben?

Bin leider noch nicht so gut mit c++, habe erst vor ca. 1 Monat wieder angefangen.

6

31.01.2009, 23:55

Ums in der Konsole auszugeben musst du es nicht casten. cout schluckt fast alles. ;)

Beneroth

Alter Hase

Beiträge: 969

Wohnort: Schweiz

Beruf: Software Entwickler

  • Private Nachricht senden

7

31.01.2009, 23:58

du kannst die r, g, und b ganz normal mit cout ausgeben (vermutlich sind es sogar schon char weil Uint8 ziemlich sicher ein unsigned char ist, aber man kann bei cout auch int und anderes ausgeben):

C-/C++-Quelltext

1
2
cout << "Der Farbwert des Pixels 15 ist:\n";
cout << "R: " << r << "G: " << g << "B: " << b << endl;

8

30.05.2012, 15:28

Der Beitrag ist zwar schon etwas älter, aber trifft fast mein Problem.

Bin gerade dabei für meinen Prof. einen Paintclone in C und SDL zu schreiben und ich breche hier gleich ins Essen. Unter anderem möchte er gerne die klassische Füllfunktion realisiert haben. Grundlage meiner Idee zur Lösung des Problems ist, das ich den Farbwert des Pixels n mit den Koordinaten x/y auslese. Und das will mir einfach nicht gelingen!

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
SDL_LockSurface (MeinSurface);

SDL_PixelFormat *format =  MeinSurface->format;

SDL_GetRGB(32100, format, &r, &g, &b);
        
SDL_UnlockSurface (MeinSurface->GetImage());

cout << "r: " << r << " g: " << g << " b: " << b << endl;


Die Ausgabe des Pixels ergibt für r, g und b aber nur ASCII-Schrott. Irgendwelche Zeichen. Oder die Ausgabe bricht ganz ab.

Außerdem finde ich es irgendwie total bescheuert, das ich ein Pixel nicht mit den Koordinaten x/y ansprechen kann, sondern aus den Koordinaten noch erst die fortlaufende Nummer berechnen muss. Gibt es da nicht evtl. auch eine schönere Lösung mit Koordinaten? Das Problem macht mich jedenfalls voll fertig und ich bin kurz vorm Platzen.

Für Hilfe wäre mein Blutdruck echt dankbar...

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

9

30.05.2012, 15:40

Offset = datasize * (y * linewidth + x)

Das ist doch nun wirklich kein Beinbruch und wenn Du's brauchst, schreibt Dir eine Funktion dafür.

Der "ASCII-Schrott" kommt wohl daher, dass Du chars ausgibst, welche für cout nun mal "ASCII-Zeichen" sind. Wie wäre es mit einem Cast in einen int? Wahlweise in einen unsigned-Typ, das macht sich mit dem Vorzeichen besser, sonst brichst Du wieder in Dein Essen.
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]

10

30.05.2012, 15:51

Klappt nicht!

Nur um das zu klären, das ich da nicht noch irgendwo nen Fehler mache:

Bei einem Surface von 800*600 Pixel, hat das Pixel in der Mitte folgende Nummer:
299 Zeilen * 800 Spalten + 400 Pixel = 239600
Fängt der bei 0 oder 1 an zu Zählen?

Jedenfalls ist an dieser Stelle auf weiter Flur nur 255 255 255 zusehen.

cout << "r: " << (int)rc << " g: " << (int)gc << " b: " << (int)bc << endl;
Das Ergebnis ist aber (gecastet): r: 165 g: 255 b: 132

Werbeanzeige