Programmierung / BMP laden in C (Wo ist mein Fehler)

Hier dürfen auch unregistrierte Besucher posten.
Antworten
DOS_Niko

Programmierung / BMP laden in C (Wo ist mein Fehler)

Beitrag von DOS_Niko »

Hallo,

ich versuche mich gerade an der C/CPP Programmierung unter BorlandC (V. 3.1) unter DOS.
Soweit so gut, "Hello World" und kleine Dinge funktionieren soweit.

Nun wollte ich eine BMP Datei (320x200 mit 256 Farben) im Screenmode 0x13 laden und stoße nun auf meine Grenze...
Ich bekomme einen Fehler in der Zeile: fread(Screen + offset, paddedWidth, 1, BMPFile); (Fast am Ende)
Die Datei test.bmp ist natürlich im korrekten Format vorhanden.

Es sollte eigentlich ein simples Programm sein, nur um ein Bild zu laden, um dieses dann später in eine Programmierung einzubinden.

Mein Ziel/Meine Ziele:
Laden von Bitmaps in Borland C
Ausgabe 320x200x256 über den ganzen Bildschirm (Bild in gleichem Format)
Einlesen/Ausgeben von Bildausschnitten (Zum erstellen von Tile-Set), z.B. Lese 0,0 bis 31,31 (um ein 32x32 Tile zu haben) und setze es ab Koordinate x,y (zum freien Einsatz auf dem Bildschirm)

Wer sich auskennt oder Code-Schnipsel hat, die selbiges bewirken, wäre ich Ultra Dankbar.


Hier der Code:
#include <dos.h>
#include <stdio.h>
#include <string.h>
#include <conio.h>

char far *Screen;

/* Sets the display to VGA 320x200x256 */
void VGAScreen(void)
{
union REGS r;

r.h.ah = 0;
r.h.al = 0x13;
int86(0x10, &r, &r);

return;
}

/* Goes back to textmode */
void TextScreen(void)
{
union REGS r;

r.h.ah = 0;
r.h.al = 0x3;
int86(0x10, &r, &r);

return;
}

/* This sets a DAC register to a specific Red Green Blue-value */
int SetDAC(unsigned char DAC, unsigned char R, unsigned char G, unsigned char B)
{
outportb(0x3C8, DAC);
outportb(0x3C9, R);
outportb(0x3C9, G);
outportb(0x3C9, B);

return(0);
}

int LoadBMP(void)
{
struct BMPHeader
{
unsigned short bfType;
long bfSize, bfReserved, bfOffBits, biSize, biWidth, biHeight;
unsigned short biPlanes, biBitCount;
long biCompression, biSizeImage, biXPelsPerMeter,
biYPelsPerMeter, biClrUsed, biClrImportant;
} Header;

FILE *BMPFile;
unsigned char c, Palette[256][4];
char *filename = "test.bmp";
unsigned int offset, lines, paddedWidth;

/* This checks for the file */
BMPFile = fopen(filename, "rb");

if (BMPFile == NULL)
{
printf("Cant open file.");
return(1);
}

/* Read the headerinformation */
fread(&Header, 54, 1, BMPFile);

if (Header.bfType != 19778 || Header.bfReserved != 0 || Header.biPlanes != 1)
{
/* Not a valid bitmap file - don't display */
printf("Not a valid bitmap.");
fclose(BMPFile);
return(1);
}

if (Header.biCompression != 0)
{
/*Compressed file - don't display*/
printf("Compressed file.");
fclose(BMPFile);
return(1);
}

if (Header.biBitCount != 8)
{
/*If the file is other than 8-bit dont read.*/
printf("Not an 8-bit bitmap.");
fclose(BMPFile);
return(1);
}

if (Header.biWidth > 320 || Header.biHeight > 200)
{
/*If its larger than 320*200 dont load.*/
printf("Size too large.");
fclose(BMPFile);
return(1);
}

/*Load the palette info*/
fread(&Palette, 1024, 1, BMPFile);

for (c = 0; c < 255; c++)
SetDAC(c, Palette[c][2] >> 2, Palette[c][1] >> 2, Palette[c][0] >> 2);

offset = (100 + (Header.biHeight >> 1)) * 320 + 160 - (Header.biWidth >> 1);
lines = 0;
paddedWidth = Header.biWidth & 0xFFFC;

if (Header.biWidth != paddedWidth)
paddedWidth += 4;

/*Loop for reading lines*/
while (lines < Header.biHeight)
{
fread(Screen + offset, paddedWidth, 1, BMPFile);
offset -= 320;
lines++;
}

fclose(BMPFile);
return(0);
}

int main(int argcount, char *argvalue[])
{
/* Set up a pointer in vga memory */
Screen = (char far *) 0xA0000000L;
VGAScreen();
LoadBMP();
getch();
TextScreen();
return(0);
}
DOS_Niko

Re: Programmierung / BMP laden in C (Wo ist mein Fehler)

Beitrag von DOS_Niko »

evtl. sind die Daten von Bedeutung:

Fehler passiert sowohl in der DosBOX, als auch im Dos Fenster unter Windows 98 (auf Celeron 266 MHz) und unter DOS 6.22 (auf 486DX2 66)
Antworten