VC60下bmp位图的读取与显示.docx

上传人:b****6 文档编号:8193125 上传时间:2023-01-29 格式:DOCX 页数:13 大小:210.03KB
下载 相关 举报
VC60下bmp位图的读取与显示.docx_第1页
第1页 / 共13页
VC60下bmp位图的读取与显示.docx_第2页
第2页 / 共13页
VC60下bmp位图的读取与显示.docx_第3页
第3页 / 共13页
VC60下bmp位图的读取与显示.docx_第4页
第4页 / 共13页
VC60下bmp位图的读取与显示.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

VC60下bmp位图的读取与显示.docx

《VC60下bmp位图的读取与显示.docx》由会员分享,可在线阅读,更多相关《VC60下bmp位图的读取与显示.docx(13页珍藏版)》请在冰豆网上搜索。

VC60下bmp位图的读取与显示.docx

VC60下bmp位图的读取与显示

实验名称实验一、VC6.0下bmp位图的读取与显示

1、实验目的

掌握windowsBMP格式位图文件的基本格式。

会使用VC++读取图像数据并显示。

2、实验原理及内容

在VC6.0环境下,生成MFC应用程序框架。

在已生成的应用程序中,加BMP位图读取与显示的代码,从已有文件中读取bmp格式文件并在视图中显示。

(一)基本知识:

BMP位图文件格式

BMP位图文件中主要由4部分内容组成:

1、文件头BITMAPFILEHEADER为一STRUCTURE:

typedefstructtagBITMAPFILEHEADER{

WORDbfType;//文件类型,必须为“BM”或0x424d

DWORDbfSize;//文件大小

WORDbfReserved1;//保留

WORDbfReserved2;//保留

DWORDbfOffBits;//从文件头到实际位图数据的偏移字节数

}BITMAPFILEHEADER,FAR*LPBITMAPFILEHEADER,*PBITMAPFILEHEADER;

2、位图信息头BITMAPINFOHEADER,定义如下:

typedefstructtagBITMAPINFOHEADER{

DWORDbiSize;//structuresize

LONGbiWidth;//imagewidth

LONGbiHeight;//imageheight

WORDbiPlanes;//valueis1

WORDbiBitCount;//colorbits

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);

}

voidCZyf125View:

:

OnBeginPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)

{

//TODO:

addextrainitializationbeforeprinting

}

voidCZyf125View:

:

OnEndPrinting(CDC*/*pDC*/,CPrintInfo*/*pInfo*/)

{

//TODO:

addcleanupafterprinting

}

/////////////////////////////////////////////////////////////////////////////

//CZyf125Viewdiagnostics

#ifdef_DEBUG

voidCZyf125View:

:

AssertValid()const

{

CScrollView:

:

AssertValid();

}

voidCZyf125View:

:

Dump(CDumpContext&dc)const

{

CScrollView:

:

Dump(dc);

}

CZyf125Doc*CZyf125View:

:

GetDocument()//non-debugversionisinline

{

ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CZyf125Doc)));

return(CZyf125Doc*)m_pDocument;

}

#endif//_DEBUG

/////////////////////////////////////////////////////////////////////////////

//CZyf125Viewmessagehandlers

voidCZyf125View:

:

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;

break;

case8:

m_nPalette=256;

break;

case16:

case24:

case32:

m_nPalette=0;

break;

default:

ASSERT(FALSE);

}

}

else{

m_nPalette=m_DibHead->biClrUsed;

}

ASSERT((m_nPalette>=0)&&(m_nPalette<=256));

}

voidCZyf125View:

:

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!

=NULL):

:

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_hFile=NULL;

m_Bmp=NULL;

m_hPalette=NULL;

}

BOOLCZyf125View:

:

ReadFile(CFile*pFile)

{

intnCount,nSize;

BITMAPFILEHEADERbmfh;

Clear();

try{

nCount=pFile->Read((LPVOID)&bmfh,sizeof(BITMAPFILEHEADER));

if(nCount!

=sizeof(BITMAPFILEHEADER)){

thrownewCException;

}

if(bmfh.bfType!

=0x4d42){

thrownewCException;

}

nSize=bmfh.bfOffBits-sizeof(BITMAPFILEHEADER);

m_DibHead=(LPBITMAPINFOHEADER)newchar[nSize];

m_nBmpallocate=m_nImageallocate=crtallocate;

nCount=pFile->Read(m_DibHead,nSize);

SetPaletteSize(m_DibHead->biBitCount);

GetPalette();

m_Image=(LPBYTE)newchar[m_ImageSize];

nCount=pFile->Read(m_Image,m_ImageSize);

}

catch(CException*tmpc){

AfxMessageBox("文件读取错误");

tmpc->Delete();

returnFALSE;

}

returnTRUE;

}

BOOLCZyf125View:

:

SetPalette()

{

if(m_nPalette!

=0)

returnFALSE;

CClientDCdc(this);

CDC*pDC=&dc;

m_hPalette=:

:

CreateHalftonePalette(pDC->GetSafeHdc());

returnTRUE;

}

BOOLCZyf125View:

:

GetPalette()

{

if(m_nPalette==0)

returnFALSE;

if(m_hPalette!

=NULL)

:

:

DeleteObject(m_hPalette);

LPLOGPALETTEpTempPalette=(LPLOGPALETTE)newchar[2*sizeof(WORD)+

m_nPalette*sizeof(PALETTEENTRY)];

pTempPalette->palVersion=0x30;

pTempPalette->palNumEntries=m_nPalette;

LPRGBQUADpRGBQuad=(LPRGBQUAD)m_ColorList;

for(inti=0;i

{

pTempPalette->palPalEntry[i].peRed=pRGBQuad->rgbRed;

pTempPalette->palPalEntry[i].peGreen=pRGBQuad->rgbGreen;

pTempPalette->palPalEntry[i].peBlue=pRGBQuad->rgbBlue;

pTempPalette->palPalEntry[i].peFlags=0;

pRGBQuad++;

}

m_hPalette=:

:

CreatePalette(pTempPalette);

deletepTempPalette;

returnTRUE;

}

BOOLCZyf125View:

:

DibToDC(CDC*pDC,CSizesize)

{

if(m_DibHead==NULL)

returnFALSE;

if(m_hPalette!

=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);

returnTRUE;

}

BOOLCZyf125View:

:

MemToDib(LPVOIDlmem)

{

Clear();

m_DibHead=(LPBITMAPINFOHEADER)lmem;

SetPaletteSize(m_DibHead->biBitCount);

m_Image=(LPBYTE)m_ColorList+sizeof(RGBQUAD)*m_nPalette;

GetPalette();

returnTRUE;

}

CSizeCZyf125View:

:

GetDibSize()

{

if(m_DibHead==NULL)

returnCSize(0,0);

returnCSize((int)m_DibHead->biWidth,(int)m_DibHead->biHeight);

}

voidCZyf125View:

:

Onmax()

{

//TODO:

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();

}

}

}

voidCZyf125View:

:

Onmin()

{

//TODO:

Addyourcommandhandlercodehere

if(m_x>2)

{

m_x=(int)(m_x/1.2);

Invalidate();

}

}

voidCZyf125View:

:

OnFileOpen()

{

//TODO:

Addyourcommandhandlercodehere

CFileDialogfiledlg(TRUE,"bmp","*.bmp");

if(filedlg.DoModal()!

=IDOK)

return;

CFilemyfile;

myfile.Open(filedlg.GetPathName(),CFile:

:

modeRead);

if(ReadFile(&myfile)==TRUE)

Invalidate();

SetPalette();

}

9、实验截图

位图显示:

BMP文件读取

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 唐诗宋词

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1