luqingfei@C++

为中华之崛起而崛起!
兼听则明,偏听则暗。

Win32汇编--使用资源--位图

 

使用资源位图

 

位图(Bitmap)是Windows操作系统存储图像的方式,图像中的每个像素对应存储器中的一个或多个数据位,如单色位图每个像素对应1位,16色位图每个像素对应4位,256色为8位,全彩色为24位等,所有的像素数据按照一行行的顺序排列在存储器中,每个像素对应的位数称为颜色深度

 

位图的优越之处是操作的速度很快,计算机的屏幕显示是由硬件从视频缓冲区中的数据映射的,向视频缓冲区中拷贝数据就可以直接将图像显示在屏幕上,所以以位图的方式存储像素,显示图形的时间几乎就是向视频缓冲区拷贝数据的时间。

 

位图的不便之处一是尺寸问题:由于位图是不压缩的,它占用的空间很大,一个1024x768像素24位色的图像的大小为1024x768x3字节,达2.3MB;二是位图的缩放问题,读者都知道矢量和位图之间的关系,矢量图形(现在网上最流行的Flash就是矢量格式的)可以无限制缩放而不变形,因为它是根据矢量实时计算出像素数据的,而位图缩放后要对原来的像素数据进行插值计算,不可避免地会有失真。

 

在使用Windows的位图之前,必须搞清楚几个概念:位图、设备无关位图和位图文件

 

单纯意义上的“位图”指的就是存放在内存中、可以马上使用的位图,它的颜色深度总是对应当前设备(如屏幕或打印机等)的颜色深度,不和具体的设备对应,位图数据是没有意义的,因为无法知道要把数据中的多少位解释成一个像素

 

对于存放在磁盘上或别的地方的位图数据来说,它的颜色深度有可能和屏幕颜色深度不同,为了准确描述它的颜色信息,必须有像素数据的属性说明以及色彩表,在使用这个位图的时候,可以根据这些信息将像素数据转换到需要的颜色深度。色彩表和位图数据合在一起就叫做设备无关位图(DIB),因为它转换后可以用在不同颜色深度的设备上。Windows有函数专门用来处理DIB。使用DIB唯一的问题是当将高颜色数的DIB转换到低颜色数的设备上时,由于色彩只能被转换成设备所能表示的最相近的颜色,所以可能会有很大的颜色失真。

 

DIB可以存放在磁盘上的位图文件中,位图文件一般以bmp为扩展名,它的内容包括一个bitmap文件头和DIB数据,bitmap文件头可以用来验证整个文件的有效性。所以简单地讲,DIB是位图数据的超集,位图文件又是DIB的超集。

 

Windows支持的图形文件格式只有bmpicocur等几种,可以广泛用在GDI操作中的只有bmp文件,其他格式文件如jpgtif等都是不能直接应用的,要使用这些文件,必须在代码中将它们转换到位图格式以后才行,所以要编写一个仅支持bmp的图片浏览器是很简单的,而要支持其他格式麻烦就大了,仅jpg格式的解码就是个很复杂的问题!

 

 

在资源中定义位图

Windowsbmp文件的支持有两种方法,一种是打开bmp文件读入DIB部分的数据,然后用函数将DIB数据转换到位图数据;另一种方法就是在资源文件中用和icocur文件类似的方法定义位图资源,然后在程序中装入后使用。

 

在资源脚本文件中定义位图资源的语法是:

       位图ID          BITMAP        [DISCARDABLE]         位图文件名

 

在程序中可以用LoadBitmap函数装入位图资源:

       invoke     LoadBitmap, hInstance, lpBitmapName

       .if           eax

                     mov        hBitmap, eax

       .endif

LoadBitmap函数返回一个位图句柄,在程序退出的时候,位图句柄必须用DeleteObject函数释放。对位图资源的大部分操作涉及GDI的内容,以后再详细学习。

 

posted on 2010-08-31 15:19 luqingfei 阅读(1388) 评论(0)  编辑 收藏 引用 所属分类: Win32汇编程语言序设计


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理


导航

<2011年1月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

统计

留言簿(6)

随笔分类(109)

随笔档案(105)

Blogers

Game

Life

NodeJs

Python

Useful Webs

大牛

搜索

积分与排名

最新评论

阅读排行榜

评论排行榜