BMP 24 32 显示 翻转
来源:互联网 发布:微信上淘宝返利可信吗 编辑:程序博客网 时间:2024/05/18 12:33
原文地址:http://blog.csdn.net/hxmcnu/article/details/12359731
参数定义
private:BYTE * BmpBuffer;//24BMP位图数据long bmpWidth ;long bmpHeight;BYTE *p32BitBuf;//32位BMP数据int totalSize;//数据大小int bytes_per_line;//每行的字节数int m_nAlpha1;//32位BMP中alpha值,用于调节通明度public:bool Open24BMP();bool Show24BMP();bool Show32BMP();bool Conver24To32(int m_nAlpha1);int Set32BitBmpAlpha(int nAlpha);
相关功能实现:
//读取一张24bit的BMP保存到个BYTE buffer里面:bool CConverBMPDlg::Open24BMP(){////////////////////////////////////////////////////////////////////////////////////////////////////////////// BYTE *pBmpBuf;CFileDialog GetFile(TRUE,NULL,NULL,OFN_FILEMUSTEXIST,_T("BMP(*.bmp)|*.bmp|All Files(*.*)|*.*"));if(IDOK == GetFile.DoModal()){CString strFilePath = GetFile.GetPathName();FILE *fp=NULL; int ret = fopen_s(&fp,strFilePath,"rb"); if(fp==0) { return false; } BITMAPFILEHEADER fileheader={0}; fread(&fileheader,sizeof(fileheader),1,fp); if(fileheader.bfType!=0x4D42) { fclose(fp); return false ; } BITMAPINFOHEADER head; fread(&head,sizeof(BITMAPINFOHEADER),1,fp); bmpWidth = head.biWidth; bmpHeight = head.biHeight; WORD biBitCount = head.biBitCount; if(biBitCount != 24) { ::AfxMessageBox(_T("choose a 24 bit bmp")); fclose(fp); return false ; } bytes_per_line = (bmpWidth * biBitCount/8+3)/4*4;totalSize = bytes_per_line*bmpHeight; pBmpBuf = new BYTE[totalSize]; // 24 bit bufsize_t size = 0; while(true) { int iret = fread(&pBmpBuf[size],1,1,fp); if(iret == 0) break; size = size + iret; } fclose(fp); } ///////////////////////////////////////////////////////////////////上面读出来的是翻转的,下面正过来://flipBYTE *buffer; int index;BmpBuffer = new BYTE[totalSize];//24位BMP Bufferbuffer = new BYTE[totalSize];//temp buf to flip 24bit bmp mapmemcpy(buffer,pBmpBuf,totalSize);for (index=0; index < bmpHeight; index++)memcpy(&BmpBuffer[((bmpHeight-1) - index)*bytes_per_line],&buffer[index*bytes_per_line], bytes_per_line);delete[] buffer;buffer = NULL;return true;}bool CConverBMPDlg::Show24BMP(){//显示一下:////show 24bitint i,j; CClientDC dc(this); int pitch = bmpWidth % 4; for(i=0;i<bmpHeight;i++) { int realPitch = i * pitch; for(j=0;j<bmpWidth;j++) { dc.SetPixel(j,i,RGB( BmpBuffer[(i*bmpWidth+j)*3+2+realPitch], BmpBuffer[(i*bmpWidth+j)*3+1+realPitch], BmpBuffer[(i*bmpWidth+j)*3+realPitch])); } } return true;}bool CConverBMPDlg::Conver24To32(int m_nAlpha1){//////////////////////////////////////////////////////////////////// //将24bit转成32bit,添加Alpha通道://convert to 32bitint _32bitBytes_per_line = (bmpWidth * 32 / 8 + 4)/4*4;p32BitBuf = new BYTE[_32bitBytes_per_line * bmpHeight];//32 bit bufint nAlpha = m_nAlpha1;//60%:153BYTE *pSrc = BmpBuffer;BYTE *pDst = p32BitBuf;int pitch = bmpWidth % 4; for(int i=0;i<bmpHeight;i++) { int realPitch = i * pitch; for(int j=0;j<bmpWidth;j++) { pDst[(i*bmpWidth+j)*4+3+realPitch] = pSrc[(i*bmpWidth+j)*3+2+realPitch];pDst[(i*bmpWidth+j)*4+2+realPitch] = pSrc[(i*bmpWidth+j)*3+1+realPitch]; pDst[(i*bmpWidth+j)*4+1+realPitch] = pSrc[(i*bmpWidth+j)*3+realPitch]; pDst[(i*bmpWidth+j)*4+realPitch] = nAlpha;} } return true;}bool CConverBMPDlg::Show32BMP(){//显示32bit的BMPInvalidate(TRUE);UpdateWindow();int i,j; CClientDC dc(this); int pitch =bmpWidth % 4;for(i=0;i<bmpHeight;i++) { int realPitch = i * pitch; for(j=0;j<bmpWidth;j++) { int a = p32BitBuf[(i*bmpWidth+j)*4+realPitch];dc.SetPixel(j,i,RGB( p32BitBuf[(i*bmpWidth+j)*4+3+realPitch]*(a / 255.0) + 255*(255-a)/255.0, p32BitBuf[(i*bmpWidth+j)*4+2+realPitch]*(a / 255.0) + 255*(255-a)/255.0, p32BitBuf[(i*bmpWidth+j)*4+1+realPitch]*(a / 255.0) + 255*(255-a)/255.0)); } } return true; }//设置32bit的bmp的alpha通道:int CConverBMPDlg::Set32BitBmpAlpha(int nAlpha){int i,j;int pitch = bmpWidth % 4;for(i=0;i<bmpHeight;i++) { int realPitch = i * pitch; for(j=0;j<bmpWidth;j++) 0{ p32BitBuf[(i*bmpWidth+j)*4+realPitch] = nAlpha;}}return 0;}
void RGB32Rotate180(BYTE *des,BYTE *src,int width,int height) { if ((!des)||(!src)) { return; } int n = 0; int linesize = width*4;for (int index=0; index < height; index++)memcpy(&des[((height-1) - index)*linesize],&src[index*linesize], linesize);}
0 0
- BMP 24 32 显示 翻转
- BMP图像翻转
- BMP显示
- SDL2解析并显示24位bmp
- ubuntu12.10 32位系统使用framebuffer显示24深度bmp文件
- BMP图片显示程序
- vc 界面显示bmp
- Symbian:显示bmp图片
- 显示BMP文件
- OpenGL BMP文件显示
- mfc动态显示bmp
- 动态显示BMP位图
- CStatic显示bmp文件
- bmp在对话框显示
- BMP显示和保存
- framebuffer显示bmp格式文件
- framebuffer显示bmp格式文件
- emWin - BMP图片显示
- linux下创建用户
- android基础笔记——广播接收者,实现短信监听
- NET三层架构开发初步
- 发布iOS应用(xcode5)到App Store(苹果商店) 详细解析
- Xcode 快捷键
- BMP 24 32 显示 翻转
- [ASP.NET MVC 小牛之路]01 - 理解MVC模式
- IOS 世界标准时间UTC /GMT 转为当前系统时区对应的时间
- 求10个数中最大值
- 安装oracle客户端和plsql的过程及相关问题解决(只是客户端,不是整个oracle环境)
- cglib代理是怎么回事
- 值得mark的11个开源机器学习项目
- iOS申请证书,Certificates, Identifiers &Profiles 简介
- 第294天(30W+5)