MFC下实现 灰度图像显示函数代码 C++


layout: post
title: "MFC下实现 灰度图像显示函数代码 C++"
category: coding
tags: [c++,MFC,图像处理]
description:



一、问题描述

首先,在做图像编程的过程中,对于图像的显示是非常重要的,我们对于图像的处理,经常会用到图像的显示,用于查看结果是否正确,所以我们自然会产生一个想法,是否可以编写一个图像显示的函数,类似于matlab或者openCV中的imshow()函数,可以随时将图像打印出来呢?答案必然是肯定的,在这里,我们在mfc环境下实现自己的imshow()函数。并且在mfc环境下,vc++为我们提供了很多便捷的结构体和函数,使用起来很方便。


二、解决方法

显示图像,我们主要用到的函数是SetDIBitsToDevice();这个函数,这个函数的作用便是将图像显示在输出显示器上面,函数的详细介绍在这里我便不做详细阐述了,读者可以自行的查看百度百科链接(http://baike.baidu.com/link?url=D8WZ6hoanRGCSCrjCia5BKJli5saxSmdi8guNtlvrrlbUxy1BF52o5q1LwImvvHQ5gRCxZMfS0HdrF0C0kv4Q_

三、主要接口函数介绍

这里主要介绍一下函数。
函数原型为:
int SetDIBitsToDevice(HDC hdc, int xDest, int Ydest, DWORD dwWidth, DWORD dwHeight, intXSrc, int Ysrc, UINT uStartScan, UINT cScanLines, CONST VOID *lpvBits, CONST BITMAPINFO *lpbmi, UINT fuColorUse);

参数定义如下:
 hdc:设备环境句柄
XDest,  YDest  :显示在屏幕上面的左上角点的坐标。
 dwWidth:图像宽度。
 dwHeight:图像高度。
 XSrc ,YSrc : 图像的起始坐标 ,一般此处为 0  0  。      /*其实, XSrc ,YSrc dwWidth dwHeight便是将图像的矩形确定出来*/
uStartScan: 指定DIB中的起始[扫描线],此处一般为 0 。
cScanLInes: 指定参数lpvBits指向的数组中包含的DIB扫描线数目。   /*说白了就是图像的高度*/
lpvBits: 指向存储DIB颜色数据的字节类型[数组]的指针。
lpbmi: 指向BITMAPINFO结构的指针,该结构包含有关DIB的信息。
fuColorUse: 指向BITMAPINFO结构中的成员bmiColors是否包含明确的RGB值或对调色板进行索引的值。有关更多的信息,请参考下面的备注部分。
参数fuColorUse必须是下列值之一,这些值的含义如下:
    1、DIB_PAL_COLORS:表示颜色表由16位的索引值[数组]组成,利用这些值可对当前选中的逻辑调色板进行索引。
    2、DIB_RGB_COLORS:表示颜色表包含原义的RGB值。
      /*特别注意:由于默认的显示坐标系与我们正常的坐标系是相反的,所以如果仅仅用此函数正常显示出来,图像是倒立的,如何调整见程序*/
       对于这个函数理解之后我们便可以进行编程了。

四、实现代码

函数说明 :
显示函数为showGrayImg(),三个参数分别为,图像指针,图像宽度,以及图像高度。
显示图像中,首先调用 setBitMapInfo()函数设置图像的文件头,用于setDIBitsToDevice()函数的调用。
特别注意,后面的对于图像宽度为4的整数倍的调整,并将图像边界对齐,即图像每一行的存储大小都为4的整数倍。到此,此函数便可以用于在程序中随时显示函数了,等同于matlab中的imshow()函数。

void setBitmapInfo(BITMAPINFO *bitmapInfo,int width,int height)
{      
         bitmapInfo->bmiHeader.biSize    = sizeof(BITMAPINFOHEADER);
         bitmapInfo->bmiHeader.biWidth       = width;      
         bitmapInfo->bmiHeader.biHeight      = -height;        //特别注意此处要设为负值,用于调整图像的显示方向,如果为+,则图片的显示为倒立的图像,为调整为正立的图像。         bitmapInfo->bmiHeader.biPlanes      = 1;
         bitmapInfo->bmiHeader.biBitCount    = 8;
        bitmapInfo->bmiHeader.biCompression = 0;      
        bitmapInfo->bmiHeader.biSizeImage   = (width+3)/4*4 * height;     
        bitmapInfo->bmiHeader.biXPelsPerMeter = 0;     
       bitmapInfo->bmiHeader.biYPelsPerMeter = 0;     
        bitmapInfo->bmiHeader.biClrUsed       = 0;      
       bitmapInfo->bmiHeader.biClrImportant  = 0;    
        int count = 0;      
        for(count=0;count<256;count++)   
       {      
             bitmapInfo->bmiColors[count].rgbBlue = count;       
             bitmapInfo->bmiColors[count].rgbGreen = count;   
             bitmapInfo->bmiColors[count].rgbRed = count;        
             bitmapInfo->bmiColors[count].rgbReserved = 0;    
       }
 }
int showGrayImg(BYTE * img,int width,int height)
{           
     BITMAPINFO * bitmapInfo = (BITMAPINFO*)new    BYTE[sizeof(BITMAPINFOHEADER)+256*sizeof(RGBQUAD)];   //开辟bmp头以及调色板空间       
     setBitmapInfo(bitmapInfo,width,height);     //设置bmp头文件以及调色板      
     int newWidth = (width + 3)/4*4;    //用于调整图像宽度为4的整数倍,因为显示的时候要求的是按照存储中的形式进行显示。      int count = 0;      
     BYTE * memImg = new BYTE[newWidth * height];   //开辟空间用于经图像宽度对齐     
     memset(memImg,0,newWidth*height);     
     for(;count<height;count++)    
     {          
        memcpy (memImg+count*newWidth,img+count*width,width);   //调整显示边界    
     }       
     HDC hDC= GetDC( GetForegroundWindow() );                   //获取当前显示器的句柄      
     SetDIBitsToDevice(hDC,100,70,width,height,0,0,       0,height,memImg,bitmapInfo,DIB_RGB_COLORS);     
     delete []bitmapInfo;      
     delete []memImg;      
     return 0;
 }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,029评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,395评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,570评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,535评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,650评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,850评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,006评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,747评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,207评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,536评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,683评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,342评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,964评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,772评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,004评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,401评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,566评论 2 349

推荐阅读更多精彩内容