简易的灰度处理
来源:互联网 发布:sql定义 编辑:程序博客网 时间:2024/04/27 20:09
近期在进行自绘控件的开发时,时常用到灰度图像。譬如真彩色工具条中的Disable状态的图标,譬如真彩菜单Disable状态的图标等。照常来说,可以让控件的使用者去制作相应的图标。然而,为了让控件的使用者在使用控件时尽量简单,一个比较好的办法是在程序中生成Disable状态的图标。本文提供了一个简单的封装类CGrayBitmap,使用它的静态方法DoGray可以根据一个常规图片生成它的灰度图。
原创文章,转帖请注明出处:blog.csdn.net/sjdev
要对图像进行灰度处理,首先需要获取到图像的数据。GetBitmapBits和GetDIBits都可以得到位图的数据。GetBitmapBits用于获取设备独立位图的数据,GetDIBits用于获取兼容位图的数据。MSDN提示说GetBitmapBits只是为了兼容16位Windows而提供的,所以推荐使用GetDIBits。另外GetPixel也可以获取位图数据,不过在进行灰度处理时不建议使用,因为速度太慢了(在某些特殊情况下,GetPixel还是很有用的)。 首先看看GetDIBits函数的定义吧: int GetDIBits(HDC hdc, HBITMAP hbmp, UINT uStartScan, UINT uScanLines, LPVOID lpvBits, LPBITMAPINFO lpbi, UINT uUsage); 注意,GetDIBits的第二个参数hbmp必须为兼容位图;lpvBits用于接收位图数据,如果该参数为空,函数调用将填充lpbi的相应参数;lpbi参数表示指向BITMAPINFO结构的指针,它指定了设备无关位图的数据结构;uUsage用于指定BITMAPINFO结构中bmpColors成员的数据格式,这里咱们使用DIB_RGB_COLORS,它表示颜色表由RGB三个值直接构成(另外一个参数DIB_PAL_COLORS表示使用调色板)。
来看一下使用GetDIBits获取位图数据的代码:
得到数据之后,就可以对于数据进行处理了。由于我们得到的是RGB数据,为了处理方便,定义了一个RGBX结构。灰度算法比较多,这里使用了常用的加权法。
来看一下处理数据的代码:
将数据处理完之后,我们需要创建一个新的位图并给它设置位图数据,这样,新的位图就生成了。注意SetDIBits参数中指定的位图,必须是兼容位图,所以程序中采用CreateCompatibleBitmap而不是CreateBitmap函数来创建位图。代码如下:
附件:
CGrayBitmap类的定义如下:
- 简易的灰度处理
- 简易的灰度处理
- iPhone :图片的灰度处理
- 图像处理 灰度的线性变换
- 页面灰度的处理办法
- 灰度图像的形态学处理
- android 图片灰度处理的处理
- 图像的灰度化处理的基本原理
- 彩色图像的灰度化处理
- [mtalab图像处理] 灰度的线性变换
- 基于C++的灰度值方图处理
- 灰度图像的伪彩色处理
- 彩色图像的灰度化处理
- iPhone How-to:图片的灰度处理
- android图片的灰度化处理
- 实验三 灰度图像的平滑处理
- 实验四 灰度图像的锐化处理
- 灰度图像的伪彩色处理
- gentoo emerge安装
- 用非静态类成员函数作为线程函数
- Oracle修改SYS密码
- 编译universal binary
- VS开发环境的智能感知失效的问题
- 简易的灰度处理
- Javascript 获取页面高度(多种浏览器)
- 心灵故事---转
- 程序员每天该做的事
- debian 使用微软雅黑、宋体和安装chm、rar软件
- GWT MenuBar
- 学习密度与专注力
- Linux下编译和安装软件的方法
- 活的不明白