#include <memory.h>
#include "bmp.h"
#ifdef _BMP_TEST_
int main()
#else
int BMPMain()
#endif
{
LONG w, h;
COLORREF* pPixData = NULL;
pPixData = ReadBMPData(&w, &h);
ShowBMP(w, h, pPixData);
return 0;
}
void ShowBMP(LONG w, LONG h, COLORREF* pData)
{
int Row, Col;
int i = 100;
for(Row = 0; Row < h; Row ++)
{
for(Col = 0; Col < w; Col ++)
{
if(Row == 0)
{
printf("0x%06x ", pData[Row * SCREEN_WIDTH + Col]);
if((Col + 1) % 6 == 0)
printf("\n");
}
}
}
free(pData);
}
COLORREF* ReadBMPData(LONG* width, LONG* heigh)
{
BITMAPFILEHEADER bmpFH;
BITMAPINFOHEADER bmpInfo;
int rgbCount;
FILE *pf = NULL;
long byteline;
int Row;
int i;
int j;
char* pLineData = NULL;
char* pImgData = NULL;
RGBQUAD* rgb = NULL;
BYTE* lineData = NULL;
COLORREF* PixData = NULL;
pf = fopen("test.bmp", "rb");
rewind(pf); //set to file head
fread(&bmpFH, sizeof(BITMAPFILEHEADER), 1, pf); //read BMP File Header
fseek(pf, sizeof(BITMAPFILEHEADER), SEEK_SET);
fread(&bmpInfo, sizeof(BITMAPINFOHEADER), 1, pf); //read BMP INFO Header
*width = bmpInfo.biWidth;
*heigh = bmpInfo.biHeight;
fseek(pf, bmpFH.bfOffBits, SEEK_SET); //set to Data
byteline = (bmpInfo.biWidth * bmpInfo.biBitCount + 31) / 32*4;
switch(bmpInfo.biBitCount)
{
case 1:
rgbCount = 2;
break;
case 4:
rgbCount = 16;
break;
case 8:
rgbCount = 256;
break;
case 24:
default:
rgbCount = 0;
break;
}
rgb = (RGBQUAD*)malloc(rgbCount * sizeof(RGBQUAD));
if(rgbCount != 0)
{
for(i = 0; i < rgbCount; i ++)
{
fread(&(rgb[i]),sizeof(RGBQUAD),1,pf);
}
fseek(pf, bmpFH.bfOffBits + sizeof(rgb), SEEK_SET);
}
lineData = (BYTE*)malloc(byteline);
// COLORREF* PixData = (COLORREF*)malloc((bmpInfo.biHeight * bmpInfo.biWidth) * sizeof(COLORREF));
PixData = (COLORREF*)malloc((SCREEN_WIDTH * SCREEN_HEIGH) * sizeof(COLORREF));
memset(PixData, 0x00, (SCREEN_WIDTH * SCREEN_HEIGH) * sizeof(COLORREF));
memset(lineData, 0x00, byteline);
//read data to memory
for(Row = 0; Row < bmpInfo.biHeight; Row ++)
{
fread(lineData, byteline, 1, pf);
i = 0;
for(j = 0; j < bmpInfo.biWidth; j ++)
{
PixData[Row * SCREEN_WIDTH + j] = (lineData[i] << 16) + (lineData[i+1] << 8) + lineData[i+2];
i = i + 3;
}
}
free(lineData);
fclose(pf);
return PixData;
}