您的位置:首页 > 其它

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

2010-07-31 22:32 246 查看
1.1 位图和调色板的概念
1. 真彩色图: 它的颜色数高达256×256×256种,也就是说包含我们上述提到的R、G、B颜色表示方法中所有的颜色。真彩色图是说它具有显示所有颜色的能力,即最多可以包含所有的颜色。

1.2 bmp文件格式
(WORD为无符号16位整数,DWORD为无符号32位整数,LONG为32长整型)
1. bmp文件大体上分成四个部分:
1)位图文件头BITMAPFILEHEADER,共14个字节。
2)位图信息头BITMAPINFOHEADER,共40个字节。
3)调色板Palette
4)实际的位图数据ImageDate
调色板实际上是一个数组,共有biClrUsed个元素(如果该值为零,则有 个元素)。数组中每个元素的类型是一个RGBQUAD结构,占4个字节。(红色,绿色与蓝色的排序与一般图像文件的颜色数据排序恰好相反~)
对于用到调色板的位图,图象数据就是该象素颜在调色板中的索引值。对于真彩色图,图象数据就是实际的R、G、B值

2. 要注意两点:
1) 每一行的字节数必须是4的整倍数,如果不是,则需要补齐。
2) 一般来说,BMP文件的数据从下到上,从左到右的

1.3 显示一个bmp文件的C程序
一,loadBmpFile函数实现过程:
1. 打开文件到HFILE结构变量中。
2. 从HFILE变量中读取BITMPFILEHEADER和BITMAPINFOHEADER两个结构变量。
3. 计算图像行字节数和图像总字节数。
4. 计算实际使用到的颜色个数并验证结果.
5. 填写bf.bfsize;
6. 分配全局内存空间,大小为(bitmapinfoheader+palette+实际图像)返回一个句柄。
7. LPBITMAPINFOHEADER指向分配的全局内存空间。
8. 文件指针重新定位到BITMAPINFOHEADER开始处并将内容读入LPBITMAPINFOHEADER类型指针中。关闭文件。_hread和_lread的区别。
9. NumColors不为零时,说明用到了调色板。为逻辑调色板分配局部内存,大小为逻辑调色板结构长度加NumColors个PALETTENTRY。
10.LOGPALETTE类型指针pPal指向该内存区,填写逻辑调色板结构的头。lpRGB指向的是调色板开始的位置,填写pPal->palPalEntry的每一项。
11.产生逻辑调色板全局变量hPalette,解锁并释放局部内存。
12.获得设备上下文句柄。
13.如果产生了逻辑调色板,将新的逻辑调色板选入DC,将旧的逻辑调色板句柄保存在hPrevPalette中。
14.产生位图句柄。使用完现在的调色板,就要把原来的调色板还原至DC中。
15.释放设备上下文,解锁内存区。

二,响应WM_PAINT消息:
1. 获得屏幕设备上下文BeginPaint和GetDC的区别。
2. 建立一个内存设备上下文。当有调色板,将调色板选入屏幕设备上下文和内存设备上下文。
3. 将位图选入内存设备上下文,显示位图,释放内存设备上下文,释放屏幕设备上下文。
注意:1)要2个DC的原因是,在绘制位图时要将源(内存)设备上下文的内容复制到目的(屏幕)设备上下文中。

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

终于解决了!!
答:看书上提供的代码时没有注意到有一个.rc为后缀的资源文件,里面定义了一个menu,menu里面有一个子控件open,它和WM_LOADBITMAP关联。以前从来没想过去手动编辑资源文件,要不是昨天开始尝试使用dos下编译c++文件,怎么也没想要打开这个文件看看。看来放一放还是对了,忍了这么久终于解放了!稍后写一篇关于如果VC资源文件结构的文章,对以后学习有帮助。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: