VC60下bmp位图的读取与显示Word文件下载.docx
《VC60下bmp位图的读取与显示Word文件下载.docx》由会员分享,可在线阅读,更多相关《VC60下bmp位图的读取与显示Word文件下载.docx(13页珍藏版)》请在冰豆网上搜索。
DWORDbiCompression;
//compressionornot
DWORDbiSizeImage;
//Imagesize=width*height(其中width必须为4的倍数。
LONGbiXPelsPerMeter;
//
LONGbiYPelsPerMeter;
DWORDbiClrUsed;
DWORDbiClrImportant;
}BITMAPINFOHEADER,FAR*LPBITMAPINFOHEADER,*PBITMAPINFOHEADER;
3、调色板
typedefstructtagRGBQUAD{
BYTErgbBlue;
BYTErgbGreen;
BYTErgbRed;
BYTErgbReserved;
}RGBQUAD;
用于存放图像的颜色。
4、图像的实际数据。
对于2色图,用1位表示像素的值。
对于16色图,用4位表示像素的值。
对于256色图,一个字节刚好表示1个像素。
对于用到调色板的位图,图像数据就是该像素颜色在调色板中索引值,对于真彩色,不用调色板,三个字节的数据分别代表图像的B、G、R。
(二)、基本实验步骤
1、打开VC++界面,工程中选择MFCAppWizard(exe),并在projectname输入zyf125,选择存放project的位置。
2、选择ok,进入下一步。
选择singledocument,并在最后CdipView类的基类中选择CscrollView,使应用程序视图具有滚动条。
3、在生成的工程中选择CLxyView,对class视图进行操作,添加成员变量跟成员函数到相应现在的zyf125view下
intm_x;
HBITMAPm_Bmp;
LPVOIDm_ColorList;
LPBYTEm_Image;
LPBITMAPINFOHEADERm_DibHead;
enumallocate{None,crtallocate,heapallocate};
allocatem_nBmpallocate;
allocatem_nImageallocate;
DWORDm_ImageSize;
intm_nPalette;
HANDLEm_hFile;
HANDLEm_hMap;
LPVOIDm_lpvFile;
HPALETTEm_hPalette;
HGLOBALm_hGlob;
利用ClassWizard向ClxyView类中加入如下成员函数。
voidSetPaletteSize(intnBitCount);
//设置调色板大小
voidClear();
//清除
BOOLReadFile(CFile*pFile);
//读取数据到内存
BOOLSetPalette();
//当前位图颜色数大于256设置调色板
BOOLGetPalette();
//创建颜色数不大于256的调色板
BOOLDibToDC(CDC*pDC,CSizesize);
显示位图
BOOLMemToDib(LPVOIDlmem);
//得到内存中位图象素位置
CSizeGetDibSize();
//返回位图尺寸
完成以上操作后,在dipView.cpp中找到所添加函数的函数体,copy到自己建立的LxyView.cpp中对应的函数名称的下面。
4、设计一个名为IDB_BITMAP1的位图
在resourc下单机右键,选择插入,单击Bitmap,选择新建,然后自己新建一个位图,保存。
5、修改OnDraw和OnInitialUpdate()函数设置滚动条的初始化图形和现实图像,如果不写OnDraw函数体的话图像将被保存在缓冲区而不显示出来
6、在Resource下双击Toolbar,打开工具栏编辑器,先对放大缩小工具图标进行绘制,绘制完成后在上面的工具栏中找到所设计的相应的图标,双击图标对图标进行ID的设置,之后在Menu下双击IDR_MAINFRAME进行类向导设计,类向导设计跟上学期的MFC实验中的类向导设计一样,然后添加放大缩小的函数内容到对应的函数下面
7、打开Menu资源,双击主菜单,打开菜单资源编辑器喧闹中打开选项,右键单击,选择类向导Class中选择C×
×
view,单击commond选择AddFunction单击OK,单击Editcode,拷贝Onfileopen函数中代码。
这样就可以打开相应的BMP格式图片
8、实验代码:
voidCZyf125View:
:
OnDraw(CDC*pDC)
{
CZyf125Doc*pDoc=GetDocument();
ASSERT_VALID(pDoc);
//TODO:
adddrawcodefornativedatahere
BeginWaitCursor();
CSizeDibSize=GetDibSize();
DibSize.cx*=m_x;
DibSize.cy*=-m_x;
DibToDC(pDC,DibSize);
EndWaitCursor();
}
voidCZyf125View:
OnInitialUpdate()
CScrollView:
OnInitialUpdate();
m_x=25;
CSizeMaxSize(24000,32000);
CSizeMinSize(MaxSize.cx/100,MaxSize.cy/100);
SetScrollSizes(MM_HIMETRIC,MaxSize,MaxSize,MinSize);
LPVOIDlFirstBMP=(LPVOID):
LoadResource(NULL,
:
FindResource(NULL,MAKEINTRESOURCE(IDB_BITMAP1),RT_BITMAP);
MemToDib(lFirstBMP);
;
////////////////////////////////////////////////////////////////////////////
//CZyf125Viewprinting
BOOLCZyf125View:
OnPreparePrinting(CPrintInfo*pInfo)
//defaultpreparation
returnDoPreparePrinting(pInfo);
OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
addextrainitializationbeforeprinting
OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)
addcleanupafterprinting
/////////////////////////////////////////////////////////////////////////////
//CZyf125Viewdiagnostics
#ifdef_DEBUG
AssertValid()const
AssertValid();
Dump(CDumpContext&
dc)const
Dump(dc);
CZyf125Doc*CZyf125View:
GetDocument()//non-debugversionisinline
ASSERT(m_pDocument->
IsKindOf(RUNTIME_CLASS(CZyf125Doc)));
return(CZyf125Doc*)m_pDocument;
#endif//_DEBUG
//CZyf125Viewmessagehandlers
SetPaletteSize(intnBitCount)
if(m_DibHead->
biSize!
=sizeof(BITMAPINFOHEADER)){
thrownewCException;
}
m_ImageSize=m_DibHead->
biSizeImage;
if(m_ImageSize==0){
DWORDdwBytes=((DWORD)m_DibHead->
biWidth*
m_DibHead->
biBitCount)/32;
if(((DWORD)m_DibHead->
biWidth*m_DibHead->
biBitCount)%32)
{
dwBytes++;
}
dwBytes*=4;
m_ImageSize=dwBytes*m_DibHead->
biHeight;
m_ColorList=(LPBYTE)m_DibHead+sizeof(BITMAPINFOHEADER);
if((m_DibHead==NULL)||(m_DibHead->
biClrUsed==0)){
switch(nBitCount){
case1:
m_nPalette=2;
break;
case4:
m_nPalette=16;
case8:
m_nPalette=256;
case16:
case24:
case32:
m_nPalette=0;
default:
ASSERT(FALSE);
else{
m_nPalette=m_DibHead->
biClrUsed;
ASSERT((m_nPalette>
=0)&
&
(m_nPalette<
=256));
Clear()
if(m_hFile==NULL)return;
:
UnmapViewOfFile(m_lpvFile);
CloseHandle(m_hMap);
CloseHandle(m_hFile);
m_hFile=NULL;
if(m_nBmpallocate==crtallocate){
delete[]m_DibHead;
elseif(m_nBmpallocate==heapallocate){
GlobalUnlock(m_hGlob);
GlobalFree(m_hGlob);
if(m_nImageallocate==crtallocate)delete[]m_Image;
if(m_hPalette!
=NULL):
DeleteObject(m_hPalette);
if(m_Bmp!
DeleteObject(m_Bmp);
m_nBmpallocate=m_nImageallocate=None;
m_hGlob=NULL;
m_DibHead=NULL;
m_Image=NULL;
m_ColorList=NULL;
m_nPalette=0;
m_ImageSize=0;
m_lpvFile=NULL;
m_hMap=NULL;
m_Bmp=NULL;
m_hPalette=NULL;
ReadFile(CFile*pFile)
intnCount,nSize;
BITMAPFILEHEADERbmfh;
Clear();
try{
nCount=pFile->
Read((LPVOID)&
bmfh,sizeof(BITMAPFILEHEADER));
if(nCount!
=sizeof(BITMAPFILEHEADER)){
thrownewCException;
if(bmfh.bfType!
=0x4d42){
nSize=bmfh.bfOffBits-sizeof(BITMAPFILEHEADER);
m_DibHead=(LPBITMAPINFOHEADER)newchar[nSize];
m_nBmpallocate=m_nImageallocate=crtallocate;
Read(m_DibHead,nSize);
SetPaletteSize(m_DibHead->
biBitCount);
GetPalette();
m_Image=(LPBYTE)newchar[m_ImageSize];
Read(m_Image,m_ImageSize);
catch(CException*tmpc){
AfxMessageBox("
文件读取错误"
);
tmpc->
Delete();
returnFALSE;
returnTRUE;
SetPalette()
if(m_nPalette!
=0)
CClientDCdc(this);
CDC*pDC=&
dc;
m_hPalette=:
CreateHalftonePalette(pDC->
GetSafeHdc());
GetPalette()
if(m_nPalette==0)
if(m_hPalette!
=NULL)
LPLOGPALETTEpTempPalette=(LPLOGPALETTE)newchar[2*sizeof(WORD)+
m_nPalette*sizeof(PALETTEENTRY)];
pTempPalette->
palVersion=0x30;
palNumEntries=m_nPalette;
LPRGBQUADpRGBQuad=(LPRGBQUAD)m_ColorList;
for(inti=0;
i<
m_nPalette;
i++)
{
pTempPalette->
palPalEntry[i].peRed=pRGBQuad->
rgbRed;
palPalEntry[i].peGreen=pRGBQuad->
rgbGreen;
palPalEntry[i].peBlue=pRGBQuad->
rgbBlue;
palPalEntry[i].peFlags=0;
pRGBQuad++;
CreatePalette(pTempPalette);
deletepTempPalette;
DibToDC(CDC*pDC,CSizesize)
if(m_DibHead==NULL)
HDChdc=pDC->
GetSafeHdc();
SelectPalette(hdc,m_hPalette,TRUE);
pDC->
SetStretchBltMode(COLORONCOLOR);
StretchDIBits(pDC->
GetSafeHdc(),0,0,size.cx,size.cy,
0,0,m_DibHead->
biWidth,m_DibHead->
biHeight,
m_Image,(LPBITMAPINFO)m_DibHead,DIB_RGB_COLORS,
SRCCOPY);
MemToDib(LPVOIDlmem)
m_DibHead=(LPBITMAPINFOHEADER)lmem;
SetPaletteSize(m_DibHead->
m_Image=(LPBYTE)m_ColorList+sizeof(RGBQUAD)*m_nPalette;
GetPalette();
CSizeCZyf125View:
GetDibSize()
returnCSize(0,0);
returnCSize((int)m_DibHead->
biWidth,(int)m_DibHead->
biHeight);
Onmax()
Addyourcommandhandlercodehere
CSizeDibsize=GetDibSize();
if((Dibsize.cx*m_x*1.2)<
24000)
if((Dibsize.cy*m_x*1.2)<
32000)
m_x=(int)(m_x*1.2);
Invalidate();
Onmin()
if(m_x>
2)
m_x=(int)(m_x/1.2);
OnFileOpen()
CFileDialogfiledlg(TRUE,"
bmp"
"
*.bmp"
if(filedlg.DoModal()!
=IDOK)
return;
CFilemyfile;
myfile.Open(filedlg.GetPathName(),CFile:
modeRead);
if(ReadFile(&
myfile)==TRUE)
SetPalette();
9、实验截图
位图显示:
BMP文件读取