源码mfc界面位图文件读写综述_第1页
源码mfc界面位图文件读写综述_第2页
源码mfc界面位图文件读写综述_第3页
源码mfc界面位图文件读写综述_第4页
源码mfc界面位图文件读写综述_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

类的三、CFG_DIB上设计了通用类CFG_DIB,用于进行位图文件的读写操作。位图文件由三部分组成:文件头+位图信息+typedefstructtagBITMAPFILEHEADER{//bmfhWORDbfType;DWORDbfSize;WORD WORD DWORD}typedefstructtagBITMAPINFO{BITMAPINFOHEADERbmiHeader;RGBQUADbmiColors[1];}可见位图信息也是由两部分组成的:位图信息头+度、目标设备的位平面数、图像的压缩格式。以下是位图信息头结构的定义:typedefstructtagBITMAPINFOHEADER{//bmihDWORDbiSize;LONGbiWidth;LONGbiHeight;WORDbines;WORDbiBitCount DWORDLONGLONGDWORDDWORD}biSize结构BITMAPINFOHEADERsizeof(BITMAPINFOHEADER)*每个像素的位数以字节为单位的图像数据的大小(对BI_RGB压缩方式而言调色板中实际使用的颜色数现实位图时必须的颜色数说明:*0JPEG1,单,调色板中含有两种颜色,也就是我们通常说的黑白4,168,256,通常说的灰度16,64K图,一般没有调色板,图像数据中每两个字节表示一个像素,56个位表示一个RGB24,16M真彩,一般没有调色板,图像数据中每3个字节表示一个像素,每个字节表示一个RGB分即RGBA模式0,表示使用biBitCount确定的全部颜色,例外是使用的颜色树木小于制定的颜色深度0素数据中直接对对应像素的RGB(A)16位一下的图像,由于其位图像素数据中记录的只是调色板索引值,因而需要根据这个索引到调色板去取得相应的RGB(A)颜色。1带调色板和不带调色板位图之间的区别typedefstructtagRGBQUAD{//rgbqBYTErgbBlue;BYTErgbGreen;BYTErgbRed;BYTErgb }其中需要注意的问题是,RGBQUADBGR,而不是平常的RGB8图,每节代表了一个像素。1、类的classCFG_DIB:public{CFG_DIB(intwidth,intheight,intnBitCounts);virtualLPBYTEm_lpDIBits//DIBLPBITMAPINFOHEADERm_lpBMPHdr//BITMAPINFOHEADERLPVOIDm_lpvColorTable颜色表信息HPALETTEm_hPalette;//条调色板DWORDm_dwImageSize;非BITMAPINFOHEADER或BITMAPFILEHEADERintm_nColorEntriesCPointm_Dest;//目的矩形域的左上角坐标CSizem_DestSize;显示矩形的宽度和高度CPointm_Src;//原矩形左下角坐标CSizem_SrcSize;voidInitDestroyvoidComputePaletteSize(intnBitCounts);计算调色板大小voidComputeImage();//计算图象大小//从BMPDIBBOOLReadFile(CFile*//从BMPDIB信息,与ReadFile不同的是使用CreateSectionBOOLReadSection(CFile*pFile,CDC*pDC=//将DIB写入文件,保存成BMP格BOOLWriteFile(CFile*//width,height,nBitCountsBOOLNewFile(intwidth,intheight,intBOOLCloseFile();//BOOLDisy(CDC*HBITMAPCreateBitmap(CDC*pDC);DIBHBITMAPCreateSection(CDC*pDCNULL)//DIBBOOLSetLogPalette(CDC*//DIBBOOL//DIBUINTUseLogPalette(CDC*//得到BitmapInfoHeaderint{returnsizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)*}intGetHeight(){if(m_lpBMPHdr==NULL)return0;returnm_lpBMPHdr->biHeight;}intGetWidth(){if(m_lpBMPHdr==NULL)return0;returnm_lpBMPHdr->biWidth;}int{return}longGetLineBit();2、位图的动态分配内存的方法初始化位位图数据的指针,后者则使用API函数,根据位图信息初始化位图1m_lpDIBits=(LPBYTE)newchar[m_dwImageSize];2m_hBitmap::CreateDIBSection(pDC->GetSafeHdc(),(LPBITMAPINFO)m_lpBMPHdr,DIB_RGB_COLORS,(LPVOID*)&m_lpDIBits,NULL,3、位图过程中的调色板的创建和调用关于调色板的详细情况,本文不作详细介绍,只是对位图的过程中需要调用的对调色板进行操作的相在显示位图之前,设置调色板:if(m_hPaletteNULL)::SelectPalette(pDC->GetSafeHdc(),m_hPalette,}4位图的显示还是调用Windows的API函数来进行,需要传递的参数包括当前位图信息头,位图数据等:::StretchDIBits(pDC->GetSafeHdc(),m_Destx,m_Dest.y,m_Srcx,m_Src.y,m_SrcSize.cx,m_SrcSize.cy,m_lpDIBits,(LPBITMAPINFO)m_lpBMPHdr,DIB_RGB_COLORS,SRCCOPY);其中的m_Dest,m_DestSize,m_Src,m_SrcSizem_Dest,m_DestSize,m_Src,m_SrcSize需要在现实之前设置好。5、位图的。位图的用WriteFile实现40补齐。以下是处理的办法:DWORDdwBytes=((DWORD)m_lpBMPHdr->biWidth*m_lpBMPHdr->biBitCount)/if(((DWORD)m_lpBMPHdr->biWidth*m_lpBMPHdr->biBitCount)%32){}dwBytes*=m_dwImageSize=dwBytes*m_lpBMPHdr-三、CFG_DIB以下是CFG_DIB#includeCFG_DIB//newm_fgdib.NewFile(width,height,//openfileCFile*pf=newpf->Open(sFileName,Cfile&::modeRead);deletepf;//drawm_fgdibm_Destx=0;m_fgdibm_Dest.y=m_fgdibm_DestSize.cx=m_fgdib.GetWidth();m_fgdibm_DestSize.cy=m_fgdib.GetHeight();m_fgdibm_Src.x=0;m_fgdibm_Src.y=m_fgdibm_SrcSize.cx=m_fgdib.GetWidth();m_fgdib

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论