#include #pragma hdrstop #include #include #include class LoadFail{}; class SaveFail{}; class Incompatible{}; Bitmap::Bitmap(char*fName) { BITMAPFILEHEADER bmfh; BITMAPINFOHEADER bmih; std::ifstream f(fName,std::ios::in | std::ios::binary); if (f.fail()) throw LoadFail(); f.read((char*) &bmfh,sizeof(bmfh)); if (f.gcount()!=sizeof(bmfh)) throw LoadFail(); f.read((char*) &bmih,sizeof(bmih)); if (f.gcount()!=sizeof(bmih)) throw LoadFail(); Width=bmih.biWidth; Height=bmih.biHeight; Bits=bmih.biBitCount; Pitch=(Bits*Width/8+3)&~3; // real width in bytes if (Bits<8 || bmih.biCompression!=BI_RGB) throw Incompatible(); Image.Alloc((int32) Pitch*Height); if (Bits==8) { Pal.Alloc(256); f.read((char*) Pal.Data,256*sizeof(RGBQUAD)); } f.read((char*)Image.Data,(int32) Pitch*Height); if (f.gcount()!=(int32) Pitch*Height) throw LoadFail(); } void Bitmap::ConvertTo256(RGBQUAD *DestPal,int PalSize) { Pointer Image2((int32) Width*Height); bhp buf,buf2=Image2; if (Bits==8) { // generate pixel translation BYTE PixTrans[256]; int i; for (i=0;i<256;i++) PixTrans[i]=FindCol(Pal[i].rgbRed,Pal[i].rgbGreen,Pal[i].rgbBlue,DestPal,PalSize); // do pixel translation for (i=0;i=0;i--) f.write((char*)(Image + (int32) i*Pitch),Width); } void Bitmap::ConvertTo24Bit() { if (Bits==24) return; if (Bits!=8) throw Incompatible(); Pointer Image2((int32) 3*Width*Height); bhp buf,buf2=Image2; for (int i=0;irgbBlue; *buf2++=Col->rgbGreen; *buf2++=Col->rgbRed; } } Image=Image2; Bits=24; Pitch=Width*Bits/8; } void Bitmap::ChangeSize(int w,int h) { ConvertTo24Bit(); Pointer Image2((int32) 3*w*h); bhp buf,buf2=Image2; for (int i=0;i