Funkcja wczytując pliki BMP
Funkcja umożliwiająca wczytanie obrazka z pliku BMP w c++
unsigned char* ReadBmpFromFile(char* szFileName,int &riWidth, int &riHeight) { BITMAPFILEHEADER bfh; BITMAPINFOHEADER bih; int i,j,h,v,lev,l,ls; unsigned char* buff = NULL; unsigned char* p_palette = NULL; unsigned short n_colors = 0; unsigned char* pRGBBuffer; FILE* hfile = fopen(szFileName,"rb"); if(hfile!=NULL) { fread(&bfh,sizeof(bfh),1,hfile); if(!(bfh.bfType != 0x4d42 || (bfh.bfOffBits < (sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)))) ) { fread(&bih,sizeof(bih),1,hfile); v = bih.biWidth; h = bih.biHeight; lev = bih.biBitCount; riWidth = v; riHeight = h; pRGBBuffer = new unsigned char [riWidth*riHeight*3]; //Zaalokowanie odpowiedniego buffora obrazu //Załaduj Palete barw jesli jest if((lev==1)||(lev==4)||(lev==8)) { n_colors = 1<<lev; p_palette = new unsigned char[4*n_colors]; fread(p_palette,4*n_colors,1,hfile); } fseek(hfile,bfh.bfOffBits,SEEK_SET); buff = new unsigned char[v*4]; switch(lev) { case 1: //Nie obsługiwane break; case 4: //nie Obsługiwane break; case 8: //Skala szarości ls = (v+3)&0xFFFFFFFC; for(j=(h-1);j>=0;j--) { fread(buff,ls,1,hfile); for(i=0,l=0;i<v;i++) { pRGBBuffer[((j*riWidth)+i)*3+2] = p_palette[(buff[i]<<2)+2];//R pRGBBuffer[((j*riWidth)+i)*3+1] = p_palette[(buff[i]<<2)+1];//G pRGBBuffer[((j*riWidth)+i)*3+0] = p_palette[(buff[i]<<2)+0];//B } }; break; case 24: //bitmapa RGB ls = (v*3+3)&0xFFFFFFFC; for(j=(h-1);j>=0;j--) { //x_fread(hfile,buff,ls); fread(buff,ls,1,hfile); for(i=0,l=0;i<v;i++,l+=3) { pRGBBuffer[((j*riWidth)+i)*3+0] = buff[l+0]; pRGBBuffer[((j*riWidth)+i)*3+1] = buff[l+1]; pRGBBuffer[((j*riWidth)+i)*3+2] = buff[l+2]; }; }; break; case 32: // RGBA bitmap for(j=(h-1);j>=0;j--) { fread(buff,v*4,1,hfile); for(i=0,l=0;i<v;i++,l+=4) { pRGBBuffer[((j*riWidth)+i)*3+0] = buff[l+0]; pRGBBuffer[((j*riWidth)+i)*3+1] = buff[l+1]; pRGBBuffer[((j*riWidth)+i)*3+2] = buff[l+2]; } }; break; }; delete buff; if(p_palette) delete p_palette; } } return pRGBBuffer; }