subject_24507.htm

来自「一些关于vc的问答」· HTM 代码 · 共 24 行

HTM
24
字号
<p>
序号:24507 发表者:CDMA2000 发表日期:2002-12-13 12:02:11
<br>主题:知道位图的数据区内容和其高度宽度等信息,怎样构造一个CBitmap对象!写一个代码
<br>内容:如题
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:王浩 回复日期:2002-12-13 13:41:57
<br>内容:&nbsp;&nbsp; BMP格式不需要进行数据压缩,所以写起来非常简单。<BR>&nbsp;&nbsp; 1 写BMP的头结构,大部分都是省的。<BR>&nbsp;&nbsp; 2 一行行的输出位图中每个象素点的BGR代码。每个象素点由4个字节组成,最高位字节固定为0,然后从高到低依次为B、G、R的值。<BR>&nbsp;&nbsp; <BR>&nbsp;&nbsp; 记住一点,行顺序是倒置的,即紧接着头结构的第一行实际是位图中的最后一行。每一行的列数必需相同,即位图必需是一个矩形结构。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:CDMA2000 回复日期:2002-12-13 14:47:23
<br>内容:给个函数代码好吗?非常谢谢
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:王浩 回复日期:2002-12-14 10:45:46
<br>内容:typedef struct tagRGBQUAD<BR>{&nbsp;&nbsp;&nbsp;&nbsp; // rgbq <BR>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;rgbBlue; <BR>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;rgbGreen; <BR>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;rgbRed; <BR>&nbsp;&nbsp;&nbsp;&nbsp;BYTE&nbsp;&nbsp;&nbsp;&nbsp;rgbReserved; <BR>} RGBQUAD; <BR><BR>//BMP文件头<BR>typedef struct&nbsp;&nbsp;&nbsp;&nbsp;tagBITMAPFILEHEADER<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;wType;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwSize;<BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;wReserved1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;wReserved2;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwOffBits;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>} BITMAPFILEHEADER,FAR *LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;<BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp;BITMAPFILEHEADERLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;14<BR><BR>//BMP图形信息头<BR>typedef struct&nbsp;&nbsp;&nbsp;&nbsp;tagBITMAPINFOHEADER<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwSize;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;&nbsp;&nbsp;&nbsp;lWidth;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;&nbsp;&nbsp;&nbsp;lHeight;<BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;wPlanes;<BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;wBitCount;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwCompression;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwSizeImage;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;&nbsp;&nbsp;&nbsp;lXPelsPerMeter;<BR>&nbsp;&nbsp;&nbsp;&nbsp;LONG&nbsp;&nbsp;&nbsp;&nbsp;lYPelsPerMeter;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwClrUsed;<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwClrImportant;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>} BITMAPINFOHEADER,FAR *LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;<BR><BR>#define&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADERLEN&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;40<BR><BR>/**************************************************************************<BR>*<BR>* 函数名称:OutputAsBMP<BR>*&nbsp;&nbsp;&nbsp;&nbsp;OutputAsBMP()<BR>* 参数:<BR>*&nbsp;&nbsp;&nbsp;&nbsp;LPGIFCOMPOSE&nbsp;&nbsp;&nbsp;&nbsp; lpGIFCo&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-指向GIFCOMPOSE结构的指针。<BR>*&nbsp;&nbsp;&nbsp;&nbsp;LPSTR&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; file&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-输出的文件名。<BR>*<BR>* 返回值:<BR>*&nbsp;&nbsp;&nbsp;&nbsp;bool&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;-是否成功输出文件。<BR>*<BR>* 说明:<BR>*&nbsp;&nbsp;&nbsp;&nbsp;该函数对一个每一点都保存为实际使用的RGB颜色值的图像缓冲区输出成一个BMP文件。<BR>**************************************************************************/<BR>bool RWGIF::OutputAsBMP(LPGIFCOMPOSE lpGIFCo,LPSTR file)<BR>{<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(lpGIFCo-&gt;bIsOutputPrompt)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\r\nOutput As BMP file! %s \r\n",file);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;if(lpGIFCo-&gt;lpColorBuff==NULL)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(lpGIFCo-&gt;bIsOutputPrompt)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;&nbsp;Failed! Image Buffer is empty!\r\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//创建一个文件准备写。<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofstream ofs;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.open(file,ios::binary|ios::out|ios::trunc);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!ofs)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(lpGIFCo-&gt;bIsOutputPrompt)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("&nbsp;&nbsp;&nbsp;&nbsp;Failed! Can't Create New File!\r\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return false;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//缓冲区中每行的字节数<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwBytesPerLineB&nbsp;&nbsp;&nbsp;&nbsp;=lpGIFCo-&gt;dwWidth*3;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//每行的字节数<BR>&nbsp;&nbsp;&nbsp;&nbsp;DWORD&nbsp;&nbsp;&nbsp;&nbsp;dwBytesPerLine&nbsp;&nbsp;&nbsp;&nbsp;=BYTE_PERLINE(dwBytesPerLineB);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//BMP文件头结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPFILEHEADER&nbsp;&nbsp;&nbsp;&nbsp;rBMPFH;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//文件签名,固定值为"BM"<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPFH.wType&nbsp;&nbsp;&nbsp;&nbsp;=0x424D;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//从文件头到实际的位图数据的偏移字节数<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPFH.dwOffBits=BITMAPFILEHEADERLEN+sizeof(BITMAPINFOHEADER);<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//文件的大小,包括BMP头结构信息。<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPFH.dwSize&nbsp;&nbsp;&nbsp;&nbsp;=dwBytesPerLine*lpGIFCo-&gt;dwDepth+rBMPFH.dwOffBits;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//保留字<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPFH.wReserved1&nbsp;&nbsp;&nbsp;&nbsp;=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPFH.wReserved2&nbsp;&nbsp;&nbsp;&nbsp;=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//BMP信息头结构<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//BMP信息头结构的长度<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.dwSize&nbsp;&nbsp;&nbsp;&nbsp;=sizeof(BITMAPINFOHEADER);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//图像的宽度和高度<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.lWidth&nbsp;&nbsp;&nbsp;&nbsp;=lpGIFCo-&gt;dwWidth;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.lHeight&nbsp;&nbsp;&nbsp;&nbsp;=lpGIFCo-&gt;dwDepth;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//固定值<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.wPlanes&nbsp;&nbsp;&nbsp;&nbsp;=1;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//颜色数目<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.wBitCount&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=24;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//是否压缩<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.dwCompression&nbsp;&nbsp;&nbsp;&nbsp;=BI_RGB;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//实际位图,即数据部分所占用的字节数<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.dwSizeImage&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//目标设备的水平和垂直分辨率<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.lXPelsPerMeter&nbsp;&nbsp;&nbsp;&nbsp;=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.lYPelsPerMeter&nbsp;&nbsp;&nbsp;&nbsp;=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//实际用到的颜色数<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.dwClrUsed&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//重要的颜色数<BR>&nbsp;&nbsp;&nbsp;&nbsp;rBMPIH.dwClrImportant&nbsp;&nbsp;&nbsp;&nbsp;=0;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.write(((LPSTR)&amp;rBMPFH)+1,1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.write((LPSTR)&amp;rBMPFH,1);<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.write((LPSTR)&amp;rBMPFH.dwSize,sizeof(DWORD));<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.write((LPSTR)&amp;rBMPFH.wReserved1,sizeof(WORD));<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.write((LPSTR)&amp;rBMPFH.wReserved2,sizeof(WORD));<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.write((LPSTR)&amp;rBMPFH.dwOffBits,sizeof(DWORD));<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.write((LPSTR)&amp;rBMPIH,sizeof(BITMAPINFOHEADER));<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//输出缓冲区的首地址<BR>&nbsp;&nbsp;&nbsp;&nbsp;LPSTR&nbsp;&nbsp;&nbsp;&nbsp;lpBuff&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=lpGIFCo-&gt;lpColorBuff;<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;//申请一个新行的缓冲区。<BR>&nbsp;&nbsp;&nbsp;&nbsp;LPSTR&nbsp;&nbsp;&nbsp;&nbsp;lpLineBuff&nbsp;&nbsp;&nbsp;&nbsp;=new char[dwBytesPerLine];<BR>&nbsp;&nbsp;&nbsp;&nbsp;memset(lpLineBuff,0,dwBytesPerLine);<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//临时变量<BR>&nbsp;&nbsp;&nbsp;&nbsp;WORD&nbsp;&nbsp;&nbsp;&nbsp;wi,wk;<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//写数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(DWORD dwRow=0;dwRow&lt;lpGIFCo-&gt;dwDepth;dwRow++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//拷贝到行缓冲区<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(lpLineBuff,lpBuff,dwBytesPerLineB);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//调整数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(wi=0;wi&lt;dwBytesPerLineB;wi+=3)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wk&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=lpLineBuff[wi];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLineBuff[wi]&nbsp;&nbsp;&nbsp;&nbsp;=lpLineBuff[wi+2];<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpLineBuff[wi+2]=wk;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//输出一行数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ofs.write(lpLineBuff,dwBytesPerLine);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//修正偏移指针<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpBuff&nbsp;&nbsp;&nbsp;&nbsp;+=dwBytesPerLineB;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//关闭文件<BR>&nbsp;&nbsp;&nbsp;&nbsp;ofs.close();<BR><BR>&nbsp;&nbsp;&nbsp;&nbsp;return true;<BR>}<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?