Hi everybody , I'm just a student , I am studying about image processing. I wrote a small program to display a 8/24-bit of color-depth bitmap file. It worked very well with 24-bit but not good with 8-bit bitmap. I'm using window 7 and dev-c++ to write the program. Could you tell me what window applications do with the color-pallete of an 8-bit bitmap image and could I fix my program to display as well as MSpaint? Thanks!
#include <GL/gl.h>
#include <GL/glut.h>
#include <iostream>
#include <fstream>
using namespace std;
#pragma pack(push, 2 )
struct BitmapHeader // 14 byte
{
short sigNature;
unsigned long fileSize;
long reserved;
long dataOffset;
};
struct BitmapInfoheader // 40 byte
{
unsigned long infoSize;
unsigned long width;
unsigned long heigh;
unsigned short planes;
unsigned short bitCount;
unsigned long compression;
unsigned long imageSize;
long xPixelsPerMeter;
long yPixelsPerMeter;
unsigned long clrUsed;
unsigned long clrImportant;
};
#pragma pack(pop)
//--------------------------------------
struct BitmapHeader bmheader;
struct BitmapInfoheader bmInfo;
char* colorPlane = NULL;
char* imgData = NULL;
int loadBmImg()
{
char tt[20] ;
ifstream sf;
char word;
cout<<"Input a filename : ";
cin.getline(tt,20);
sf.open(tt,ios::in|ios::binary);
if(sf.bad())
{
cout<<"Can't open the file!";
return 0;
}
sf.read((char*)&bmheader,sizeof(bmheader));
sf.read((char*)&bmInfo,sizeof(bmInfo));
imgData = new char[bmInfo.imageSize];
if(bmInfo.bitCount<=8)
{
colorPlane = new char[4*256];
sf.read(colorPlane,4*256);
}
sf.read(imgData,bmInfo.imageSize);
sf.close();
}
//---------------------------------
void init(void)
{
glClearColor (0.0, 0.0, 0.0, 0.0);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
glOrtho(0, bmInfo.width, 0, bmInfo.heigh, -1.0, 1.0);
}
void drawBmImage(void)
{
unsigned char r,g,b;
GLint R,G,B;
unsigned long int index;
short padding = 0;
glBegin (GL_POINTS);
if(bmInfo.bitCount==8)
{
padding = (bmInfo.imageSize-(bmInfo.heigh*bmInfo.width))/bmInfo.heigh; // padding in byte
for(GLint j=0; j<bmInfo.heigh; j++)
for(GLint i=0;i<bmInfo.width; i++)
{
index = (unsigned long)imgData[j*(bmInfo.width+padding)+i];
r = colorPlane[4*index+2];
g = colorPlane[4*index+1];
b = colorPlane[4*index];
R = ((unsigned short)r);
G = ((unsigned short)g);
B = ((unsigned short)b);
glColor3ub(R,G,B);
glVertex3i(i,j,0);
}
}
else if(bmInfo.bitCount==24)
{
padding = (bmInfo.imageSize-(3*bmInfo.heigh*bmInfo.width))/bmInfo.heigh; // padding in byte
for(GLint j=0;j<bmInfo.heigh;j++)
for(GLint i=0;i<bmInfo.width;i++)
{
index = 3*(j*bmInfo.width+i)+j*padding;
r = imgData[index+2];
g = imgData[index+1];
b = imgData[index+0];
R = (unsigned short)r;
G = (unsigned short)g;
B = (unsigned short)b;
glColor3ub(R,G,B);
glVertex3i(i,j,0);
}
}
glEnd();
cout<<"Padding = "<<padding<<endl;
}
void display(void)
{
glClear (GL_COLOR_BUFFER_BIT);
drawBmImage();
glFlush ();
}
int main(int argc, char** argv)
{
loadBmImg();
cout.setf(ios::showbase);
//----------------------------------------------------------
cout<<"BitMapFileHeader : "<<endl;
cout<<"SignNature : "<<hex<<bmheader.sigNature<<endl;
cout<<"Size of File : "<<hex<<bmheader.fileSize<<" = "<<dec<<bmheader.fileSize<<" bytes "<<endl;
cout<<"Data Offset : "<<hex<<bmheader.dataOffset<<endl;
//----------------------------------------------------------
cout<<"BitMapInfoHeader : "<<endl;
cout<<"Size of Info header : "<<hex<<bmInfo.infoSize<<endl;
cout<<"Width of the Image : "<<hex<<bmInfo.width<<" = "<<dec<<bmInfo.width<<endl;
cout<<"Heigh of the Image : "<<hex<<bmInfo.heigh<<" = "<<dec<<bmInfo.heigh<<endl;
cout<<"Number of Plane color : "<<hex<<bmInfo.planes<<endl;
cout<<"Number of bits per pixel : "<<hex<<bmInfo.bitCount<<endl;
cout<<"Compression : "<<hex<<bmInfo.compression<<endl;
cout<<"Size of the Data : "<<hex<<bmInfo.imageSize<<endl;
cout<<"Number of pixels per meter of width : "<<hex<<bmInfo.xPixelsPerMeter<<" = "<<dec<<bmInfo.xPixelsPerMeter<<endl;
cout<<"Number of pixels per meter of heigh : "<<hex<<bmInfo.yPixelsPerMeter<<" = "<<dec<<bmInfo.yPixelsPerMeter<<endl;
cout<<"Number of colors in use : "<<hex<<bmInfo.clrUsed<<endl;
cout<<"Number of important colors : "<<hex<<bmInfo.clrImportant<<endl;
glutInit(&argc, argv);
glutInitDisplayMode (GLUT_SINGLE | GLUT_RGB);
glutInitWindowSize (bmInfo.width, bmInfo.heigh);
glutInitWindowPosition (100, 100);
glutCreateWindow ("OpenGL");
init ();
glutDisplayFunc(display);
glutMainLoop();
return 0;
}