[转载]loadbmp.h Vc++源代码(2011-03-29 10:26:31)

来源:互联网 发布:信息与软件工程学院 编辑:程序博客网 时间:2024/05/16 17:58

原文地址:loadbmp.h Vc++源代码作者:ggbondg //老师的程序,被偶拿来放在blog上……,不过简单而实用…… //用时,只要把这个文件加入头文件的folder就好啦,然后改一下EXTRA_NAME …… #if ! defined (_LOADBMP_H) #define _LOADBMP_H #if ! defined (EXTRA_NAME) #define EXTRA_NAME "$Highboost_clrnoise." #endif #include #include #include #include int nWidth; //位图宽度 int nHeight; //位图高度 int nLen; int nByteWidth; //位图字节宽度 BYTE *lpBackup; BYTE *lpBitmap; //位图文件头指针 BYTE *lpBits; //位图图像数据指针(根据有无调色板,指向位置可变) CString FileName; CString Front; CString Rear; void CuttheName() { int Position; Position=FileName.Find('.'); Front=FileName.Left(Position); Rear=FileName.Mid(Position+1); } void LoadBitmap() { CFile File; ; //从CFile类中生成一个实例File if (!File.Open(FileName,CFile::modeRead)) return; //打开文件只读,打开成功返回非0值,否则返回0 CuttheName(); //拆分文件名,便于在图像处理后将新文件名命名为原始文件名+新字符串+扩展名 //if (lpBitmap) delete lpBitmap; //若已经存在lpBitmap,则将其删除,释放它指向的内存区域 nLen=File.GetLength(); //获取文件长度 lpBitmap=new BYTE[nLen]; //根据位图文件长度为位图文件开辟nLen字节大小的内存 File.Read(lpBitmap,nLen); //从文件中读取nLen字节到lpBitmap指向的内存区,即将整个位图文件读入lpBitmap指向的内存区 BITMAPINFOHEADER *pInfo; pInfo=(BITMAPINFOHEADER *)(lpBitmap+sizeof(BITMAPFILEHEADER)); //位图信息头指针,指向lpBitmap内存区中BITMAPFILEHEADER区后首地址 nWidth=pInfo->biWidth; //从位图信息头中取出位图宽度信息赋给变量nWidth nByteWidth=nWidth*3; //每行图像所占字节数目为图像宽度的3倍(24位真彩色图像) if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4); //每行图像所占字节数目必须补齐为4的整数倍 nHeight=pInfo->biHeight; if (pInfo->biBitCount!=24) //若图像不是真彩色图像,需转换 { if (pInfo->biBitCount!=8) //若图像非8位图像,释放lpBitmap内存,结束程序 { cout<<"Invalid Bitmap"<biBitCount; //计算调色板大小,左移运算符,左移n位,相当于2的n次幂 if (pInfo->biClrUsed!=0 && pInfo->biClrUsedbiClrUsed; //若biClrUsed不为零,调色板大小等于实际使用的颜色数 lpBits=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER); //lpBits指向为8位图像调色板区 RGBQUAD *pPalette=(RGBQUAD *)lpBits; //RGBQUAD为调色板数组元素的结构体,此时定义调色板数组指针pPalette,与lpBits指向同一内存位置 lpBits+=sizeof(RGBQUAD)*PaletteSize; //使lpBits指向8位图像的数据区 nLen=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+nByteWidth*nHeight; //24位位图文件字节大小 BYTE *lpTemp=lpBitmap; //新定义lpTemp指向原lpBitmap对应的内存区 lpBitmap=new BYTE[nLen]; //新开辟一块容纳24位位图文件的内存区,指向该新内存的指针为lpBitmap memset(lpBitmap,0,nLen); //lpBitmap指向的内存区全部nLen字节置0 int nBWidth=pInfo->biWidth; //再次从8位位图信息头中读出每行图像数目 if (nBWidth%4) nBWidth+=4-(nBWidth%4); //每行图像所占字节数目必须补齐为4的整数倍 BYTE *lpBits2=lpBitmap+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);//定义新指针lpBits2指向24位图像数据区 int x,y,p1,p2,nIndex; //逐行逐列按像素转换 for(y=0;y

原创粉丝点击