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>内容: BMP格式不需要进行数据压缩,所以写起来非常简单。<BR> 1 写BMP的头结构,大部分都是省的。<BR> 2 一行行的输出位图中每个象素点的BGR代码。每个象素点由4个字节组成,最高位字节固定为0,然后从高到低依次为B、G、R的值。<BR> <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>
回复者: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>{ // rgbq <BR> BYTE rgbBlue; <BR> BYTE rgbGreen; <BR> BYTE rgbRed; <BR> BYTE rgbReserved; <BR>} RGBQUAD; <BR><BR>//BMP文件头<BR>typedef struct tagBITMAPFILEHEADER<BR>{<BR> WORD wType;<BR> DWORD dwSize;<BR> WORD wReserved1;<BR> WORD wReserved2;<BR> DWORD dwOffBits;<BR> <BR>} BITMAPFILEHEADER,FAR *LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;<BR><BR>#define BITMAPFILEHEADERLEN 14<BR><BR>//BMP图形信息头<BR>typedef struct tagBITMAPINFOHEADER<BR>{<BR> DWORD dwSize;<BR> LONG lWidth;<BR> LONG lHeight;<BR> WORD wPlanes;<BR> WORD wBitCount;<BR> DWORD dwCompression;<BR> DWORD dwSizeImage;<BR> LONG lXPelsPerMeter;<BR> LONG lYPelsPerMeter;<BR> DWORD dwClrUsed;<BR> DWORD dwClrImportant;<BR> <BR>} BITMAPINFOHEADER,FAR *LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;<BR><BR>#define BITMAPINFOHEADERLEN 40<BR><BR>/**************************************************************************<BR>*<BR>* 函数名称:OutputAsBMP<BR>* OutputAsBMP()<BR>* 参数:<BR>* LPGIFCOMPOSE lpGIFCo -指向GIFCOMPOSE结构的指针。<BR>* LPSTR file -输出的文件名。<BR>*<BR>* 返回值:<BR>* bool -是否成功输出文件。<BR>*<BR>* 说明:<BR>* 该函数对一个每一点都保存为实际使用的RGB颜色值的图像缓冲区输出成一个BMP文件。<BR>**************************************************************************/<BR>bool RWGIF::OutputAsBMP(LPGIFCOMPOSE lpGIFCo,LPSTR file)<BR>{<BR> if(lpGIFCo->bIsOutputPrompt)<BR> printf("\r\nOutput As BMP file! %s \r\n",file);<BR><BR> if(lpGIFCo->lpColorBuff==NULL)<BR> {<BR> if(lpGIFCo->bIsOutputPrompt)<BR> printf(" Failed! Image Buffer is empty!\r\n");<BR> return false;<BR> }<BR> <BR> //创建一个文件准备写。<BR> ofstream ofs;<BR> ofs.open(file,ios::binary|ios::out|ios::trunc);<BR> <BR> if(!ofs)<BR> {<BR> if(lpGIFCo->bIsOutputPrompt)<BR> printf(" Failed! Can't Create New File!\r\n");<BR> return false;<BR> }<BR><BR> //缓冲区中每行的字节数<BR> DWORD dwBytesPerLineB =lpGIFCo->dwWidth*3;<BR> <BR> //每行的字节数<BR> DWORD dwBytesPerLine =BYTE_PERLINE(dwBytesPerLineB);<BR> <BR> //BMP文件头结构<BR> BITMAPFILEHEADER rBMPFH;<BR> <BR> //文件签名,固定值为"BM"<BR> rBMPFH.wType =0x424D;<BR> <BR> //从文件头到实际的位图数据的偏移字节数<BR> rBMPFH.dwOffBits=BITMAPFILEHEADERLEN+sizeof(BITMAPINFOHEADER);<BR><BR> //文件的大小,包括BMP头结构信息。<BR> rBMPFH.dwSize =dwBytesPerLine*lpGIFCo->dwDepth+rBMPFH.dwOffBits;<BR> <BR> //保留字<BR> rBMPFH.wReserved1 =0;<BR> rBMPFH.wReserved2 =0;<BR> <BR> //BMP信息头结构<BR> BITMAPINFOHEADER rBMPIH;<BR> <BR> //BMP信息头结构的长度<BR> rBMPIH.dwSize =sizeof(BITMAPINFOHEADER);<BR> <BR> //图像的宽度和高度<BR> rBMPIH.lWidth =lpGIFCo->dwWidth;<BR> rBMPIH.lHeight =lpGIFCo->dwDepth;<BR> <BR> //固定值<BR> rBMPIH.wPlanes =1;<BR> <BR> //颜色数目<BR> rBMPIH.wBitCount =24;<BR> <BR> //是否压缩<BR> rBMPIH.dwCompression =BI_RGB;<BR> <BR> //实际位图,即数据部分所占用的字节数<BR> rBMPIH.dwSizeImage =0;<BR> <BR> //目标设备的水平和垂直分辨率<BR> rBMPIH.lXPelsPerMeter =0;<BR> rBMPIH.lYPelsPerMeter =0;<BR> <BR> //实际用到的颜色数<BR> rBMPIH.dwClrUsed =0;<BR> <BR> //重要的颜色数<BR> rBMPIH.dwClrImportant =0;<BR> <BR> ofs.write(((LPSTR)&rBMPFH)+1,1);<BR> ofs.write((LPSTR)&rBMPFH,1);<BR> ofs.write((LPSTR)&rBMPFH.dwSize,sizeof(DWORD));<BR> ofs.write((LPSTR)&rBMPFH.wReserved1,sizeof(WORD));<BR> ofs.write((LPSTR)&rBMPFH.wReserved2,sizeof(WORD));<BR> ofs.write((LPSTR)&rBMPFH.dwOffBits,sizeof(DWORD));<BR> ofs.write((LPSTR)&rBMPIH,sizeof(BITMAPINFOHEADER));<BR> <BR> //输出缓冲区的首地址<BR> LPSTR lpBuff =lpGIFCo->lpColorBuff;<BR><BR> //申请一个新行的缓冲区。<BR> LPSTR lpLineBuff =new char[dwBytesPerLine];<BR> memset(lpLineBuff,0,dwBytesPerLine);<BR> <BR> //临时变量<BR> WORD wi,wk;<BR> <BR> //写数据<BR> for(DWORD dwRow=0;dwRow<lpGIFCo->dwDepth;dwRow++)<BR> {<BR> //拷贝到行缓冲区<BR> memcpy(lpLineBuff,lpBuff,dwBytesPerLineB);<BR> <BR> //调整数据<BR> for(wi=0;wi<dwBytesPerLineB;wi+=3)<BR> {<BR> wk =lpLineBuff[wi];<BR> lpLineBuff[wi] =lpLineBuff[wi+2];<BR> lpLineBuff[wi+2]=wk;<BR> }<BR> <BR> //输出一行数据<BR> ofs.write(lpLineBuff,dwBytesPerLine);<BR> <BR> //修正偏移指针<BR> lpBuff +=dwBytesPerLineB;<BR> }<BR> <BR> //关闭文件<BR> ofs.close();<BR><BR> 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 + -
显示快捷键?