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

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

1

22.07.2009, 15:48

Seltsames Problem mit .bmp-Dateien

Hey,

ich versuche grade für ein paar Experimente eine Art "Mini-Software-Pixel Shader"-Projekt für Bilder zu erstellen.

Ich will einfach ein x*y-Array aus RGB-Werten erstellen und dann einen Function Pointer zu einer Funktion angeben, die dann die Farbe an diesem Pixel errechnet. Zum Schluss will ich das Bild als .bmp speichern.

Funktioniert bisher auch einwandfrei, allerdings bin ich auf ein paar _sehr_ seltsame Fehler mit der erzeugten Bilddatei gestoßen.

Erstmal der für euch interessante Code:

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
typedef unsigned char   uchar;
struct Color
{
    uchar b;
    uchar g;
    uchar r;

    //Auf 4 Byte auffüllen, später vmtl. Alpha

    uchar _UNUSED;
};

//X ist der X-Wert des Pixels an der Stelle

//Y ist der Y-Wert des Pixels an der Stelle

//ptr ist ein Pointer auf den Farbwert an der Stelle

void ShaderFunction( uint x, uint y, Color* ptr )
{
    static const float Scaler = 1.1f;

    ptr->r      = (uchar)(float(x) * Scaler);
    ptr->g      = 0;
    ptr->b      = 0;
}


Und hier noch die Funktion, mit der ich die .bmp-Datei speichere:

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
    bool        SaveToFile( const char* filename )
    {
        BITMAPFILEHEADER fileheader;
        memset(&fileheader,0,sizeof(BITMAPFILEHEADER));

        fileheader.bfType       = 19778; // "BM"

        fileheader.bfSize       =   sizeof(BITMAPFILEHEADER)    //Header 1

                                    + sizeof(BITMAPINFOHEADER)  //Header 2

                                    + 4*ImageWidth*ImageHeight; //Bilddaten

        fileheader.bfOffBits    = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);

        BITMAPINFOHEADER infoheader;
        memset(&infoheader,0,sizeof(BITMAPINFOHEADER));

        infoheader.biSize           = sizeof(BITMAPINFOHEADER);
        infoheader.biWidth          = ImageWidth;
        infoheader.biHeight         = -1 * ImageHeight;
        infoheader.biPlanes         = 1;
        infoheader.biBitCount       = 32;
        infoheader.biCompression    = BI_RGB;
        infoheader.biSizeImage      = 4*ImageWidth*ImageHeight;
        infoheader.biXPelsPerMeter  = 0;
        infoheader.biYPelsPerMeter  = 0;
        infoheader.biClrUsed        = 0;
        infoheader.biClrImportant   = 0;

        ofstream file;
        file.open(filename);

        file.write((const char*)&fileheader,sizeof(fileheader));
        file.write((const char*)&infoheader,sizeof(infoheader));
        for (uint y=0;y<ImageHeight;y++)
        {
            for (uint x=0;x<ImageWidth;x++)
            {
                static char tmp=0;
                file.write((const char*)(&_Data[x+y*ImageWidth]),3);
                file.write(&tmp,1);
            }
        }


        file.close();
        return true;
    }


So und nun das Problem: Wenn der "Scaler" aus der ShaderFunction oben zwischen 1.1 und 2.0 liegt, funktioniert alles einwandfrei und ich erhalte dieses Bild:

http://ulumulu.de.dd22906.kasserver.com/Gandi/EinsKommaEins.bmp

Liegt er über 2.0, erhalte ich sowas hier. Ist aber auch verständlich, da bei einer Bildbreite von 128 Pixeln das Maximum vom uchar überschritten wird.

http://ulumulu.de.dd22906.kasserver.com/Gandi/ZweiKommaVier.bmp

Liegt er unter 1.1, erhalte ich das hier (und das ist mir völlig unverständlich)

http://ulumulu.de.dd22906.kasserver.com/Gandi/EinsKommaNull.bmp

Ich hab schon versucht, irgendwie einen Zusammenhang festzustellen, aber Problem tritt scheinbar völlig willkürlich auf. Wenns hilft, kann ich auch noch mehr Code posten. Hoffe ihr habt irgend eine Idee^^

Gruss
Gandi

Edit: Image-Tag scheint irgendwie nicht zu funktioneren, müsst euch halt mit Strg + C + V behelfen^^


Liegt am BMP-Format (png, jpg oä. verwenden). ;)
Hab die img-Tags entfernt
TrikkieMikkie

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

2

22.07.2009, 16:14

das bmp format hat aber nur rgb. das 4te byte ist zuviel und kann für
das aussehen verantwortlich sein
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

3

22.07.2009, 16:28

Bei 32-Bit-Bitmaps bleiben 8 Bit ungenutzt, ist aber möglich. Ich hatte zuerst 24 Bit eingestellt, aber die gleichen Probleme. Aus Testzwecken hab ichs dann mal auf 32 bit geändert.

Löst das Problem jedenfalls nicht.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

22.07.2009, 19:07

Du hast das binary Flag für dein File vergessen.

Gandi

Frischling

  • »Gandi« ist der Autor dieses Themas

Beiträge: 36

Wohnort: Bayern

Beruf: Elektrotechnikingenieur

  • Private Nachricht senden

5

22.07.2009, 19:24

Lol, das wars tatsächlich...

Kopf->Tisch

Danke^^

Werbeanzeige