数字图像处理基础知识总结
来源:互联网 发布:淘宝商品如何靠前 编辑:程序博客网 时间:2024/05/29 02:22
8位位图,像素读取需要unsinged char类型,因为是0-255
loadBMP 和readBMP两个函数是区别
HANDLE CdlgcallDlg::LoadBMP(LPCTSTR lpFileName){HANDLE hBMP; //指向载入数据所在缓存区的句柄 HANDLE hFile; BITMAPFILEHEADER bmfHeader; //文件头UINT nNumColors; //位图颜色表的颜色数HANDLE hBMPtmp; LPBITMAPINFOHEADER lpbmInfo; //指向信息头的指针DWORD dwOffBits; //像素阵列偏移量DWORD dwRead;if ( ( hFile = CreateFile( lpFileName,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_SEQUENTIAL_SCAN,NULL ) ) == INVALID_HANDLE_VALUE ){return NULL; //若打开文件失败,返回NULL}//为位图信息头和颜色表分配内存,后续可根据实际需要扩大内存hBMP = GlobalAlloc( GMEM_MOVEABLE, (DWORD)( sizeof( BITMAPINFOHEADER ) + 256*sizeof( RGBQUAD ) ) );if ( !hBMP ){CloseHandle( hFile );return NULL;}lpbmInfo = (LPBITMAPINFOHEADER)GlobalLock( hBMP );if (!lpbmInfo){goto ErrorExit_NoUnlock; }// 从文件读入位图文件头BITMAPFILEHEADERif ( !ReadFile( hFile, ( LPBYTE )&bmfHeader, sizeof( BITMAPFILEHEADER ), &dwRead, NULL ) ){goto ErrorExit;}if ( sizeof(BITMAPFILEHEADER) != dwRead ){goto ErrorExit;}// 读入位图信息头BITMAPINFOHEADERif ( !ReadFile( hFile, ( LPBYTE )lpbmInfo, sizeof( BITMAPINFOHEADER ), &dwRead, NULL ) ){goto ErrorExit;}if ( sizeof(BITMAPINFOHEADER) != dwRead ){goto ErrorExit;}//确定颜色表大小if ( !( nNumColors = ( UINT )lpbmInfo->biClrUsed ) ){if ( lpbmInfo->biBitCount != 24 )//真彩色无颜色表,否则据biBitCount计算颜色项数nNumColors = 1 << lpbmInfo->biBitCount; }if ( lpbmInfo->biClrUsed == 0 ){lpbmInfo->biClrUsed = nNumColors;}//计算像素阵列占用空间,字节对齐if ( lpbmInfo->biSizeImage == 0 ) {lpbmInfo->biSizeImage = ((((lpbmInfo->biWidth * (DWORD)lpbmInfo->biBitCount) + 31) &~31) >> 3)* lpbmInfo->biHeight;}// 重新根据实际大小分配内存,用于存放信息头、颜色表和像素阵列GlobalUnlock( hBMP );hBMPtmp = GlobalReAlloc( hBMP, lpbmInfo->biSize + nNumColors * sizeof(RGBQUAD) + lpbmInfo->biSizeImage, 0 ); if ( !hBMPtmp ) {goto ErrorExit_NoUnlock;}else{hBMP = hBMPtmp;}lpbmInfo = ( LPBITMAPINFOHEADER )GlobalLock( hBMP );// 读入颜色表ReadFile( hFile, ( LPBYTE )(lpbmInfo) + lpbmInfo->biSize, nNumColors * sizeof( RGBQUAD ), &dwRead,NULL); //计算像素阵列偏移量dwOffBits = lpbmInfo->biSize + nNumColors * sizeof( RGBQUAD );if ( bmfHeader.bfOffBits != 0L ){SetFilePointer( hFile, bmfHeader.bfOffBits, NULL, FILE_BEGIN );}//读入位图象素数据if ( ReadFile( hFile, ( LPBYTE )lpbmInfo + dwOffBits, lpbmInfo->biSizeImage, &dwRead, NULL)){goto SuccessExit;}ErrorExit:GlobalUnlock(hBMP);ErrorExit_NoUnlock:GlobalFree(hBMP);CloseHandle( hFile );return NULL;SuccessExit:CloseHandle( hFile );GlobalUnlock(hBMP);return hBMP;}
bool CdlgcallDlg::readbmp(char *bmpname)
{
FILE *fp=fopen(bmpname, "rb");//二进制读方式打开指定的图像文件
if(fp==0)
return 0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;
fread(&head, sizeof(BITMAPINFOHEADER), 1,fp); //获取图像宽、高、每像素所占位数等信息
int bmpWidth = head.biWidth;
int bmpHeight = head.biHeight;
int biBitCount = head.biBitCount;//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;//灰度图像有颜色表,且颜色表表项为256
RGBQUAD *pColorTable;
if(biBitCount==8)
{
//申请颜色表所需要的空间,读颜色表进内存
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申请位图数据所需要的空间,读位图数据进内存
pBmpBufnew=new unsigned char[lineByte * bmpHeight];
fread(pBmpBufnew,1,lineByte * bmpHeight,fp);
fclose(fp);//关闭文件
return 1;//读取文件成功
return true;
}
handle句柄即采用CFile来读取位图文件,及需要区别file读取文件
- 数字图像处理基础知识总结
- Java数字图像处理基础知识
- Java数字图像处理基础知识 - 必读
- Java数字图像处理基础知识 - 必读
- Java数字图像处理基础知识 - 必读
- Java数字图像处理基础知识 - 必读
- 数字图像处理回忆与总结
- 数字图像处理与OpenCV总结篇:一
- python数字图像处理-图像的基本结构和基础知识
- 数字图像和数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- js去掉字符串前后空格的五种方法
- U3d学习第4天--u3d脚本代码基础判断和循环语句
- 验证码的功能实现
- uchome中的发送邮件
- ceph存储 loop设备及losetup命令介绍
- 数字图像处理基础知识总结
- RTP/RTCP协议介绍
- SharedPreferences清除问题
- Android PowerImageView实现,可以播放动画的强大ImageView
- ie11兼容性问题,jsp在IE11显示不全问题,ie11覆盖内容问题解决方法
- 导航栏的返回文字修改
- 关于树莓交叉编译Qt5
- 研发团队建设的心得体会
- C#操作字符串方法总结<转>