




已阅读5页,还剩1页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
CFile myfile; myfile.Open(filename,CFile:modeRead|CFile:typeBinary); char buffGetLength+1 = 0; myfile.Read(buff,myfile.GetLength(); send(socket,buff,myfile.GetLength(),0);读取RGBvoid ReadBitMap( CString strFileName , int x , int y )CFile file;if(!file.Open(strFileName,CFile:modeRead|CFile:typeBinary)return;BITMAPFILEHEADER BitmapHead;if(file.Read(&BitmapHead,sizeof(BITMAPFILEHEADER)!=sizeof(BITMAPFILEHEADER)return;if(BitmapHead.bfType!=0x4d42)return;BITMAPINFOHEADER BitmapInfo;if(file.Read(&BitmapInfo,sizeof(BITMAPINFOHEADER)!=sizeof(BITMAPINFOHEADER)return;if(BitmapInfo.biBitCount!=24)return;DWORD dataByte=BitmapHead.bfSize-BitmapHead.bfOffBits;unsigned char* pic_buf = (BYTE*)new chardataByte;BITMAPINFO* pic_pbmi = (BITMAPINFO*)new charsizeof(BITMAPINFO);memcpy(pic_pbmi,&BitmapInfo,sizeof(BITMAPINFOHEADER);int pic_rowSize = WidthBytes(pic_pbmi-bmiHeader.biWidth*24);if(file.Read(pic_buf ,dataByte)!=dataByte)return;file.Close();delete pic_buf;pic_buf里存储的就是r,g,b值,buf0 是r,buf1是g,buf2是b的,这是第一个点的像素,下来buf3 buf4 buf5是第二个的,以此类推。网上代码很多啊C/C+ code CFile cf; if(!cf.Open(pathname,CFile:modeRead) return false; DWORD bitfilesize=cf.GetLength()-sizeof(BITMAPFILEHEADER);/bitfilesize为除去文件头剩余文件的大小 unsigned char* pbitfile=new unsigned charbitfilesize; /pbitfile指向了文件信息头的位置 if(!pbitfile) /如果内存申请失败,就返回 return false; BITMAPFILEHEADER bfh; if(cf.Read(&bfh,sizeof(BITMAPFILEHEADER)!=sizeof(BITMAPFILEHEADER) /文件头读取 /*|bfh.bfType!=BM*/|(cf.Read(pbitfile,bitfilesize)!=bitfilesize)/判断文件格式,和读取文件内容 :MessageBox(NULL,_T(ERROR),NULL,MB_OKCANCEL); delete pbitfile; /读取失败,就删除申请的内存 return 0; if(m_pbmp!=NULL) /防止多次载入图片,而导致内存的泄露 delete m_pbmp; if(m_palette.GetSafeHandle ()!=NULL) /同上 m_palette.DeleteObject(); BITMAPINFOHEADER *pbih=(BITMAPINFOHEADER*)pbitfile;/pbih指向了文件信息头 m_bitid=pbih; /付给了成员变量,m_biid指向了文件信息头 m_prq=(RGBQUAD*)&pbitfilesizeof(BITMAPINFOHEADER); /取得palette的地址 m_paletteentry=1biBitCount ; /判断 if(pbih-biClrUsed!=0) /判断是否实际应用了那么多的颜色 m_paletteentry=pbih-biClrUsed ; if(pbih-biBitCount8) /判断是否是含有调色板 m_paletteentry=0; m_pbit=pbitfile-(bfh.bfOffBits-sizeof(BITMAPFILEHEADER);/指向实际的数据文件 if(m_paletteentry) LOGPALETTE *pLp=(LOGPALETTE*)new unsigned charsizeof(LOGPALETTE)+ m_paletteentry*sizeof(PALETTEENTRY); if(pLp) pLp-palVersion=0x300; pLp-palNumEntries =m_paletteentry; for(int i=0;ipalPalEntryi.peRed =m_prq-rgbRed ; pLp-palPalEntryi.peBlue=m_prq-rgbBlue; pLp-palPalEntryi.peGreen=m_prq-rgbGreen; m_palette.CreatePalette(pLp); delete pLp; 因为bmp图像每行所占字节必须是4的倍数,你必须根据图像的宽度自己算出每行所占的字节数,记为biBytesPerLine。假定你已经找到了图像数据的起始地址为BYTE *biBits,用y代表第y行,x代表第y列,那么某点的rgb就为r=biBitsy*biBytesPerLine+x;g=biBitsy*biBytesPerLine+x+1;b=biBitsy*biBytesPerLine+x+2;unsigned char *pxtop,*pxbottom,*pxtemp; BITMAP topBM,bottomBM; HBITMAP tempBitmap;if (TopBitmap!=NULL)GetObject(TopBitmap,sizeof(BITMAP),&topBM);maxx=topBM.bmWidth;maxy=topBM.bmHeight;pxtop=new unsigned char topBM.bmHeight * topBM.bmWidthBytes;GetBitmapBits(TopBitmap,topBM.bmHeight * topBM.bmWidthBytes,pxtop);以上代码绝以可用,给你作一个参考。我正在写的程序中拷的一段下来的。主要是这一句:GetBitmapBits(TopBitmap,topBM.bmHeight * topBM.bmWidthBytes,pxtop);RGB跟显示模式有关。24位:B(1Bytes)G(1Bytes)R(1Bytes)32位:一个字节不用,BGR16位的复杂一点。/获取图像RGBvoid CBmpDemoView:OnBmpHandleGray() / TODO: Add your command handler code here CDC *pDC=this-GetDC(); /获得设备上下文 /CRect m_rect; /this-GetClientRect(&m_rect); /获得窗口客户区 COLORREF color; BYTE r,g,b; BYTE gray; for(int i=0;im_BMInfo.bmWidth;i+) for(int j=0;jGetPixel(i,j); /获得颜色 r=GetRValue(color); g=GetGValue(color); b=GetBValue(color); gray=(int)(0.38*r + 0.49*g + 0.1*b);/设置灰度颜色值 color=RGB(gray, gray, gray); pDC-SetPixel(i, j, color); /用灰度颜色画点 不用CFile读,直接用LoadImage加载位图进一个内存DC,然后用GetDIBits或是GetBitmapBits读出位图进一个数组,用GetBitmap(&bmpx)获取位图信息,然后通过rgb=y*bmpx.bmWidthBytes+x*(bmpx.bmBitsPixel/8)来获取每一个点在数组中的位置,x,y是点的坐标,rgb是B色,rgb+1是G色,rgb+2是R色.我也问过这个问题,还谢谢大家的帮助!/Expert/topic/2919/2919100.xml?temp=.7187616还有CBitmap bitmap;BITMAP bm;/./bitmap-GetBitmap(&bm);int bitmapsize=bm.bmHeight*bm.bmwidthBytes;BYTE* px=(BYTE*)GlobalAlloc(GPTR,bitmapsize);/声明px数组,可惜是一维的bitmap-GetBitmapBus(bitmapsize,px);int rgb,x,y;int Pi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论