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

idontknow

unregistriert

11

08.09.2010, 20:53

Ganz ehrlich: deine Rechnungen kapier ich gerade leider gar nicht :/. Steh vmtl auf der Leitung^^
edit: habs..

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »idontknow« (08.09.2010, 21:02)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

12

08.09.2010, 21:07

Ganz ehrlich: deine Rechnungen kapier ich gerade leider gar nicht :/. Steh vmtl auf der Leitung^^
edit: habs..


Wie sieht deine Lösung denn jetzt aus?
@D13_Dreinig

idontknow

unregistriert

13

08.09.2010, 21:09

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
if((x * 3) % 4 != 0)
        {
            int padding = 4 - ((x * 3) % 4);
            for(int i = 0; i < padding; ++i)
            {
                char c = 0;
                fileStream.write(reinterpret_cast<char*>(&c), sizeof(char));
            }
        }


Aber etwas stimmt damit noch nicht, denn jeedesmal wenn ich eine "padding-situation" habe ist das allerletzte Pixel, also unterste Reihe ganz rechts, grau (unabhängig der Farbe die ich gewählt habe). Ist aber definitiv nicht weiß.... ich verstehe nur nicht warum.

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

14

08.09.2010, 21:22

Sieht auf den ersten Blick ok aus. Kannst du den Code + fehlerhaftem Beispiel posten?
@D13_Dreinig

idontknow

unregistriert

15

08.09.2010, 21:32

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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <Windows.h>
#include <string>
#include <fstream>

void createBitmap(const std::string& filename, unsigned int width, unsigned int height, DWORD* pixeldata)
{
    std::fstream fileStream(filename, std::ios::binary | std::ios::out);
    BITMAPFILEHEADER fileHeader = {0x4D42,
                               54 + width * height * 3 + ((width * 3) % 4) * height,
                               0,
                               0,
                               54};
    BITMAPINFOHEADER fileInfoHeader = {40, width, height * (-1), 1, 24, BI_RGB, 0, 0, 0, 0, 0};

    /* BitmapFileHeader */
    fileStream.write(reinterpret_cast<char*>(&fileHeader.bfType), sizeof(WORD));
    fileStream.write(reinterpret_cast<char*>(&fileHeader.bfSize), sizeof(DWORD));
    fileStream.write(reinterpret_cast<char*>(&fileHeader.bfReserved1), sizeof(WORD));
    fileStream.write(reinterpret_cast<char*>(&fileHeader.bfReserved2), sizeof(WORD));
    fileStream.write(reinterpret_cast<char*>(&fileHeader.bfOffBits), sizeof(DWORD));

    /* BitmapInfoHeader */
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biSize), sizeof(DWORD));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biWidth), sizeof(LONG));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biHeight), sizeof(LONG));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biPlanes), sizeof(WORD));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biBitCount), sizeof(WORD));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biCompression), sizeof(DWORD));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biSizeImage), sizeof(DWORD));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biXPelsPerMeter), sizeof(LONG));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biYPelsPerMeter), sizeof(LONG));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biClrUsed), sizeof(DWORD));
    fileStream.write(reinterpret_cast<char*>(&fileInfoHeader.biClrImportant), sizeof(DWORD));
    
    DWORD *pdataptr = pixeldata;
    for(unsigned int y = 0; y < height; ++y)
    {
        pdataptr = pixeldata + width * y;
        unsigned int x = 0;
        for(; x < width; ++x)
        {
            pdataptr += x;
            DWORD pixel = *pdataptr;
            char bgr[3] = {(pixel & 0x000000ff) >>  0,
                           (pixel & 0x0000ff00) >>  8,
                           (pixel & 0x00ff0000) >> 16};
            fileStream.write(reinterpret_cast<char*>(&bgr), sizeof(char) * 3);
        }
        if((x * 3) % 4 != 0)
        {
            int padding = 4 - ((x * 3) % 4);
            for(int i = 0; i < padding; ++i)
            {
                char c = 0;
                fileStream.write(reinterpret_cast<char*>(&c), sizeof(char));
            }
        }
    }
    
     
    fileStream.close();
}

int main()
{
    DWORD bmp[21] = {0, 0, 0, 
                     0, 0, 0, 
                     0, 0, 0, 
                     0, 0, 0, 
                     0, 0, 0, 
                     0, 0, 0, 
                     0, 0, 0};
    createBitmap("mybmp.bmp", 7, 3, &bmp[0]);
    return 0;
}


Komischerweise habe ich jetzt noch mehr Pixel Fehler drin wie man sieht, kann sie mir aber nicht erklären!
»idontknow« hat folgende Datei angehängt:
  • mybmp.bmp (126 Byte - 129 mal heruntergeladen - zuletzt: 20.04.2024, 06:23)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

16

08.09.2010, 21:46

Ja, da sind noch zwei kleine Fehler im Code. Einmal musst du das Bild mit createBitmap("mybmp.bmp", 3, 7, &bmp[0]); erzeugen, zum anderen schreibst du die falschen Farbwerte (bzw liest die falschen Farben aus dem Quellpuffer):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
for(; x < width; ++x, ++pdataptr)
{
        //pdataptr += x;
        DWORD pixel = *pdataptr;
        char bgr[3] = {(pixel & 0x000000ff) >>  0,
                (pixel & 0x0000ff00) >>  8,
                (pixel & 0x00ff0000) >> 16};
        fileStream.write(reinterpret_cast<char*>(&bgr), sizeof(char) * 3);
}


Zum Schluss noch ein paar Tipps:

o Verwende sizeof(BITMAPFILEHEADER) und sizeof(BITMAPINFOHEADER) statt den hardgecodeten "magischen" Zahlen
o Die Filesize ist immer noch falsch
o Du kannst bedenkenlos die Headerinfos in einem "Rutsch" schreiben (wurde vorhin bereits erwähnt):

C-/C++-Quelltext

1
2
fileStream.write(reinterpret_cast<const char*>(&fileHeader), sizeof(fileHeader));
fileStream.write(reinterpret_cast<const char*>(&fileInfoHeader), sizeof(fileInfoHeader));


Genauso kannst du die Paddingbyte einfach übersprüngen (per seekg)
@D13_Dreinig

idontknow

unregistriert

17

08.09.2010, 22:02

Ja, da sind noch zwei kleine Fehler im Code. Einmal musst du das Bild mit createBitmap("mybmp.bmp", 3, 7, &bmp[0]); erzeugen, zum anderen schreibst du die falschen Farbwerte (bzw liest die falschen Farben aus dem Quellpuffer):


warum 3/7? Ich weiß die Anordnung meiner 21 Farbwerte ist falsch, aber das mach tdoch nichts aus am Endergebnis (außer dass mein Bild"format" eben nicht stimmt!


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
for(; x < width; ++x, ++pdataptr)
{
        //pdataptr += x;
        DWORD pixel = *pdataptr;
        char bgr[3] = {(pixel & 0x000000ff) >>  0,
                (pixel & 0x0000ff00) >>  8,
                (pixel & 0x00ff0000) >> 16};
        fileStream.write(reinterpret_cast<char*>(&bgr), sizeof(char) * 3);
}


Wieso lese ich die Werte falsch aus? Ich muss sie ja im bgr Format in der Datei abspeichern!


Zum Schluss noch ein paar Tipps:

o Verwende sizeof(BITMAPFILEHEADER) und sizeof(BITMAPINFOHEADER) statt den hardgecodeten "magischen" Zahlen
o Die Filesize ist immer noch falsch
o Du kannst bedenkenlos die Headerinfos in einem "Rutsch" schreiben (wurde vorhin bereits erwähnt):

C-/C++-Quelltext

1
2
fileStream.write(reinterpret_cast<const char*>(&fileHeader), sizeof(fileHeader));
fileStream.write(reinterpret_cast<const char*>(&fileInfoHeader), sizeof(fileInfoHeader));


Genauso kannst du die Paddingbyte einfach übersprüngen (per seekg)


Okey das direkte schreiben der Structs werd ich machen, aber was meinst du mit Paddingbyte überspringen? Ich muss ja im Prinzip ein "genulltes" Byte abspeichern!

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

18

08.09.2010, 22:10


warum 3/7? Ich weiß die Anordnung meiner 21 Farbwerte ist falsch, aber das mach tdoch nichts aus am Endergebnis (außer dass mein Bild"format" eben nicht stimmt!


In deinem Beispiel sah es aus als wolltest du ein 3 x 7 Bitmap speichern... Vllt hab ich das missinterpretiert.


Wieso lese ich die Werte falsch aus? Ich muss sie ja im bgr Format in der Datei abspeichern!


Das mein ich nich, beachte den ausgeklammerten Teil!


Okey das direkte schreiben der Structs werd ich machen, aber was meinst du mit Paddingbyte überspringen? Ich muss ja im Prinzip ein "genulltes" Byte abspeichern!


Nein was da drin steht ist egal. Allerdings mag std::fstream ein seek am "Ende" des Streams nicht, bzw trimmt das beim schließen wieder... Schade. Also musst du wohl doch Werte schreiben, wenn du fstream verwenden willst, aber da reicht ein:

C-/C++-Quelltext

1
2
const char filler[4] = {};
fileStream.write(filler, padding);
@D13_Dreinig

idontknow

unregistriert

19

08.09.2010, 22:13

Du hast nichts fehlinterpretiert ich wollte eig. ein 3x7 BMP FIle haben, aber das ist grundsätzlich zum testen ja egal :).

@Farben auslesen: Naja ich übergebe meine Farben im rgb Format und konvertiere sie direkt beim auslesen in ein bgr Format. Ich komm nicht ganz darauf was da falsch ist .... :(

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

20

08.09.2010, 22:18

@Farben auslesen: Naja ich übergebe meine Farben im rgb Format und konvertiere sie direkt beim auslesen in ein bgr Format. Ich komm nicht ganz darauf was da falsch ist .... :(


Das Inkrementieren von pdataptr ist falsch:

C-/C++-Quelltext

1
2
3
for(; x < width; ++x, ++pdataptr) // <-- hier neues Inkrementieren
{
        //pdataptr += x; <------- vorhin erwähnter ausgeklammerter Code
@D13_Dreinig

Werbeanzeige