现在的位置: 首页 > 综合 > 正文

数字图像处理编成入门笔记——第一章Windows位图和调色板

2013年09月15日 ⁄ 综合 ⁄ 共 1612字 ⁄ 字号 评论关闭

1.1 位图和调色板的概念

1. 真彩色图: 它的颜色数高达256×256×256种,也就是说包含我们上述提到的RGB颜色表示方法中所有的颜色。真彩色图是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。

 

1.2 bmp文件格式

(WORD为无符号16位整数,DWORD为无符号32位整数,LONG32长整型)

1.      bmp文件大体上分成四个部分:

1)位图文件头BITMAPFILEHEADER,共14个字节。

2)位图信息头BITMAPINFOHEADER,共40个字节。

3)调色板Palette

4)实际的位图数据ImageDate

调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有 个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节。(红色,绿色与蓝色的排序与一般图像文件的颜色数据排序恰好相反~)

对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的RGB

 

2. 要注意两点:

1) 每一行的字节数必须是4的整倍数,如果不是,则需要补齐。

2) 一般来说,BMP文件的数据从下到上,从左到右的

 

1.3 显示一个bmp文件的C程序

一,loadBmpFile函数实现过程:

1.    打开文件到HFILE结构变量中。

2.    HFILE变量中读取BITMPFILEHEADERBITMAPINFOHEADER两个结构变量。

3.    计算图像行字节数和图像总字节数。

4.    计算实际使用到的颜色个数并验证结果.

5.    填写bf.bfsize;

6.    分配全局内存空间,大小为(bitmapinfoheader+palette+实际图像)返回一个句柄。

7.    LPBITMAPINFOHEADER指向分配的全局内存空间。

8.    文件指针重新定位到BITMAPINFOHEADER开始处并将内容读入LPBITMAPINFOHEADER类型指针中。关闭文件。_hread_lread的区别

9.    NumColors不为零时,说明用到了调色板。为逻辑调色板分配局部内存,大小为逻辑调色板结构长度加NumColorsPALETTENTRY

10.LOGPALETTE类型指针pPal指向该内存区,填写逻辑调色板结构的头。lpRGB指向的是调色板开始的位置,填写pPal->palPalEntry每一项。

11.产生逻辑调色板全局变量hPalette,解锁并释放局部内存。

12.获得设备上下文句柄。

13.如果产生了逻辑调色板,将新的逻辑调色板选入DC,将旧的逻辑调色板句柄保存在hPrevPalette中。

14.产生位图句柄。使用完现在的调色板,就要把原来的调色板还原至DC中。

15.释放设备上下文,解锁内存区。

 

二,响应WM_PAINT消息:

1.    获得屏幕设备上下文BeginPaintGetDC的区别

2.    建立一个内存设备上下文。当有调色板,将调色板选入屏幕设备上下文和内存设备上下文。

3.    将位图选入内存设备上下文,显示位图,释放内存设备上下文,释放屏幕设备上下文。

注意1)要2DC的原因是,在绘制位图时要将源(内存)设备上下文的内容复制到目的(屏幕)设备上下文中。

 

   书提供的代码运行都有问题,经过修改,错误是没了,不过就是图片显示不出来!而且对它的代码还有一些不太明白,比如系统如何发送WM_LOADBITMAP这个消息的呢?

 

终于解决了!!

答:看书上提供的代码时没有注意到有一个.rc为后缀的资源文件,里面定义了一个menu,menu里面有一个子控件open,它和WM_LOADBITMAP关联。以前从来没想过去手动编辑资源文件,要不是昨天开始尝试使用dos下编译c++文件,怎么也没想要打开这个文件看看。看来放一放还是对了,忍了这么久终于解放了!稍后写一篇关于如果VC资源文件结构的文章,对以后学习有帮助。

抱歉!评论已关闭.