Suchergebnisse
Suchergebnisse 1-19 von insgesamt 19.
Ja, als Integer. Ich müsste dann erst aus den dezimalen Integern einen Hex-Char bauen und das dann mit sprintf in umgekehrte Reihenfolge auslesen und auf meiner Variablen speichern. Die Vorgehensweise finde ich irgendwie Dackelkacke. Dafür gibt es ja SDL_MapRGBA, wäre nur fett wenn ich das korrekt ans laufen bekommen würde und ich nicht dafür das Rad neu erfinden muss. In der Beschreibung von SDL_MapRGBA habe ich folgendes entdeckt: Quellcode 1 If the specified pixel format has no alpha componen...
Das nutzt mir nix... Ich will das Ergebnis von getcolor() vergleichen und eigentlich gar nicht ausgeben. Ich hatte schon dran gedacht, mit sprintf() mir nen String zu bauen und damit zu arbeiten. Aber das ist voll in die Hose gegangen. Da die anderen Farben in diesem "Uint32" vorliegen.
So, wie gewünscht, habe ich ein kleines Demoprogramm geschrieben, das mein Problem veranschaulicht. Ausgabe: Referenzfarbe: ff0000ff Ausgelesene einzelne 8-Bit Kanäle: r: 255 g: 0 b: 0 alpha: 255 Ausgelesene Farbe: ff0000 Wie man sieht, geht mir irgendwie der Alpha-Kanal verloren. Relevant dürfte da die Fkt. getcolor sein. Zeile 65 bis 83... 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 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 5...
Da habe ich aber noch eine Frage! Sollte mir: C-/C++-Quelltext 1 2 Uint32 ausgabe = SDL_MapRGBA(s->format, rc, gc, bc, ac); cout << "Ausgabe: " << hex << ausgabe << endl; Nicht Ausgabe der Form ff0000ff für volles rot bekommen? Die Ausgabe die ich bekomme lautet aber: ff0000 für rot... Wobei mir C-/C++-Quelltext 1 SDL_GetRGBA(p, format, &rc, &gc, &bc, &ac); Mir für Alpha( == ac) noch nen dezimalen Wert von 255 liefert. Das Surface habe ich dann auch mit nem 32Bit Farbraum angelegt, aber bei der ...
C-/C++-Quelltext 1 screen = SDL_SetVideoMode(800, 600, [b]16[/b], SDL_HWSURFACE); Besser: C-/C++-Quelltext 1 screen = SDL_SetVideoMode(800, 600, [b]24[/b], SDL_HWSURFACE); Da habe ich Trottel gar nicht drüber nachgedacht! Ich will nen 24Bit Farbwert, aber mein Surface hat nur 16... Das kann ja nicht klappen...
Die Variablen habe ich am Anfang der Fkt definiert, in welcher ich dieses Gelumpe unter anderem nutzen möchte: C-/C++-Quelltext 1 Uint8 rc, gc, bc, ac; Ich schreibe nicht direkt in die Variablen, weil das schlicht nicht geht: Quellcode 1 Invalid arguments ' Candidates are: void SDL_GetRGBA(unsigned int, const SDL_PixelFormat *, unsigned char *, unsigned char *, unsigned char *, unsigned char *) ' Oder was meinst du jetzt?
Wenn ich ein rotes Pixel (gesetzt mit 0xff00ff) auslese, bekomme ich für rc = 255 gc = 0 bc = 0 ac= 255 Also das hat dann mal geklappt, würde ich sagen.
Die Farbe und das Pixel passen. Da ich zum einen schon das ganze Surface mit Rot eingefärbt habe und die Ausgabe der Farbwerte aus r, g, b und a passen. Erst wenn ich die Werte in SDL_MapRGBA reingesteckt habe, kommt Schrott raus. C-/C++-Quelltext 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Uint32 farbe = 0xff0000ff //rot in hex-Darstellung //Pixel holen, die ganze Fläche ist vorher auf 0xff0000ff gesetzt worden. SDL_LockSurface (s); SDL_PixelFormat *format = s->format; Uint32 p = getp...
Das GetRGBA funktioniert. Auch die Werte die in r, g, b und a stehen sich Plausibel. Nur wenn ich dann Versuche mit SDL_MapRGBA aus den vier einzelnen 8Bit Werten für r, g, b und a einen 32-Bit hex-Wert zu generieren, schlägt das Fehl: Ausgabe: C-/C++-Quelltext 1 2 3 r: ff g: 0 b: 0 alpha: ff //Ausgabe der einzelnen Werte für jeden Kanal Ausgabe: f800 //Ergebnis von SDL_MapRGBA Farbe: ff0000ff //Referentwert für Rot C-/C++-Quelltext 1 2 3 4 5 6 Uint32 farbe = 0xff0000ff; Uint32 ausgabe = SDL_Map...
Hat leider nicht viel genützt... Aber vielleicht mache ich da auch noch was Falsch. Mit Pointern stehe ich immer noch ein wenig auf Kriegsfuß... Die Fkt. die nutze, sagt mir folgendes: C-/C++-Quelltext 1 SDL_GetRGBA(Uint32 pixel, const SDL_PixelFormat * const fmt, Uint8 *r, Uint8 *g, Uint8 *b, Uint8 *a); Für r, g, b und a erwartet GetRGBA einen Pointer. Wenn ich hier jetzt die Adresse meiner Variablen mittels &r, &g, &b und &a an die Fkt. übergebe, dann kann ich mir doch ein Konstrukt wie dieses...
Oh... Macht Sinn... Werde ich gleich mal ausprobieren.
Hallo Forum! Ich suche mir das gerade schon die Finger blutig... Gestern habe ich es mit Hilfe aus dem Forum endlich hinbekommen, den Farbwert eines Pixels aus einem SDL-Surface auszulesen: C-/C++-Quelltext 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 Uint32 farbe = 0xff0000ff //rot in hex-Darstellung SDL_LockSurface (s); SDL_PixelFormat *format = s->format; Uint32 p = getpixel(s, x, y); SDL_GetRGBA(p, format, &r, &g, &b, &a); SDL_UnlockSurface (s); Uint32 ausgabe = SDL_MapRGBA(format, rc, gc, bc, ac); /...
Ähm... Jetzt noch eine andere Frage, gibt es eine fertige Fkt. um aus dem RGB (255 255 255) die hexadezimale Darstellung der Farbe in einem String zu bauen? Jaja www.gidf.de, aber Goolge war in der Hinsicht nicht mein Freund, oder ich habe einen unpräzise Angaben bei der Suche gemacht. http://sdl.beuc.net/sdl.wiki/SDL_MapRGB hat irgendwie nicht zum gewünschten Ergebnis geführt.
Fehler gefunden: C-/C++-Quelltext 1 2 3 4 5 6 7 SDL_LockSurface (s); SDL_PixelFormat *format = s->format; Uint32 p = getpixel(s, 400, 300); //Uint32 muss es heißen... SDL_GetRGB(p, format, &rc, &gc, &bc); SDL_UnlockSurface (s); cout << "r: " << (int)rc << " g: " << (int)gc << " b: " << (int)bc << endl; Jetzt kommt endlich das richtige raus! Danke dir!
Ok, das richtige Pixel scheine ich jetzt zu treffen. Bei weißen Pixeln gibt mir C-/C++-Quelltext 1 2 3 4 5 6 7 SDL_LockSurface (s); SDL_PixelFormat *format = s->format; Uint8 p = getpixel(s, 400, 300); SDL_GetRGB(p, format, &rc, &gc, &bc); SDL_UnlockSurface (s); cout << "r: " << (int)rc << " g: " << (int)gc << " b: " << (int)bc << endl; folgendes aus: r: 0 g: 28 b: 255 Bei roten Pixeln (255 0 0) bekomme ich r: 0 g: 0 b: 0 Irgendwas scheint da noch nicht zu passen.
Aha! Wenn ich das richtig verstehe, enthält p dann die Adresse des Pixels, so das ich das so verwenden kann: C-/C++-Quelltext 1 SDL_GetRGB(32100, format, &r, &g, &b); ???
Ok, ich weiß jetzt zwar nicht ob width == linewidth ist, aber mein Surface hat die Dimensionen 800x600, da bin ich mir sicher: screen = SDL_SetVideoMode(800, 600, 16, SDL_HWSURFACE);
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
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_PixelForm...