当前位置:首页 >> >>

非Windows环境BMP图像显示的C语言实现_图文

维普资讯 http://www.cqvip.com

第 1 卷 第 3期  8
2O 0 2年 6月 

哈 尔 滨 商 业 大 学 学 报( 自然科 学版 )  
J u n lo   r i   iest  fCo l r eNau a  ce c sEdt n o r a  fHa b n Un v ri o   ml cc   t r lS in e   i o   y l i

V 1 1  o 3 o .8 N . 

Jn2 0  u .02

非 Widw 环 境 下 B no s MP图像 显 示 的 C语 言 实现 
蒋  明 ,   李葆 华2  
( . 尔滨工业大 学 电子与通信 工程 系 , 1哈 黑龙 江 哈尔滨 10 0 ;. 50 12 哈尔滨工 业大学 控 制工程 系 , 黑龙 江 哈尔滨 10 0 ) 50 1 



要: 目前很 多非 Wi o s n w 操作 系统 中, d 没有现 成的软件 来进行 图像 显示 。因此给 图像 处理者 带 来 

了很 多不便 。以 26色 B 5 MP图像显 示的 C语 言实现为例 , 绍 了非 Wi o s 作 系统环 境 下 图像 显  介 n w操 d 示的方法 , 同时 , 出了相应 的程序 。 给   关 键词 : M B P图像 ; 图像 显示 ; 色板  调 中图分类号 :P 1 .  T 374 文献标 识码 :   B 文章 编号 :0 4 8 220 )2 3 5 4 10 —14 (0 2O —0 1 —0 

Dip   sl

BM P 瑚   wi C  o r m  a g a e u de  l n —W i do   y t m  i t h  pr g a ln u g   n r I i O n ws s se
JA I NG  n   L  a -u 2 Mig , IB o h a 

( .eto l t n s& Cm u i t nEc, isH ri I tu  f eh o g , a i 100 , 1; 1D p.f e r i E co c o m nci   ,i n , ab   stt o Tc nl y H r n 50 1 a血 a ao  ̄r n ni e o b   
2 D p . f o t l h o y& E gn e ig Hab  n t ue o T c n lg , r i   5 0 1 c i a   . e t o   nr   e r C oT n ie r , r i Is tt  f e h o o y Hab 1 0 0 , h n ; n n i n

Ab t a t h r sn t e d s r c :T ee i o  a y—ma es f ae t  i ly i g , h c   k sa ds d a tg     r —   r d  ot r   ds a   w o p ma e w i t e    ia v na et p o   h a o c 8   g   n e   o - id wst e me o   fd s lyn  ma e s c   s te B  ma e o   5   e 8 i e u d rn n— W n o  h   t d o   ipa i g i g   u h a     MP i g   f 6 ma h h 2 C II  i     rg a ln u g   d r o - id w  y tm   nr d c d a d c re p n i   r ? Oo 8w t C po rm  g a e u e   n— W n o s s " h a n n s e i i t u e     or s o d n p o   s o n g -
ga   r  r s n e   rmsa e p e e td.

Ke  od :B P i g ; ae- i l ig clr e e yw r s M   e i g —ds a n ;o  ̄ t   ma m py o t

0 引言   
般在非 Wi o 环境 下进行 26色图形编  nw ds 5 程时 , 要直接与显卡硬件打交道。随着 P C机 的发 


色, 而发展到 V A时可 以使 用 26种颜色 中的 l  G 5 6 种颜色 , 现在 的显示卡甚 至可以支持到 3 位真 彩  2

色并使用所有颜色。颜色与灰度的发展受显示 内  存的限制。在 l 6色模式 中 , 一个 像素点 只需要 半  个字节 ; 而在 26 5 色模式 中 , 一个 像素点则要 占一  个字节 ; 1 位真彩色模式下 , 在 6 一个像素要 占用整  整两个字节 。所以 , C A高分辨率方式下 , 在 G 只能  同时使用 两种颜 色。而 到了 V A 实现 60× 8  G, 4 40 分辨率 l 种颜色时 , 6 需要内存 10 。 5 K 
此外 ,A R M的扩大还受到 P 机 中留作显示用  C 的地 址 空 间 的 限 制 , 般 不 超 过 6K 因 为 , 一 4。 当使  用大于 6K的地址空间时 , 4 通过 P C机访问显示缓  冲区的控制就得用使 用换页机制 。  

展, 显示 系统经 历 了 由 C A、G V A、V A到 现  G E A、 G S G 在的 V S E A系 列的 发展 过程 。  

在早期的显示系统中 , 一种显卡 只与一种显示  器匹配使用 , 随着技术 的发展 , 出现了 可变频的显  示器 , 它使用自动跟踪技术 , 同一种显示 器可以适  应各种不同的显示卡。这使得 用 c语言 来控制显 
示卡模拟 V S E A工作模式成为可能。   颜色和灰度是衡量显示 系统的又一重要参数 。   最初的彩色显示 系统 C A只能 显示固一 的 1 G 6种  颜色 , E A时 可以使用 6 种颜 色中 的 l 到 G 4 6种颜 
收稿 日期 :02一o —2 . 20 3 8 

现在的显卡可 以兼容 多种显示模式 , 因此 , 显 

作者 简介 : 蒋明(94一)男 , 17 , 哈尔滨工业 大学 电子与通信工程 系硕士 , 研究方 向 : 图像 处理 , 信号处理 

维普资讯 http://www.cqvip.com

哈 尔 滨 商 业 大 学 学 报 (自 然 科 学 版 )  

第l 8卷 

卡在固化的 R M IS O BO 中为每一种模式分配了一个 
号, 再通 过 显 示 卡的 BO IS调 用即 可 使用 此 种模 式 。  

得没有意义。因此 , 在真 彩色模式 中 , 不再需要调  显示卡都 有 自己的专 用 视频 BO IS支持。此  BO IS是视 频 控 制 程 序 , 化 在 R M 中 , 为 显 卡  固 O 成
的 一 部分 , 示 卡上 的 视频 BO 显 IS功能 要比 P C的 视 

代号 。用户 在使 用 P C机 编 程时 , 接输 入该 代, 色 板 。 直     通常 , 显示模式号 0 1 X 4的是标准模式 , 其他的 
为非标 准 模 式 , 标 准 模 式 因 显 示 卡 的 不 同 而 不  非

同。非标准模 式又 有两种 : 一种 是非标 准字 符模  式, 这类字符模式 一般与某种显卡有关 , 其模式号  由某类生产厂家 自行确定 。这 类显示模式的行列  变化范 围都 比较 大, 但均超 出 2 5行 X8 的 范   0列 围 。另 外一 种 是非 标准 图 形模 式 , 标准 的图 形模  非 式也是变化 多样的 , 但每个卡的特点主要体现在这 
些 图形 模式 中 。  

频 BO IS强大得多 , 它除 了支持 C A E A V A等  G 、G 、 G 各标准示模式外 , 还支持各种专 用模式和针对显存  的专用操作 , 可以独立于 C U单独处理显存图像 , P   比如 2 D变换 、D环境 计算等等非常复 杂的运算。 3  


般 V A 视 频 BO G IS的 人 口地 址 在 c 0}   00卜
CFF F F H之 间 。  

2 B P图像 文件格 式    M
B P bm p的缩 写形式 ,i a 顾 名思义 , M 是 ia t bm p t   就是 位 图 , 即 Widw 位 图 。它 一 般 由 四部 分组  也 nos 成: 文件头信息块 、 图像 描述信息块 、 颜色表 ( 在真  彩色模式无颜色表) 和图像数据 区组成 。在系统中  以 BP M 的四个组成部分 :  
2 1 文件 头信 息块   .

1 显 示 缓 冲 区与 颜 色 定 义   
P 机的显 示卡上的 R M 存储器 中的数据 按  C A 照显示器显示格式进行存储 。众所周知, 计算机只  能以二进制方式存储数据 , 每位有两种状态。对于  单色显示器 , 内存 中只需 存放 一张表 , 表中每一位  对应屏幕上一个像素点 , 该位为 1 则表示该点是亮  点 。而对于彩然显卡来 , 要表示屏幕上像素点的信  息, 仅用一位就不够了 。对于显示 1 6色的显示模  式, 就需 4 位定义一种颜色 。到了 E A显示卡时 , G   已经开始有了显示卡兼容性 。在 V A模式时 由于  G 颜色较 多, 分辨率提高带来点数的增加 , 所需要 的  显存增大 , 从而出现了一种以“ 彩色位平面 ” 的存储  结构来表示颜色信息。C A 0 、 E A C V A均  G 40 C G 、 H、G 采用彩色位平面的存储结构。一般 V A的基本配  G 置有 26 5 K的显 示缓 冲区。当支持 1 6种以下的颜  色时 , 使用存储位平面结构 , 此时 26 5 K的示缓冲区  被分为 4 6K的存储位平面 , 个 4 屏幕 上的一个点 ,   由存储位平面 的各一位 组合后 表示 , 多表示 1  最 6 种颜色 。当支持 26 5 种颜色时 , 要使用线性内存 结  构 , 个存储位平面线性链接 , 4 形成 26 5K的线性 内 
存。  

00 — 0 1文件标识 , 00 00 : 为字母 A CI B ”  S I码“ M 。 00 0 3—00 : 件大 小 。 0 5文   0O — O9 保留 , O6 00 : 每字节以“0 填写 。 0”   00 0A一00 : 录 图像 数 据 区 的起 始 位置 。 0D 记   各字节的信息依次 含义为 : 文件头信 息块 大小 , 图 

像描述信息块的大小 , 图像颜色表的大小 , 保留( 为 
0 )  1。

2 2 图像描 述 信息 块  .

00 一0 1: 0 E 0 1 图像 描述 信 息块 的大 小 , 为  常
2 H。 8  

0 1 — 05 图像宽度 。 02 0 1 :   0 1 — 09 图像高度 。 06 0 1:   01 01 : 0 A一 0B 图像的 p n 总数 ( le a 恒为 1。 )  

0 1 一 0 D 记录像素 的位数 , 0C 01 : 很重要的数值 ,   图像的颜色数由该值决定 。  
01 0 E一02 : 据压 缩 方式 ( 0 1数 数值 为 0 不压 缩 ; :  

在使用 1 6色和 26色模式 示时 , 要一张 颜  5 需 色表 , 以将显存的数据 “ 翻译 ” 为屏幕上的点信 息。   所谓颜色表 , 就是通常所指的“ 调色板” 。当显示器  要显示屏幕 上的一个点时 , 先由显示卡将显存 中的  数据读 出, 然后对照颜色表 , 得到一组 R B颜色信  G 息, 然后调整示 器的射线管 , 在屏幕相 应位置显示  个点。当显存 中所有的点都显示后 , 就得到所看 


数值为 18 : 位压缩 ; 数值为 24 : 位压缩 ) 。   02 — 05 图像区数据的大小 。 02 02 :  

02 — 0 9 水平每 米有 多少像 素 , 设备无  06 02 : 在
关位置 (DB 中 , .I) 每字节以 0 H填写 。 0   02 0A一02 : 0 D 垂直每米有多少像素 , 在设备无  关位图 (DB 中 , .I) 每字节以 0 H填写 。 0   02 03 : 0E一 0 1此图像所用的颜色数 , 如值为 0 ,   表示所有颜色一样重要。   2 3 颜 色表  . 颜色表的大小根据所使用的颜色模式 而定 :  2

到的图像 。用户还可以根据 自己示的需要 , 更改颜  色表 的 R B对 应值 , 到 自定 义 的颜 色 。 G 得   在显示模式到了真彩色级别时 , 由于显示内存  中存储的 已经是像素 点的 R B信息 , G 调色板就变 

维普资讯 http://www.cqvip.com

第3 期 



明 , : Wi os 等 非 n w 环境 下 B P d M 图像显示 的 c语言实现 

色图像 为 8 字节 ;6 1 色图像 位 6 字节 ;5 4 26色图像  为 12 字节。其 中, 4 04 每 字节表示一种颜 色 , 并以  B 蓝色)G 绿色 )R 红 色) ̄ h (2 ( 、( 、( 、 pa3 位位 图的透 
明度值 , 一般 不需要 ) 。即首先 4字节表示颜 色号  1 的颜色 , 接下来表示颜色号 2 的颜色 , 依此类推 。  
2 4 图像数 据 区  .

点信息。  

该颜色表在显卡芯片中其实对应一组寄存器 ,  
该 寄存 器 就 是 D C色彩 寄 存 器 , 非 真 彩 色 的 屏  A 在

幕模式下 , 修改 了 D C寄存器 的值 , A 就相 当于修改  了显存在某种色号对应的色彩信 息。在 V A及其  G 兼容卡中 , 一共有 26 该寄存器构成了一片存储  5个 单 元 , 单元 就 是显 示 器 的 D C色 表 。 该 A   在 26 B P位图中 , 5色 M 也有这样 一张色表 , 记  录了该图片不 同色彩信 息对应的 R B值 , G 该色表  位于 B P M 文件第 5 4字节 的位置 , 按照 : 、 、 、l B G R a  — pa h 的顺序排列 , 该 R B信 息与 D C色彩寄存  但 G A 器的信息不 同 , A D C寄 存器需 要 的颜色 以 6 位表  示, 即最大值为 03 , xF 而该 B P中的色表以 8 M 位表  示, 最大值 为 0F 。因此 , xF 要将 B P M 位图的颜色信  息换算为显示的 D C信息 , A 只需将从 B P获得 的  M 值 右 移 2位 即可 。   4 2硬 件 无关 屏 幕初 始 化  .

颜色表接下来为位图文件的图像数 据区, 在此  部分记录着每点像素对应的颜色号 , 其记录方式也  随颜色模式而定 , 2色图像每像素 点 占 1 ;6 即 位 1  色图像每像素 点占 4位 ; 6色图像每像素 点 占 8 2 5   位; 真彩色图像每像素点占 2 位 。所以 , 4 整个数据 
区的大小也会随之变化 。就其规律而言 , 可得出如  下计算公式 : 图像数据信 息大小 =( 图像 宽度 *图 

像高度 * 记录像素的位数 )8  /。
然而 , 未压缩的图像信息区的大小。除了真彩  色模式外 , 其余的均大于或等于数据信息的大小 。  
还有一点要声明 , 当屏幕初始化 为 26 5 色模式  时, 一定要设置调色板或修正颜 色值 , 否则无法得  到正确的图像颜色 。  

现在 已 经找 到 了硬 件无 关 性 初 始化 屏 幕 为  60 40 5 4 × 8 26色模 式的方法 。这样 一来 , 只要在 
屏幕初始化之前先记录下原来的屏幕模式 , 程序结  束后再恢复到原来 的屏幕模 式即可。以下部分源  代码 :  
sl taerg t   a p ̄) *换 页 函  e e g( ie c r a / ep e srh  
数 */   {no E Sr u i R G  ; n  
r. a x.x=0 4f5: x 0   r. b x. x=0  

3 置 26色 图形 模 式    5
要使 用 26色 图 形 模 式 , 用 TroC的 界 面  5 使 ub  模式是不行的 , 因为它是 V A 6色的文 本模式 , G1 要 

使用 26图形模式 , 5 则要调用显卡 BO 进 行图形  IS 界面初始化。具体是 调用 IH的显示 中断 , 功  O 将 能号 A H置 为 0 子 功能号 A J 为要使用 的模 式  , I 置 号。初始化得到了 26 5 色图形模式的屏幕 , 接下来 

要做 的就是向屏幕显示图像了 。在显示图像之前 ,   介绍一个很 重要的  指针 。也许在 1 6色 V A I G H  模式里用过 , 那就是内存 中的图形模式显存映像指  针 0a00 , x 0( 说它 是映像指针 , 因为显 示器 只  0  ̄ 是 与显示卡直接打交道 , 以要更改屏幕内容还需要  所
更改显存 内容。因此 , 内存 中提供 一块 6 K的 区  4 域, 通过显示 中断 可 以使 它映 射为显存 的不 同 区  域, 更改该内存中的值即更改了相应映射区域的显  存 。但是在 60×40的 26色模式 下 , 4 8 5 存储 一 屏 

rxd =pg; ..x ae/*选 择 页面 */  
i 8 (x0 & , r ; n 6 0 1 , r& )  t

}  
u sg e   h rs t n in d c a  e


s VGA
_

m d( t m d )   o e i   o e /* nv

设置 S G V A屏幕模式 *   /
{no  E Sr u i R G  ; n  
r x. x=o 4 0   . a x f 2; r x. x=v d   . b mo e;

it (x0 & , r ; n8 0 1 , r& )  6 rt rh a )  eu . .h ; m(
;  

所有的像素 点需 要 60 8bt=30 4 ×40 y e 0K的存储 单  元。这 就 要 用 到 V S 显 卡 换 页 的 功 能。让  EA
0a00  ̄开始的这 6K显存 映射到屏 幕显存 的  x 01 0 X 4 其他区域 。  

s G   m d(/ 获取当前  VA oe ) * SG V A屏幕模式 *   /
u sg e  n  e n in d i tg t


4 显 示 2 6色 B   5 MP位 图 
4 1 V A的 D C色彩 寄 存器 知 识  .   G A

{n nR G  ; ui   E Sr o  
r. a x.x=0x 0   4f3:

i 8 (x0 & , r ; n 6 0 1 , r& ) t   r un rX b )  e r ( . .x ; t
}  

前面已经讲过 ,6色和 26 1 5 色模式显示时 , 需  要一张颜色表 , 以将显存 的数据“ 翻译” 为屏幕上的 

维普资讯 http://www.cqvip.com

哈尔 滨 商业大 学学 报 ( 然科学 版 ) 自  

第 l 卷  8

vi d p yca f nm [0 ] * o   sl (hr l a e10 / 读取 图  di a  e i

像信息 , 显示图像 *   /
e pg  l   { t ae n w=0, a e od= 0; i  g np
_

frj egh ;>=0 j o( =1nt 一1j ; 一一)  

{ed bfrwd ,, )  fa(u e, t 1f ; r i h p
fri , =0 i id ; ++, +) o( =0 n ;<w t i h n+  

i , , ,, , , vm d , it, n t; , k n rg b s e o e wd l g   j a h e h
ln   o i o   o g p st n; i

i( f f o e ( l a e “b ) ==N L ) ( p=f n fe m ,r” ) p im U L 

{ si = *60 +i *计算 要显示 点的显  p i n j 41 ; ot o / 存位 置 *   / pg — nw=psi /53 ; *计 算显 示 页  a e e o tn656/ io
*/fp g nw! =pg  o ) i ae e ( ae l /*当显 示 页 不 同  d


{r f “ a ’ oe l: ”bfr; pi (C nt pnfe %s,u e)  n   i
rt n; e ur  

}  
f k f ,8 S E   s T ;  ̄ ( 2 ,E K p E)   f ( ia 1 f)  t & ,, , ;  ̄d p

时更换页面 , 提高一定的输出速度 */   { l t g(ae nw ; e ea s e p epg e ) 


pg a e_ o d=p g l ae


nw; e }  

ii = ) * f ! 8/ 检查是否为 26 ( 5 色位 图 *   / {u (Nt  5 o r i a I)  pt ”o a26cl  t p”; s   o bm
f o ( ) ei O ; c s f ;x ( )  le p t }   f k f,8 S E  ̄ ( 1 ,E K p


pkb0a0 ,o tn 53 ,ue[] ; oe(x00 ps o %656b r ) i i f n   / *写到显存位置 *   /
}  
f e ( , ,E K s kf kS E e p
_

C R ;* U )/ 每行绘制完后修 

ST ; E ) 

正 宽 度 */  
}   f oe f) c s( ; l p  
gt ( ; e h )  c

f a ( wd , , , )  r d & it 4 1 f ; e h p

i d & eg 4 1f ; f a ( lnt, , , )  e h p

s e oe gt S G   m d( ; *先保存原  a md = e V A v   oe )/
来 

e S Am d(a m d )/ 恢复屏幕 *   s — G —oes e oe ; * tV v / 的屏幕模式 *   / s   S G   m d (xO )/ e t VA oeO l1 ; *硬件无关性初 
}  

始 

5 结 语   
本文详细描述了显卡硬件特点 、 显示缓冲区与  颜色定义以及 B P图像文件格式 , M 最后介绍了 26 5  色 B P图像用 c语言来实现 的方 法。实验 表明 , M   该方 法是可行 的。而且 , 在此基础上 , 可以进一步  改进 , 以实现在非 Wi os n w 环境 下 1 色真 彩 B P d 6 M 

化屏幕为 60× 8   6 4 402 色模式 *   5 /
el f,4 S E   S T ; e (p 5 ,E K 【 E ) 

f (= ;< 5 ;++) * 照该 图片 的 D C o i 0 i 26 i r / 按 A  色表设置色彩寄存器 *   /
{ = t( ; =f t(p ;=f t(p ; b   c )g g cf)r g cf)  e e /*获 取 R、 、 G B分量 */  
o t r (x c ,)  u ot o3 8 i ; p b

和 2 色真彩 B P以及 JP 、 I 4 M E G GF等图像的 c 语言 
显示 。   参 考文 献 :  
[] 1王士元 . c高级 实用程序设计 [ . M]北京 : 清华大学出版社 , 9 . 16 9  
[] 2谭浩强 . 程 序设计 [ . c M]北京 : 清华大学 出版社 , 9 . 1 8 9   [ ] 利洁 , 3贺 赵曙光 . 计算机 图形显 示技术 ( 2 ) M . 第 版 [ ] 西安 : 安  西 电子 科技大学 出版社 ,0 1 20 .  

ot r (xc ,> >2 ; *右 移 是 要转 化 为  u ot o39 r ph )/

V A的 6 G 位寄存器形式 *   / o t r (x c , > > )  u ot 0 39 g p b 2;
o t r (x c , > >2 ; u ot O3 9 b p b ) 
f t( )  g cf ; e p

}  

[] A I M N K R. 刚等译 . 字图像处理 ( l )M . 4 c s1 A . . 朱志 E 数 第 版 [ ]北 
京: 电子工业出版社 , 9 . 18 9  

k wd %4 ?( 一wd %4 : ; *宽度修  =( t ) 4 i t )0/ ih h 正 值