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

1

22.03.2011, 13:12

Roh-Daten als BMP Speichern.

Hallo ich habe folgendes Problem:

Ich lade aus einer Datei Bild-daten (Nur die Daten selbst ohne Header usw) und möchte diese als BMP auf der Festplatte speichern.

Das habe ich mit folgender Funktion bereits versucht und es Funktioniert auch "fast". Undzwar Speichert er mir die Daten als Monochrom bild (Schwarz / Weiß. Aber das Bildformat ist 8Bit und auch die Daten sind 8Bit)

Folgende Funktion habe ich benutzt:

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
BOOL WriteBitmapFile(char *szFileName,BYTE *pData, int nWidth, int nHeight)
{

    FILE *fp = NULL;
    if ((fp = fopen(szFileName, "wb")) == NULL) return FALSE;

    BITMAPFILEHEADER bfh;
    BITMAPINFOHEADER bih;

    bfh.bfType          = 19778;
    bfh.bfReserved1     = 0;
    bfh.bfReserved2     = 0;
    bih.biWidth         = nWidth;
    bih.biHeight        = nHeight;
    bih.biBitCount      = 8;
    bih.biCompression   = 0;
    bih.biPlanes        = 1;
    bih.biSize          = 40;
    bih.biXPelsPerMeter = 0;
    bih.biYPelsPerMeter = 0;

    int nRowBytes = 0;
    int lpGapBuff[4];
    int nGap;
    int i;

    BITMAPINFO bmh;
    bmh.bmiHeader = bih;
    nRowBytes = (nWidth+3)/4*4;
    nGap = nRowBytes - nWidth;

    bfh.bfSize = 1078 + nRowBytes * nHeight;
    bfh.bfOffBits = 1078;
    bih.biSizeImage = nRowBytes * nHeight;
    bih.biClrImportant = 256;
    bih.biClrUsed = 256;

    BYTE ind[1024];
    for (i=0; i<1024; i++)
        ind[i]=i/4;


    fwrite(&bfh, sizeof(BITMAPFILEHEADER), 1, fp);
    fwrite(&bmh, sizeof(BITMAPINFO), 1, fp);
    fwrite(ind, sizeof(BYTE), 1024, fp);
    
    for (i=0; i<nHeight; i++)
    {
        fwrite(pData+(nHeight-i-1)*nWidth, sizeof(BYTE), nWidth, fp);
        fwrite(bmh.bmiColors, sizeof(BYTE), nGap, fp);
    }
    
    
    fclose(fp);

    return TRUE;
}


Zusammengefasst ist also das Problem das ich keinerlei Farbe ausser Schwarz und Weiß in meiner Datei gespeichert bekomme. (PS ich lade die daten aus einer *.wad datei [Halflife])

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

2

22.03.2011, 14:08

Naja überleg mal, deine Palette ist einfach ein Farbverlauf von Schwarz nach Weiß, was erwartest du also? ^^

3

22.03.2011, 14:14

Danke für deine Antwort. Könntest du mir bitte nochmal genauer erklären wo mein problem liegt? muss ich die palette irgendwie definieren oder wie mach ich das?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

22.03.2011, 14:25

Ja natürlich musst du die Palette definieren. Eine genaue Erklärung wie das mit indizierten Farben und Paletten funktioniert findest du hier.

5

22.03.2011, 15:18

Muss ich die Palette aus der *.Wad laden oder kann man auch eine Vordefinierte benutzen? und wenn ja wie geht das?

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

6

22.03.2011, 15:22

Ich muss ehrlich gestehn ich weiß nicht ob die .wad eine Palette enthält oder ob es irgendwo eine global definierte Palette für das .wad Format gibt oder was auch immer (hab mit dem Dateiformat noch nie gearbeitet). Aber um die .wad Datei einzulesen wirst du dich ja an irgendeiner Dokumentation/Spezifikation orientiert haben, dort sollte das eigentlich genau drin stehen!?

7

22.03.2011, 15:24

Ja ich habe es nach dieser (http://yuraj.ucoz.com/half-life-formats.pdf) Spezifikation gemacht. Versuche das mit den Farben jetzt aber schon seit 12h und habe leider keine Idee mehr wie ich das noch umsetzen kann. Wäre unendlich Dankbar wenn mir ja jemand behilflich sein könnte :)

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

22.03.2011, 15:30

Naja, dem Dokument zufolge befindet sich in der Textur eine Palette (vorletzter Eintrag in der Texture)...

9

22.03.2011, 15:42

Quellcode

1
2
List of RGB 24bit colors that are 256 entries long.
RGB = 0,0,255 means transparent color in HL engine.


Den Teil meinst du sicher oder? Den habe ich auch eingelesen. Habe jetzt 256 RGB werte. Ich such jetzt mal in der Bitmap Spezifikation danach wie genau ich die dort wieder Speichern muss.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

22.03.2011, 15:45

Zitat

Farbtabelle [Bearbeiten]Wenn biClrUsed=0:
Wenn biBitCount=1, 4 oder 8: Es folgt eine Farbtabelle mit 2biBitCount Einträgen.
Ansonsten: Es folgt keine Farbtabelle.
Ansonsten: Es folgt eine Farbtabelle mit biClrUsed Einträgen.
Jeder Eintrag der Farbtabelle ist 4 Byte groß und enthält jeweils ein Byte für den Blau-, Grün- und Rotanteil, sowie ein auf 0 gesetztes Byte (in dieser Reihenfolge!).

Wiki lässt grüßen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige