Du bist nicht angemeldet.

Werbeanzeige

1

30.01.2015, 12:35

Sdl Pixelmanipulation zeigt falsche Farben an

Hey Leute

Ich arbeite momentan daran, bmp Bilder Manuell zu laden und dieses dann in eine SDL_Surface zu packen.

Das ganze klappt auch soweit, nur werden falsche Farbwerte angezeigt, das Bild soll z.b Pink im Hintergrund sein, ich bekomme aber ein Rot.


Als aller erstes, die Pixel sind richtig geladen, und der Aufbau des Bildes ist auch richtig, sind halt nur die falschen Farben

Habe die einzelnen Pixel als unsigned char gespeichert, in einer Struktur

Struktur:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
struct BMP24Bit{


unsigned char Red;
unsigned char Green;
unsigned char Blue;
unsigned char Alpha;

};



Und so caste ich momentan die Chars in ein Uint32
Habe das in google gefunden, aber bin nir nicht sicher ob das der richtige weg ist



C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
for(int Height=0; Height<Infoheadi.HeightOfBitmapinPixel; Height++)
{
    for(int Width=0; Width<Infoheadi.WidthOfBitmapinPixel; Width++)
    {

          Uint32  num = (Uint32)Pixels[Height][Width].Red << 24|
                   (Uint32)Pixels[Height][Width].Green <<16|
                    (Uint32)Pixels[Height][Width].Blue << 8 |
                        (Uint32)Pixels[Height][Width].Alpha;

           pixels[Height*64+Width]=num;
    }
}


Danke schonmal für die Hilfe

Gruß Leri :)

Nimelrian

Alter Hase

Beiträge: 1 262

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

30.01.2015, 12:38

Ich bin verwirrt, du hast da ein Struct namens BMP24Bit, das hält aber 32 Bit.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

Architekt

Community-Fossil

Beiträge: 2 496

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

3

30.01.2015, 12:41

Warum machst du das eig.? Einfach zum lernen?
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

4

30.01.2015, 12:41

Es sollte anfangs nur eine 24 Bitmap Geladen werden, SDL nimmt aber meines wissens nur 32 bit egal was man letztendlich benutzt.

Habe es nur kurz geändert,weil ich alpha nicht direkt in die for schreiben wollte :)

5

30.01.2015, 12:43

Ja das ganze ist rein aus Interesse. Möchte hat mein Wissen erweitern :), da ich bis jetzt immer nur die Funktionen der SDL dafür genutzt habe.

Architekt

Community-Fossil

Beiträge: 2 496

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

6

30.01.2015, 12:54

Ja das ganze ist rein aus Interesse. Möchte hat mein Wissen erweitern :), da ich bis jetzt immer nur die Funktionen der SDL dafür genutzt habe.

Kannst ja mal gucken, wie die SDL das macht: http://hg.libsdl.org/SDL/file/01966f6fea…o/SDL_bmp.c#l81
Vllt. fällt dir dann auf, was schief läuft.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

7

30.01.2015, 12:54

bei red muss 32 bit hin oder ? ^^


Hab gerade nochmal geschaut und einfach mal 32 eingesetzt

So funktioniert es

C-/C++-Quelltext

1
2
3
4
 Uint32  num = (Uint32)Pixels[Height][Width].Red << 32 |
                       (Uint32)Pixels[Height][Width].Green <<8|
                       (Uint32)Pixels[Height][Width].Blue << 16 |
                       (Uint32)Pixels[Height][Width].Alpha;



Werde mir das ganze mal anschauen :).

Möchte das ganze ja auch verstehen :)

Danke für deinen Link

8

30.01.2015, 13:01

Also deine Bitmap besteht aus einem Array von BMP24Bit? Erstens sind bei BMP's Rot und Blau vertauscht, Zweitens sind die Pixel bei BMP immer auf 4 Byte ausgerichtet, das heißt nach jedem RGB-Wert kommt ein extra padding-Byte dazu, und Drittens wird dein Compiler vermutlich die Member deiner BMP24Bit Struktur auf 32 Bit ausrichten, d.h. nach jedem Red, Green, Blue und Alpha, die eigentlich nur 1 Byte groß sein sollten, kommen 3 Byte padding dazu. BMP24Bit wäre im Release Modus womöglich 16 Byte groß.

David Scherfgen

Administrator

Beiträge: 10 198

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

30.01.2015, 13:05

Zweitens sind die Pixel bei BMP immer auf 4 Byte ausgerichtet, das heißt nach jedem RGB-Wert kommt ein extra padding-Byte dazu

Das stimmt nicht. (wäre ja auch total bescheuert)

10

30.01.2015, 13:08

Habe es gerade ausprobiert ist noch nicht wirklich das was ich möchte.

Dafür bin ich ja am üben, hab mir auf wiki den Aufbau der Bmp Datei angschaut und hab mich halt danach gerichtet.

Also sollte ich dann doch mit uint8 für die Pixel arbeiten?

Das mit dem Padding byte kann ich nicht bestätigen, bei mir wird die bmp sauber geladen.

Bei der Farbgebung hast du allerdings recht im Release Modus.

Werbeanzeige