⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_34261.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:34261 发表者:有问题的菜鸟 发表日期:2003-03-28 09:03:06
<br>主题:事情是这样的哈:主要是用VC做一个手机图片短信的解码,具体步骤如下:(在线等待中)
<br>内容:先读取一个BMP或GIF的文件<BR><BR>然后去掉他的文件头,信息头,颜色表,只保留基本数据<BR>接着添加我自己为特定手机定义的一个头<BR><BR>在将这个数据流转成十六进制存到数据库<BR><BR>有办法没???兄弟们,在线等待中
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:有问题的菜鸟 回复日期:2003-03-28 11:14:18
<br>内容:我已经得到了如下的东西,我们知道一个BMP文件包括:文件头+信息头+颜色表+位数据,现在我只想留下位数据,我该如何做呢??<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CByteArray Array;<BR>&nbsp;&nbsp;&nbsp;&nbsp;CFile file;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(!file.Open(m_strFile,CFile::modeRead))<BR>&nbsp;&nbsp;&nbsp;&nbsp;{<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;MessageBox("不能打开文件"+m_strFile);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return;<BR>&nbsp;&nbsp;&nbsp;&nbsp;}<BR>&nbsp;&nbsp;&nbsp;&nbsp;//将文件二进制流加进数组<BR>&nbsp;&nbsp;&nbsp;&nbsp;BYTE *pData=new BYTE[10000];<BR>&nbsp;&nbsp;&nbsp;&nbsp;file.Read(pData,10000);<BR>&nbsp;&nbsp;&nbsp;&nbsp;for(int i=0;i&lt;10000;i++)<BR>&nbsp;&nbsp;&nbsp;&nbsp;Array.Add(*(pData+i)); <BR>&nbsp;&nbsp;&nbsp;&nbsp;//获得位图文件头信息长度<BR>&nbsp;&nbsp;&nbsp;&nbsp;int HeaderLen=78+sizeof(BITMAPFILEHEADER);<BR>&nbsp;&nbsp;&nbsp;&nbsp;Array.RemoveAt(0,HeaderLen);//去掉头信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;//获得位图信息<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFOHEADER &amp;bmiHeader=*(LPBITMAPINFOHEADER)Array.GetData();<BR>&nbsp;&nbsp;&nbsp;&nbsp;BITMAPINFO &amp;bmInfo=*(LPBITMAPINFO)Array.GetData();<BR>&nbsp;&nbsp;&nbsp;&nbsp;//获得位图颜色数<BR>&nbsp;&nbsp;&nbsp;&nbsp;int nColors=bmiHeader.biClrUsed?bmiHeader.biClrUsed:1&lt;&lt;bmiHeader.biBitCount;<BR>&nbsp;&nbsp;&nbsp;&nbsp;//获得位图数据<BR>&nbsp;&nbsp;&nbsp;&nbsp;LPVOID lpDIBBits;<BR>&nbsp;&nbsp;&nbsp;&nbsp;if(bmInfo.bmiHeader.biBitCount&gt;8)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpDIBBits=(LPVOID)((LPDWORD)(bmInfo.bmiColors+bmInfo.bmiHeader.biClrUsed)+((bmInfo.bmiHeader.biCompression==BI_BITFIELDS)?3:0));<BR>&nbsp;&nbsp;&nbsp;&nbsp;else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lpDIBBits=(LPVOID)(bmInfo.bmiColors+nColors);<BR>&nbsp;&nbsp;&nbsp;&nbsp;CClientDC dc(NULL);
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:mimibaby 回复日期:2003-03-28 11:14:33
<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>
回复者:杀杀杀杀问 回复日期:2003-03-28 11:23:48
<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>
回复者:mimibaby 回复日期:2003-03-28 11:24:48
<br>内容: <BR><BR><BR>将就着看吧!<BR>说明:CDrawView 是一个视图类用来显示位图。<BR>void CDrawView::DrawBmp3(CDC* pDC,int x,int y,/*int wide,int high,*/char *fName,int DrawMode)<BR>/*pDC is Dvice Context.<BR>/* x is 横坐标.<BR>/*y is 纵坐标。<BR>/*fName is the bitmap you want to display.<BR><BR>{<BR>char p1[80];<BR>CRect r;<BR>BITMAPFILEHEADER fileh; //定义一个文件标题结构<BR>BITMAPINFOHEADER fileh1; //定义一个信息标题结构<BR>CBitmap Bitmap,*pOldMap; //定义一个位图对象<BR>CDC pDC1; //定义一个设备描述表<BR>unsigned char *BmpChar; <BR>int minx,miny,maxx,maxy,BmpStartX,BmpStartY,BmpEndX,BmpEndY;<BR>int i,j,xh,i1,j1,c1,c2,c3,nPalate;<BR>int IsCompress,bicount,bytes_per_line,wide1,high1;<BR>long filecd,boff,boxmfile1;<BR>float pbX,pbY;<BR>CPalette palatte,*pOldPalatte; //定义一个调色板结构<BR>LOGPALETTE* cp; //定义一个逻辑调色板结构<BR>RGBQUAD bmicolors[256]; //<BR>CFile FileBmp;<BR>BOOL YN=FileBmp.Open(fName,Cfile::typeBinary|Cfile::modeRead);<BR>if(YN==0) //如果文件打开错误,给出出错信息<BR>{<BR>strcpy(p1,"位图文件"); strcpy(p1,fName);<BR>strcat(p1,"不存在"); <BR>AfxMessageBox(p1);<BR>return;<BR>}<BR>FileBmp.Read((unsigned char *)&amp;fileh,sizeof(fileh));<BR>if(fileh.bfType!=19778) //判断是否是一个位图文件,19778是"BM"的数值<BR>{<BR>FileBmp.Close();<BR>strcpy(p1,"文件"); strcat(p1,fName);<BR>strcat(p1,"不是一个位图文件");<BR>AfxMessageBox(p1);<BR>return;<BR>}<BR>boff=fileh.bfOffBits; //文件头的长度,文件从开始到实际位图起点的字节偏移量<BR>filecd=fileh.bfSize; //位图文件的大小<BR>FileBmp.Read((unsigned char *)&amp;fileh1,sizeof(fileh1));//读入信息标题<BR>GetClientRect(&amp;r);<BR>if(DrawMode==1) //原样大小显示<BR>{<BR>wide1=fileh1.biWidth;<BR>high1=fileh1.biHeight;<BR>}<BR>/* else if(DrawMode==2)//按参数给定的区域显示,纵横伸缩比例一样<BR>{<BR>float pbX=(float)wide/fileh1.biWidth;<BR>float pbY=(float)high/fileh1.biHeight;<BR>if(pbX&gt;pbY)<BR>{<BR>high1=high;<BR>wide1=(int)(pbY*wide);<BR>}<BR>else<BR>{<BR>wide1=wide;<BR>high1=(int)(pbX*high);<BR>}<BR>}<BR>else if(DrawMode==3) //严格按参数给定的区域显示<BR>{<BR>wide1=wide;<BR>high1=high;<BR>}*/<BR>bicount=fileh1.biBitCount; //位图的位面数<BR>IsCompress=fileh1.biCompression; //是否进行压缩<BR>filecd=fileh1.biSizeImage; //图像尺寸大小<BR>bytes_per_line=((long)fileh1.biWidth*bicount+31L)/32*4;<BR>if(fileh1.biClrUsed==0) //如果颜色索引数等于0<BR>{<BR>if(bicount!=24) //如果不是24位位图<BR>nPalate=(int)(pow(2,bicount)); //得到调色板颜色数<BR>else<BR>nPalate=0; //如果是24位位图,调色板颜色数为0<BR>}<BR>else //如果颜色索引数不等于0<BR>{<BR>if(bicount!=24)<BR>nPalate=fileh1.biClrUsed;//直接得到调色版数量<BR>else<BR>nPalate=0;<BR>}<BR>if(nPalate&gt;0)//如果调色板颜色数量大于0<BR>{<BR>for(i=0;i FileBmp.Read((unsigned char *)&amp;bmicolors[i],sizeof(bmicolors[i]));<BR>//以下是装入逻辑调色板的工作<BR>cp=(LOGPALETTE *)malloc(sizeof(LOGPALETTE)+nPalate*sizeof(PALETTEENTRY));<BR>cp-&gt;palNumEntries=nPalate; //设置调色板入口<BR>cp-&gt;palVersion=0x0300;<BR>for(i=0;i {<BR>cp-&gt;palPalEntry[i].peRed=bmicolors[i].rgbRed;<BR>cp-&gt;palPalEntry[i].peGreen=bmicolors[i].rgbGreen;<BR>cp-&gt;palPalEntry[i].peBlue=bmicolors[i].rgbBlue;<BR>}<BR>palatte.CreatePalette(cp); //创建逻辑调色板<BR>pDC1.CreateCompatibleDC(pDC);<BR>pOldPalatte=pDC1.SelectPalette(&amp;palatte,FALSE);<BR>pDC1.RealizePalette();//从当前的调色板影射入口到系统调色板<BR>}<BR>//分配一个用来读入位图一行位图数据的字符串<BR>BmpChar=new unsigned char[bytes_per_line];<BR>if(IsCompress!=0)<BR>{<BR>//如果位图是采用压缩方式的,我们不进行处理退出<BR>strcpy(p1,"不处理压缩格式的位图文件");<BR>AfxMessageBox(p1);<BR>FileBmp.Close();<BR>delete BmpChar;<BR>return ;<BR>}<BR>if(y+high1r.bottom||x+wide1r.right)<BR>{<BR>FileBmp.Close();<BR>delete BmpChar;<BR>return ;<BR>}<BR>//得到在客户区上实际图像绘制区域的大小<BR>minx=max(x,r.left); //右上角横坐标<BR>maxx=min(x+wide1,r.right);<BR>miny=max(y,r.top);<BR>maxy=min(y+high1,r.bottom);//右下角纵坐标<BR>BmpStartX=(int)((float)fileh1.biWidth*(float)(minx-x)/(float)wide1); //每行起点<BR>BmpEndX=fileh1.biWidth-1-(int)((float)fileh1.biWidth*(float)(x+wide1-maxx)/(float)wide1);//终点<BR>BmpEndY=fileh1.biHeight-1-(int)(((float)fileh1.biHeight*(y+high1-maxy)/(float)high1));//起始行<BR>BmpStartY=(int)((float)fileh1.biHeight*(miny-y)/(float)high1); //终止行<BR>pbX=(float)fileh1.biWidth/wide1; //得到水平方向图像像素与要显示像素的比例<BR>pbY=(float)fileh1.biHeight/high1; //竖直方向<BR>if(pbX&gt;1.5) //如果比例较大<BR>{<BR>BmpStartX=minx; //将屏幕上图像显示区的起点作为起点<BR>BmpEndX=maxx-1; //终点作为终点<BR>}<BR>if(pbY&gt;1.5) //如果竖直方向比例较大<BR>{<BR>BmpStartY=miny; //起始行<BR>BmpEndY=maxy-1; //结束行<BR>}<BR>//建立一个空白位图<BR>Bitmap.CreateCompatibleBitmap(pDC,BmpEndX-BmpStartX+1,BmpEndY-BmpStartY+1);<BR>//pDC1.CreateCompatibleDC(pDC);//建立一个与当前设备兼容的内存设备描述对象<BR>pOldMap=pDC1.SelectObject(&amp;Bitmap); //将空白位图选入内存设备描述对象<BR>for(i=BmpEndY;i&gt;=BmpStartY;i--) <BR>{<BR>if(pbY&gt;1.5) //如果图像纵向压缩比例较大<BR>i1=(int)(pbY*(i-y)); //得到图像文件中实际起始行<BR>else <BR>i1=i;<BR>//以下得到实际起始行在文件中的位置,将这一行信息读入BmpChar中<BR>boxmfile1=boff+(long)bytes_per_line*(fileh1.biHeight-1-i1);<BR>FileBmp.Seek(boxmfile1,0);<BR>FileBmp.Read((unsigned char *)BmpChar,bytes_per_line);<BR>for(j=BmpStartX;j&lt;=BmpEndX;j++) //对一行中所有要显示的像素循环<BR>{<BR>if(pbX&gt;1.5) //如果横向压缩较大,得到像素点在一行中的实际位置<BR>i1=(int)(pbX*(j-x));<BR>else //否则,j的位置就是像素点在一行中的实际位置<BR>i1=j; <BR>if(bicount==1) //如果是1位面位图<BR>{<BR>j1=i1/8;<BR>xh=*(BmpChar+j1);<BR>j1=(int)(fmod(j,8));<BR>j1=(int)(pow(2,7-j1));<BR>//在内存描述对象中写入点<BR>if(xh&amp;j1)<BR>pDC1.SetPixel(j-BmpStartX,i-BmpStartY,RGB(bmicolors[1].rgbRed,<BR>bmicolors[1].rgbGreen,bmicolors[1].rgbBlue));<BR>else<BR>pDC1.SetPixel(j-BmpStartX,i-BmpStartY,RGB(bmicolors[0].rgbRed,<BR>bmicolors[0].rgbGreen,bmicolors[0].rgbBlue));<BR>}<BR>else if(bicount==4)//如果是4位面位图<BR>{<BR>//以下得到像素的实际值<BR>j1=i1/2;<BR>xh=*(BmpChar+j1);<BR>if(j1*2!=j)<BR>j1=xh-xh/16*16;<BR>else<BR>j1=xh/16;<BR>pDC1.SetPixel(j-BmpStartX,i-BmpStartY,RGB(bmicolors[j1].rgbRed,<BR>bmicolors[j1].rgbGreen,bmicolors[j1].rgbBlue));<BR>}<BR><BR>else if(bicount==8) //如果是8位面位图<BR>{<BR>j1=*(BmpChar+i1);<BR>pDC1.SetPixel(j-BmpStartX,i-BmpStartY,RGB(bmicolors[j1].rgbRed,<BR>bmicolors[j1].rgbGreen,bmicolors[j1].rgbBlue));<BR>}<BR>else if(bicount==24)<BR>{<BR>c1=*(BmpChar+3*(int)i1);<BR>c2=*(BmpChar+3*(int)i1+1);<BR>c3=*(BmpChar+3*(int)i1+2);<BR>pDC1.SetPixel(j-BmpStartX,i-BmpStartY,RGB(c3,c2,c1));<BR>}<BR>}<BR>}<BR>pDC-&gt;StretchBlt(minx,miny,maxx-minx,maxy-miny,<BR>&amp;pDC1,0,0,BmpEndX-BmpStartX+1,BmpEndY-BmpStartY+1,SRCCOPY);<BR>pDC1.SelectObject(pOldMap);<BR>Bitmap.DeleteObject(); //删除位图<BR>delete BmpChar; //释放字符串空间 <BR>FileBmp.Close(); //关闭文件<BR>if(nPalate&gt;0) //如果调色板颜色数量大于0<BR>{<BR>free(cp);<BR>pDC1.SelectPalette(pOldPalatte,0);<BR>}<BR>return ;<BR>}<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>
回复者:有问题的菜鸟 回复日期:2003-03-28 11:42:20
<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>
回复者:不说 回复日期:2003-03-28 12:44:30
<br>内容:你是给哪家手机做这种图啊?搞清楚人家图的编码格式了没?不同的手机的不同功能的图的格式定义大都不一样的……<BR><BR>俺觉得正确的步骤应该是这样地:<BR>1)搞清楚自己最后要输出的图是什么格式的(就是去掉短信头的所谓“原始数据”)<BR>2)如果是标准格式,比如bmp,gif,png什么的就省事了,什么都不用做就可以了,也许需要改一下色深。<BR>3)如果是自定义格式,那么你读入这个bmp或者gif后,先画到一个DC上,再用GetPixel依次取出每一个pixel的颜色值,通过你对最后输出的文件格式的了解“映射”到手机图文件的相应pixel上再写入文件<BR>4)都处理完之后的文件就是你想要的那种东西了。<BR><BR>//忘了说,图片的大小也是需要调整的(多数情况),因此画到DC上是狠必要的<BR>2003-3-28 12:54:51

⌨️ 快捷键说明

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