欢迎来到天天文库
浏览记录
ID:17881763
大小:21.29 KB
页数:5页
时间:2018-09-08
《在vc5中显示256色位图》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、在VC5中显示256色位图在Windows的编程中,彩色图像的显示和处理一直是一个重要的课题,即使是在显卡普遍支持真彩的今天,讨论256色位图的显示也是有意义的。通过对这一课题的讨论,可以了解如何在VC5中实现装入图像,创建和使用调色板,以及最后将图像画出来。总的来说,要显示一幅256色的位图,首先应得到该图的有关信息,通过位图的颜色表创建一个逻辑调色板,然后将这个调色板选入设备环境,实现这个调色板,最后将位图用BitBlt函数拷贝到设备环境就可以了。具体实现步骤如下:1、装载位图并创建调色板。首先装入一幅位图,该位图
2、既可以以资源的形式与程序绑在一起,也可以以文件的形式从外部装入。然后将该位图与一个Cbitmap对象联系(Attach)起来。在这儿我们应使用API函数LoadImage(),而不是CBitmap类的成员函数CBitmap::LoadBitmap(),因为我们需要得到该位图的DIBSECTION结构,从这个结构中我们可以得到该位图的色彩信息,从而建立一个与这些色彩相匹配的逻辑调色板。使用CBitmap::LoadBitmap()将会失去我们所需的位图的色彩信息。得到位图后,下一步工作就是取得该位图的色彩信息。通过CBi
3、tmap:GetObject()函数,我们可以访问DIBSECTION结构,从中得到位图的色彩数。一般来说,这些信息存在于BITMAPINFOHEAD结构中,不过,作为DIBSECTION结构的一部分,BITMAPINFOHEAD有时并未说明图像用了多少种颜色;碰到这种情况,我们可以看看图像的每一象素用了几位(Bit)来描述颜色,如果是8位的话,因为8位二进制数可以表示256种不同的值,所以该图像是256色的;同理,16Bit表明是64K色。得到了位图所用的颜色数,就可以创建逻辑调色板了。色彩超过256色的位图是没有颜
4、色表(ColorTable)的,这时我们只用简单地创建一个和设备环境兼容的半色调调色板(HalftonePalette)就行了,在半色调调色板中包含着所有不同颜色的样本。这显然不是最佳解决方案,但却是最简单的。而对于颜色数小于或等于256的位图,我们就要从头建立一个新的调色板。先分配足够的内存空间来装入图像的颜色表,颜色表可以利用API函数GetDIBColorTable获得;然后再分配足够的内存给新建的逻辑调色板,将刚才得到的颜色表信息相应拷入新建调色板中的palPalEntry域,并将PalVersion域设为0X
5、300。创建了调色板后,应将窗口刷新重画。在具体的实现上,我们定义了一个函数GetBitmapandPalette()来实现位图资源的装入和逻辑调色板的创建,其功能实现框图如下(略)函数具体实现如下:BOOLGetBitmapandPalette(LPCTSTRlpszresource,CBitmap&bitmap,CPalette&pal,long*w,long*h){LPCTSTRlpszresourcename=(LPCTSTR)lpszresource;HBITMAPhbmp=(HBITMAP)::LoadIm
6、age(AfxGetInstanceHandle(),lpszresourcename,IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//装入位图if(hbmp==NULL)returnFALSE;bitmap.Attach(hbmp);//将该位图与一个CBitmap对象联系起来DIBSECTIONds;BITMAPINFOHEADER&bminfo=ds.dsBmih;bitmap.GetObject(sizeof(ds),&ds);//得到位图颜色数intncolors=bminfo.biC
7、lrUsed?bminfo.biClrUsed:1<256)pal.CreateHalftonePalette(&dc);else{//颜色数<=256RGBQUAD*prgb="new"RGBQUAD[ncolors];CDCmemdc;memdc.CreateCompatibleDC(&
8、dc);memdc.SelectObject(&bitmap);::GetDIBColorTable(memdc,0,ncolors,prgb);UINTnsize="sizeof(LOGPALETTE)"+(sizeof(PALETTEENTRY)*ncolors);LOGPALETTE*plp="(LOGPALETTE"*)n
此文档下载收益归作者所有