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

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

11

07.03.2011, 20:28


Das nennt sich glaub ich Dword-Alignment oder so ^^
Wie ich das löse muss ich noch mal gucken.


Das ist einfach. Du musst dafür nur die Anzahl der Paddingbytes berechnen und nach dem einlesen einer Scanline entsprechend viel Bytes überspringen:

C-/C++-Quelltext

1
2
3
4
int numPaddingBytes = 4 - (lineWidth & 3);

// - lineWidth Byte lesen
// - numPaddingBytes Byte überspringen
@D13_Dreinig

12

07.03.2011, 22:02

@David_pb
Vielen Dank!
Klappt super, nur muss es doch so sein

C-/C++-Quelltext

1
int numPaddingBytes = lineWidth & 3;

Zumindest wenn ich ifstream::seekg() zum überspringen benutzen will.
Oder hab ich etwasfalsch verstanden?

Edit: Quatsch! Denkfehler, du hast recht ;)

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von ».:!Batzer!:.« (07.03.2011, 22:07)


David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

13

07.03.2011, 22:35

Edit: Quatsch! Denkfehler, du hast recht ;)


Ja, aber den Fall bedenken wenn die Scanlinebreite durch 4 teilbar ist (Dann bekommst du mit dem obigen Code nämlich 4 raus (4-0).
@D13_Dreinig

14

10.03.2011, 22:41

Ja stimmt, danke ;)

Muss mich aber wohl oder übel noch ein letztes mal an euch wenden (zumindest was dieses Thema angeht).
Ich unterstütze jetzt alle Bitmap Arten:
- Unkomprimiert 1, 4, 8, 16, 24, 32 Bit
- RLE 4 und RLE 8

Aber irgendwie verstehe ich nicht wofür die Bitfields sind (3. Kompression).
Aus irgendeinem Grund steht dazu auch nirgends was :(
Könnt ihr mir helfen?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

15

11.03.2011, 08:11

Wenn für die Kompression BI_BITFIELDS angegeben ist, sind in der Farbtabelle drei Doubleword Werte angegeben welche Farbmasken darstellen (für jeden Farbkanal). D.h. du liest einfach die Pixeldaten pro Pixel in einem Rutsch und maskierst für jeden Kanal die Werte, mit den Masken aus der Farbtabelle.
@D13_Dreinig

16

11.03.2011, 16:22

Danke für deine Antwort :)
Aber irgendwie klappt das nicht bzw. hat gar keine auswirkung.

Hier ist mal der 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
23
24
if (bpp == 16)
{
    WORD pixel;
    file.read(reinterpret_cast<char*>(&pixel), sizeof(WORD));

    pixel &= bitfields[0] | bitfields[1] | bitfields[2];

    pixels.at(y * width + x).rgbBlue     = (pixel         & 0x1f) << 3;
    pixels.at(y * width + x).rgbGreen    = ((pixel >> 5)  & 0x1f) << 3;
    pixels.at(y * width + x).rgbRed      = ((pixel >> 10) & 0x1f) << 3;
    pixels.at(y * width + x).rgbReserved = 255;
}
else if (bpp == 32)
{
    DWORD pixel;
    file.read(reinterpret_cast<char*>(&pixel), sizeof(DWORD));

    pixel &= bitfields[0] | bitfields[1] | bitfields[2];

    pixels.at(y * width + x).rgbBlue     = pixel >> 0  & 0xff;
    pixels.at(y * width + x).rgbGreen    = pixel >> 8  & 0xff;
    pixels.at(y * width + x).rgbRed      = pixel >> 16 & 0xff;
    pixels.at(y * width + x).rgbReserved = 255;
}


Hab ich das maskieren vielleicht falsch?

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

17

11.03.2011, 18:22

Ja, hast du. Die Maske hat ja den Sinn etwas variabler zu sein in den Kanalbreiten. Um die Kanalwerte zu erhalten musst du pixel also mit der jeweiligen Maske maskieren und Shiften. Die Anzahl der Bits die geshifted werden musst du aus der Bitmaske auslesen (also quasi einfach die Anzahl der gesetzten Bits der "unteren" Masken zusammenzählen)
@D13_Dreinig

18

11.03.2011, 23:27

Danke, jetzt hab ich den Sinn erst richtig verstanden :D
Vielen lieben Dank an alle, die geholfen haben,
besonders dir David_pb ;)
Wenn ich mal so fragen darf, war ich einfach zu schlecht um das alles von alleine zu verstehen oder
habt ihr alle so was schon mal gemacht?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

19

11.03.2011, 23:29

Wenn ich mal so fragen darf, war ich einfach zu schlecht um das alles von alleine zu verstehen oder
habt ihr alle so was schon mal gemacht?

Letzteres ;)

Werbeanzeige