www.pudn.com > opengl_pick_sample.rar > bmpreader.cpp
// bmpreader.cpp
//
#include "stdafx.h"
#include "dibsect.h"
/*
* Dib Header Marker - used in writing DIBs to files
*/
#define DIB_HEADER_MARKER ((WORD) ('M' << 8) | 'B')
int ReadDIBFile(const char * filename, DIBSection& dib);
int ReadBMPFile(const char * filename, DIBSection& dib)
{
int result = ReadDIBFile(filename,dib);
return result;
}
int ReadDIBFile(const char * filename, DIBSection& dib)
{
int result = 0;
BITMAPFILEHEADER bmfHeader;
BITMAPINFO bmInfo;
DWORD dwBitsSize;
/*
** get length of DIB in bytes for use when reading
*/
FILE * fp = fopen(filename,"rb");
if (fp)
{
fseek(fp,0l,SEEK_END);
dwBitsSize = ftell(fp);
fseek(fp,0l,SEEK_SET);
unsigned long bmfHeaderSize = sizeof(bmfHeader);
if (fread(&bmfHeader,sizeof(unsigned char),bmfHeaderSize,fp) == bmfHeaderSize)
{
//if (bmfHeader.bfType != DIB_HEADER_MARKER)
// return result;
}
unsigned long bmInfoSize = sizeof(BITMAPINFOHEADER);
if (fread(&bmInfo,sizeof(unsigned char),bmInfoSize,fp) == bmInfoSize)
{
}
else
{
return result;
}
if (bmInfo.bmiHeader.biBitCount != 24)
{
return result;
}
int nColors = bmInfo.bmiHeader.biClrUsed ? bmInfo.bmiHeader.biClrUsed :
1 << bmInfo.bmiHeader.biBitCount;
int w = bmInfo.bmiHeader.biWidth;
int h = bmInfo.bmiHeader.biHeight;
int bitcount = bmInfo.bmiHeader.biBitCount;
dib.Create(w,h,bitcount);
if (dib.IsCreated())
{
unsigned long total_width = dib.GetTotalWidth();
DWORD remainder = dwBitsSize - bmfHeaderSize - bmInfo.bmiHeader.biSize;
unsigned char * bits = new unsigned char[remainder];
if (!bits)
{
// outta memory
return result;
}
memset(bits,0,(size_t)remainder);
unsigned long bytes_read = fread(bits,sizeof(unsigned char),remainder,fp);
if (bytes_read == remainder)
{
result++;
if (nColors <= 256)
{
}
unsigned char * dst = (unsigned char *)dib.GetBits();
unsigned long dst_offset;
unsigned long src_offset;
for (int row=0;row