ImageVerifierCode 换一换
格式:DOCX , 页数:84 ,大小:240.40KB ,
资源ID:21960198      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/21960198.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(windows程序设计 位图和位图动画文档格式.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

windows程序设计 位图和位图动画文档格式.docx

1、Metafile需要通常比位图来得少的空间。位图的储存空间由图像的大小及其包含的颜色决定,而metafile的储存空间则由图像的复杂程度和它所包含的GDI指令数决定。然而,位图优于metafile之处在于速度。将位图复制给视频显示器通常比复制基本图形文件的速度要快。最近几年,压缩技术允许压缩位图的文件大小,以使它能有效地通过电话线传输并广泛地用于Internet的网页上。位图的来源位图可以手工建立,例如,使用Windows 附带的“画图”程序。一些人宁愿使用位映像绘图软件也不使用向量绘图软件。他们假定:图形最后一定会复杂到不能用线条跟填充区域来表达。位图图像也能由计算机程序计算生成。尽管大多数

2、计算生成的图像能按向量图形metafile储存,但是高清晰度的画面或碎形图样通常还是需要位图。现在,位图通常用于描述真实世界的图像,并且有许多硬设备能让您把现实世界的图像输入到计算机。这类硬件通常使用 电荷耦合设备 (CCD:charge-coupled device),这种设备接触到光就释放电荷。有时这些CCD单元能排列成一组,一个像素对应一个CCD;为节约开支,只用一行CCD扫描图像。在这些计算机CCD设备中, 扫描仪 是最古老的。它用一行CCD沿着纸上图像(例如照片)的表面扫描。CCD根据光的强度产生电荷。模拟数字转换器(ADC:Analog-to-digital converters)

3、把电荷转换为数字讯号,然后排列成位图。携带型摄像机也利用CCD单元组来捕捉影像。通常,这些影像是记录到录像带上。不过,这些视频输出也能直接进入 影像捕捉器 (frame grabber),该设备能把模拟视频信号转换为一组像素值。这些影像捕捉器与任何兼容的视频信号来源都能同时使用,例如VCR、光盘、DVD播放机或有线电视译码器。最近,数字照相机的价位对于家庭使用者来说开始变得负担得起了。它看起来很像普通照相机。但是数字照相机不使用底片,而用一组CCD来拦截图像,并且在ADC内部把数字图像直接储存在照相机内的内存中。通常,数字照相机与计算机的接口要通过串行端口。位图尺寸位图呈矩形,并有空间尺寸,图

4、像的高度和宽度都以像素为单位。例如,此网格可描述一个很小的位图:宽度为9像素,高度为6像素,或者更简单地计为96:习惯上,位图的速记尺寸是先给出宽度。位图总数为96或者54像素。我将经常使用符号cx和cy来表示位图的宽度和高度。c表示计数,因此cx和cy是沿着x轴(水平)和y轴(垂直)的像素数。我们能根据x和y坐标来描述位图上具体的像素。一般(并不都是这样),在网格内计算像素时,位图开始于图像的左上角。这样,在此位图右下角的像素坐标就是(8, 5)。因为从0开始计数,所以此值比图像的宽度和高度小1。位图的空间尺寸通常也指定了分辨率,但这是一个有争议的词。我们说我们的视频显示有640480的分辨

5、率,但是激光打印机的分辨率只有每英寸300点。我喜欢用后一种情况中分辨率的意思作为每单位像素的数量。位图在这种意义上的分辨率指的是位图在特定测量单位中的像素数。不管怎样,当我使用分辨率这个词语时,其定义的内容应该是明确的。位图是矩形的,但是计算机内存空间是线性的。通常(但并不都是这样)位图按列储存在内存中,且从顶列像素开始到底列结束。(DIB是此规则的一个主要例外)。每一列,像素都从最左边的像素开始依次向右储存。这就好像储存几列文字中的各个字符。颜色和位图除空间尺寸以外,位图还有颜色尺寸。这里指的是每个像素所需要的位数,有时也称为位图的 颜色深度 (color depth)、 位数 (bit-

6、count)或 位/像素 (bpp:bits per pixel)数。位图中的每个像素都有相同数量的颜色位。每像素1位的位图称为 二阶 (bilevel)、 二色 (bicolor)或者 单色 (monochrome)位图。每像素可以是0或1,0表示黑色,1可以表示白色,但并不总是这样。对于其它颜色,一个像素就需要有多个位。可能的颜色值等于2位数值。用2位可以得到4种颜色,用4位可以得16种颜色,8位可得到256种颜色,16位可得到65,536种颜色,而24位可得到16,777,216种颜色。如何将颜色位的组合与人们所熟悉的颜色相对应是目前处理位图时经常碰到(而且常常是灾难)的问题。实际的设备

7、位图可按其颜色位数来分类;在Windows的发展过程中,不同的位图颜色格式取决于常用视频显示卡的功能。实际上,我们可把视频显示内存看作是一幅巨大的位图我们从显示器上就可以看见。Windows 1.0多数采用的显示卡是IBM的彩色图像适配器(CGA:Color Graphics Adapter)和单色图形卡(HGC:Hercules Graphics Card)。HGC是单色设备,而CGA也只能在Windows以单色图形模式使用。单色位图现在还很常用(例如,鼠标的光标一般为单色),而且单色位图除显示图像以外还有其它用途。随着增强型图形显示卡(EGA:Enhanced Graphics Adapt

8、er)的出现,Windows使用者开始接触16色的图形。每个像素需要4个颜色位。(实际上,EGA比这里所讲的更复杂,它还包括一个64种颜色的调色盘,应用程序可以从中选择任意的16种颜色,但Windows只按较简单的方法使用EGA)。在EGA中使用的16种颜色是黑、白、两种灰色、高低亮度的红色、绿和蓝(三原色)、青色(蓝和绿组合的颜色)。现在认为这16种颜色是Windows的最低颜色标准。同样,其它16色位图也可以在Windows中显示。大多数的图示都是16色的位图。通常,简单的卡通图像也可以用这16种颜色制作。在16色位图中的颜色编码有时称为IRGB(高亮红绿蓝:Intensity-Red-G

9、reen-Blue),并且实际上是源自IBM CGA文字模式下最初使用的十六种颜色。每个像素所用的4个IRGB颜色位都映像为表14-1所示的Windows十六进制RGB颜色。表14-1IRGBRGB颜色颜色名称000000-00-00黑000100-00-80暗蓝001000-80-00暗绿001100-80-80暗青010080-00-00暗红010180-00-80暗洋红011080-80-00暗黄0111C0-C0-C0亮灰100080-80-80暗灰100100-00-FF蓝101000-FF-00绿101100-FF-FF青1100FF-00-00红1101FF-00-FF洋红111

10、0FF-FF-00黄1111FF-FF-FF白EGA的内存组成了四个“颜色面”,也就是说,定义每个像素颜色的四位在内存中是不连续的。然而,这样组织显示内存便于使所有的亮度位都排列在一起、所有的红色位都排在一起,等等。这样听起来就好像一种设备依赖特性,即Windows程序编写者不需要了解所有细节,但这时应或多或少地知道一些。不过,这些颜色面会出现在一些API调用中,例如GetDeviceCaps和CreateBitmap。Windows 98和Microsoft Windows NT需要VGA或分辨率更高的图形卡。这是目前公认的显示卡的最低标准。1987年,IBM最早发表视频图像数组(Video

11、 Graphics Array:VGA)以及PS/2系列的个人计算机。它提供了许多不同的显示模式,但最好的图像模式(Windows也使用其中之一)是水平显示640个像素,垂直显示480个像素,带有16种颜色。要显示256种颜色,最初的VGA必须切换到320240的图形模式,这种像素数不适合Windows的正常工作。一般人们已经忘记了最初VGA卡的颜色限制,因为其它硬件制造商很快就开发了“Super-VGA”(SVGA)显示卡,它包括更多的视频内存,可显示256种颜色并有多于640480的模式。这是现在的标准,而且也是一件好事,因为对于现实世界中的图像来说,16种颜色过于简单,有些不适合。显示2

12、56种颜色的显示卡模式采用每像素8位。不过,这些8位值都不必与实际的颜色相符。事实上,显示卡提供了“调色盘对照表(palette lookup table)”,该表允许软件指定这8位的颜色值,以便与实际颜色相符合。在Windows中,应用程序不能直接存取调色盘对照表。实际上,Windows储存了256种颜色中的20种,而应用程序可以通过“Windows调色盘管理器”来自订其余的236种颜色。关于这些内容,我将在 第十六章 详细介绍。调色盘管理器允许应用程序在256色显示器上显示实际位图。Windows所储存的20种颜色如表14-2所示。表14-2000000000000000100000010

13、000000110000010000000101000001100000011100001000C0-DC-C0美元绿00001001A6-CA-F0天蓝11110110FF-FB-F0乳白11110111A0-A0-A4中性灰1111100011111001111110101111101111111100111111011111111011111111最近几年,True-Color显示卡很普遍,它们在每像素使用16位或24位。有时每像素虽然用了16位,其中有1位不用,而其它15位主要近似于红、绿和蓝。这样红、绿和蓝每种都有32色阶,组合起来就可以达到32,768种颜色。更普遍的是,6位用于绿

14、色(人类对此颜色最敏感),这样就可得到65,536种颜色。对于非技术性的PC使用者来说,他们并不喜欢看到诸如32,768或65,536之类的数字,因此通常将这种视频显示卡称为Hi-Color显示卡,它能提供数以千计的颜色。到了每个像素24位时,我们总共有了16,777,216种颜色(或者True Color、数百万的颜色),每个像素使用3字节。这与今后的标准很相似,因为它大致代表了人类感官的极限而且也很方便。在调用GetDeviceCaps时(参见 第五章的DEVCAPS程序 ),您能利用BITSPIXEL和PLANES常数来获得显示卡的颜色单位,这些值显示如表14-3所示 表14-3BITS

15、PIXELPLANES颜色数12416825615或1632,768或65 53624或3216 777 216最近,您应该不会再碰到单色显示器了,但即便碰到了,您的应用程序也应该不会发生问题。GDI支持的位图Windows图形设备接口(GDI:Graphics Device Interface)从1.0版开始支持位图。不过,一直到Windows 3.0以前,Windows下唯一支持GDI对象的只有位图,以位图代号来使用。这些GDI位图对象是单色的,或者与实际的图像输出设备(例如视频显示器)有相同的颜色单位。例如,与16色VGA兼容的位图有四个颜色面。问题是这些颜色位图不能储存,也不能用于颜色

16、单位不同的图像输出设备(如每像素占8位就可以产生256种颜色的设备)上。从Windows 3.0开始,定义了一种新的位图格式,我们称之为设备无关位图(device-independent bitmap),或者DIB。DIB包括了自己的调色盘,其中显示了与RGB颜色相对应的像素位。DIB能显示在任何位映像输出设备上。这里唯一的问题是DIB的颜色通常一定会转换成设备实际表现出来的颜色。与DIB同时,Windows 3.0还介绍了“Windows调色盘管理器”,它让程序能够从显示的256种颜色中自订颜色。就像我们在 第十六章 所看到的那样,应用程序通常在显示DIB时使用“调色盘管理器”。Micros

17、oft在Windows 95(和Windows NT 4.0)中扩展了DIB的定义,并且在Windows 98(和Windows NT 5.0)中再次扩展。这些扩展增加了所谓的“图像颜色管理器(ICM:Image Color Management),并允许DIB更精确地指定图像所需要的颜色。我将在 第十五章 简要讨论ICM。不论DIB多么重要,在处理位图时,早期的GDI位图对象依然扮演了重要的角色。掌握位图使用方式的最好方法是按各种用法在演进发展的时间顺序来学习,先从GDI位图对象和位块传输的概念开始。位块传输我前面提到过,您可以把整个视频显示器看作是一幅大位图。您在屏幕上见到的像素由储存在视

18、频显示卡上内存中的位来描述。任何视频显示的矩形区域也都是一个位图,其大小是它所包含的行列数。让我们从将图像从视频显示的一个区域复制到另一个区域,开始我们在位图世界的旅行吧!这个是强大的BitBlt函数的工作。Bitblt(读作“bit blit”)代表“位块传输(bit-block transfer)”。BLT起源于一条汇编语言指令,该指令在DEC PDP-10上用来传输内存块。术语“bitblt”第一次用在图像上与Xerox Palo Alto Research Center(PARC)设计的SmallTalk系统有关。在SmallTalk中,所有的图形输出操作都使用bitblt。程序编写者

19、有时将blt用作动词,例如:“Then I wrote some code to blt the happy face to the screen and play a wave file.” BitBlt函数移动的是像素,或者(更明确地)是一个位映像图块。您将看到,术语“传输(transfer)”与BitBlt函数不尽相同。此函数实际上对像素运行了一次位操作,而且可以产生一些有趣的结果。简单的BitBlt程序14-1所示的BITBLT程序用BitBlt函数将程序系统的菜单图标(位于程序Windows的左上角)复制到它的显示区域。 程序14-1 BITBLTBITBLT.C#include L

20、RESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow) static TCHAR szAppName = TEXT (BitBlt) ; HWND hwnd ; MSG msg ; WNDCLASS wndclass ; wndclass.style = CS_HREDRAW | CS_VREDRAW ; wndclass.lpfnWndProc = W

21、ndProc ; wndclass.cbClsExtra = 0 ; wndclass.cbWndExtra = 0 ; wndclass.hInstance = hInstance ; wndclass.hIcon = LoadIcon (NULL, IDI_INFORMATION) ; wndclass.hCursor = LoadCursor (NULL, IDC_ARROW) ; wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ; wndclass.lpszMenuName = NULL ; wndclass

22、.lpszClassName = szAppName ; if (!RegisterClass (&wndclass) MessageBox (NULL, TEXT (This program requires Windows NT!), szAppName, MB_ICONERROR) ; return 0 ; hwnd = CreateWindow ( szAppName, TEXT (BitBlt Demo WS_OVERLAPPEDWINDOW, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL) ; ShowWindo

23、w (hwnd, iCmdShow) ; UpdateWindow (hwnd) ; while (GetMessage (&msg, NULL, 0, 0) TranslateMessage (&msg) ; DispatchMessage (& return msg.wParam ;LRESULT CALLBACK WndProc ( HWND hwnd, UINT message, WPARAM wParam,LPARAM lParam) static int cxClient, cyClient, cxSource, cySource ; HDC hdcClient, hdcWindo

24、w ; int x, y ; PAINTSTRUCT ps ; switch (message) case WM_CREATE: cxSource = GetSystemMetrics (SM_CXSIZEFRAME) + GetSystemMetrics (SM_CXSIZE) ; cySource = GetSystemMetrics (SM_CYSIZEFRAME) + GetSystemMetrics (SM_CYCAPTION) ; return 0 ; case WM_SIZE: cxClient = LOWORD (lParam) ; cyClient = HIWORD (lPa

25、ram) ; case WM_PAINT: hdcClient = BeginPaint (hwnd, &ps) ; hdcWindow = GetWindowDC (hwnd) ; for (y = 0 ; y cyClient ; y += cySource) for (x = 0 ; x cxClient ; x += cxSource) BitBlt (hdcClient, x, y, cxSource, cySource, hdcWindow, 0, 0, SRCCOPY) ; ReleaseDC (hwnd, hdcWindow) ; EndPaint (hwnd, & case

26、WM_DESTROY: PostQuitMessage (0) ; return DefWindowProc (hwnd, message, wParam, lParam) ;但为什么只用了一个BitBlt呢?实际上,那个BITBLT用系统菜单图标的多个副本来填满显示区域(在此情况下是信息方块中普遍使用的IDI_INFORMATION图示),如图14-1所示。图14-1 BITBLT的屏幕显示BitBlt函数从称为“来源”的设备内容中将一个矩形区的像素传输到称为“目的(destination)”的另一个设备内容中相同大小的矩形区。此函数的语法如下:BitBlt (hdcDst, xDst, yDst, cx, cy, hdcSrc, xSrc, ySrc, dwROP) ;来源和目的设备内容可以相同。在BITBLT程序

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

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