当前位置:C++技术网 > 精选软件 > Win32获取位图的信息之获取位图的宽度和高度

Win32获取位图的信息之获取位图的宽度和高度

更新时间:2015-12-16 21:31:09浏览次数:1+次

    用惯了MFC,然后突然想到要用到位图的宽度和高度,一时都蒙了。冷静下来,查阅资料熟悉了获取位图宽度和高度的方法。
    每一个图片都会有宽度和高度,在图片处理的应用中经常使用宽度高度来循环遍历图片数据。通过循环遍历,就可以对整个图片做各种处理,比如反色,旋转,滤镜等等,甚至是人脸识别处理。
    回到Win32环境,竟然一时发蒙了。稍微查一下资料,知道了GetObject函数,就是用来获取对象的,可以用来查询位图的信息。
    位图的信息,使用最为频繁的就是宽度和高度了,至于其他信息,倒用的不是很多。位图信息在Windows中有个专门的结构体,为BITMAP。声明如下:
typedef struct tagBITMAP
  {
    LONG bmType;
    LONG bmWidth;
    LONG bmHeight;
    LONG bmWidthBytes;
    WORD bmPlanes;
    WORD bmBitsPixel;
    LPVOID bmBits;
  } BITMAP;
    我们一眼就可以看到,第二个和第三个成员就是宽和高了,其他的成员今天我就不感兴趣了,有兴趣的你可以查阅MSDN看解释。以后有空,可以写文章分析一下。因为这个结构的理解你需要了解很多背景知识,所以不在此多说。
    在文章《Win32实现在窗口贴图,Win32设置窗口背景》中,我详细介绍了加载位图的方法,就不在此赘述了。
    加载位图的代码如下:
hBitmap = LoadBitmap(g_hInstance,MAKEINTRESOURCE(IDB_BITMAP1));
    得到了位图句柄,我们就可以获取位图的信息了。我们使用GetObject函数来获取,将位图结构体传入函数来接受信息。代码如下:
GetObject(hBitmap, sizeof(bm), &bm);
    那么我们就可以直接使用结构体变量的图片宽度和高度成员了。位图的数据部分就是就是一个二维数组,如下图所示:
     文字的位图数据结构示意图
    所以要对图像的每一个像素进行操作,就要用双层循环遍历图片像素:
for (int i=0;i<bm.bmWidth;i++)
{
    for (int j=0;j<bm.bmHeight;j++)
    {
        // - 循环遍历操作
    }
}