zoukankan      html  css  js  c++  java
  • 第二章 图像的显示

    VC++图像处理程序设计(第1版)    杨淑莹 编著     边奠英 主审
    第二章 图像的显示
    Joanna-In-Hdu&Hust 手工打,印象更深刻
    使用工具 VS2010 mfc

    声明:这一章开始的代码都是本人实际演示过的,按照本人的操作可以运行。程序并没有很强的健壮性,只能对正确的操作做出符合预期的响应。

    整本书的代码文件、测试图片和程序运行exe请在这里下载https://github.com/CaptainLYN/VCPictureProcessing

    由于这本书我已经做完很长时间了,对于文章中的文字的重点现在已是不甚记得了,所以在此为了避免误导,只贴出代码,代码中大都有我写这个代码时候的心得,基本上都是书中的代码,很多地方都有写注释哦,有问题的同学可以直接再代码中找一找答案~

    相对于(错误百出的)原书有修改的地方大多都有说明。

    说了这么多,突然想把这本书更新完,只是想做事情有始有终U•ェ•*U

    正文:

    一、CViewImage.h 中是第二章用到的所有函数的声明,其实是建了一个类:

     1 #pragma once
     2 class CDib;
     3 class CViewImage:public CView
     4 {
     5 protected:
     6     CPalette *hPalette;//这两个变量都是指针,为什么不是实体类呢?假如程序一次运行只打开一次文件,类是可以的;多次打开会出现内存错误(大家可以试一下),指针的话,没打开一次都是新建一个类,打开完了即没了,适合用指针
     7     CDib *dib;
     8     
     9 public:
    10 
    11     void GetDib(CDib *dib2);//CObject是不能直接作为参数传递的,因为不能被复制,是私有函数
    12 
    13     void virtual OnDraw(CDC *pDC);//CDC类是设备上下文类,用于绘图输出的,实现虚函数
    14     void OnDraw2(CDC *pC,int x_move,int y_move);//原图像显示位置可以移动的绘图函数
    15     void OnDraw3(CDC *pDC,LPBYTE temp,int x_move,int y_move);
    16     void OnDraw4(CDC *pC,int x_move,int y_move,int need_width,int need_height);//可以在原图绘制想要的大小,并没有修改原图的info
    17 
    18     CPalette* CreateBitmapPalette(CDib *pBitmap);
    19     void OnXiangxia(CDC *pDC);//改成了有参数的,CDC在对话框中获取,在这个函数里面获取有中断问题,没解决为什么
    20     void OnXiangshang(CDC *pDC);//向上扫描
    21     void OnXiangyou(CDC *pDC);//向右扫描
    22     void OnXiangzuo(CDC *pDC);//向左扫描
    23     void ToShuiPingYouYi(CDC *pDC);//水平右移
    24     void ToChuiZhiShangYi(CDC *pDC);//垂直上移
    25     void ToJiaoChaFeiRu(CDC *pDC);//交叉飞入
    26     void ToSiZhouKuoZhang(CDC *pDC);//四周扩张
    27     void ToZhongJianShouSuo(CDC *pDC);//中间收缩
    28     void ToShuiPingShanTiao(CDC *pDC);//水平栅条
    29     void TOShuZhiShanTiao(CDC *pDC);//竖直栅条
    30     void ToTuXiangJianXian(CDC *pDC);//图像渐显
    31     void ToShuiPingBaiYeChuang(CDC* pDC);//水平百叶窗
    32     void ToShuZhiBaiYeChuang(CDC* pDC);//垂直百叶窗
    33     void ToMaSaiKeXianShi(CDC *pDC);//马赛克显示
    34 
    35 };//这边少一个分号就多了20几个错误,因为include后面没有分号
    View Code
     

    二、CViewImage.cpp 是相应函数的实现,这里是要重点看的:

      1 #include"stdafx.h"
      2 #include"CDib.h"
      3 #include<WindowsX.h>
      4 
      5 #include"CViewImage.h"
      6 
      7 
      8 void CViewImage::GetDib(CDib *dib2)
      9 {
     10     dib=dib2;
     11 }
     12 
     13 CPalette* CViewImage::CreateBitmapPalette(CDib* pBitmap)
     14 {
     15     struct mPalette//这里加上名字
     16     {
     17         WORD Version;
     18         WORD NumberOfEntries;
     19         PALETTEENTRY aEntries[256];//PALETTEENTRY指向一个逻辑调色板
     20     }palette={0x300,256};//version是0x300
     21 
     22     LPRGBQUAD pRGBTable=pBitmap->GetRGB();//LPRGBQUAD是调色板指针,只有前面是LP的都是指针
     23     UINT numberOfColors=pBitmap->GetNumberOfColors();
     24     for(UINT x=0;x<numberOfColors;++x)
     25     {
     26         palette.aEntries[x].peRed=pRGBTable[x].rgbRed;//这是第二步,对数组元素和成员变量进行设置
     27         palette.aEntries[x].peGreen=pRGBTable[x].rgbGreen;
     28         palette.aEntries[x].peBlue=pRGBTable[x].rgbBlue;
     29         palette.aEntries[x].peFlags=0;//指定调色板如何使用:PC_EXPLICIT(2)  PC_NOCOLLAPSE(4)  PC_RESERVED(1)    
     30     }
     31     hPalette=new CPalette;
     32     hPalette->CreatePalette((LPLOGPALETTE)&palette);//初始化调色板对象,
     33     return hPalette;
     34 }
     35 
     36 void CViewImage::OnDraw(CDC* pDC)//这个函数是一个必须要实现的虚函数,所以即使不大实用也要实现
     37 {
     38     int m_scale=1;//控制缩放比例
     39     BYTE* pBitmapData=dib->GetData();//CDib类的指针对象,其内容还没有想好赋值
     40     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
     41     int bitmapHeight=dib->GetHeight();
     42     int bitmapWidth=dib->GetWidth();
     43     int scaledWidth=(int)(bitmapWidth* m_scale);
     44     int scaledHeight=(int)(bitmapHeight* m_scale);
     45     if(dib->GetRGB())
     46     {
     47         CPalette* hPalette=CreateBitmapPalette(dib);//建立CPlalette对象并初始化调色板对象
     48         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);//为true表示后台调色板,将已创建的调色板调用到设备上下文中,并且返回旧的调色板
     49         //上面这个SelectPalette返回的就是老的调色板
     50         pDC->RealizePalette();//使调色板生效
     51         //前面加::表面调用的是win api,是全局函数,不是局部继承的函数
     52         ::StretchDIBits(pDC->GetSafeHdc(),0,0,scaledWidth,scaledHeight,0,0,bitmapWidth,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
     53                       //设备上下文句柄
     54         pDC->SelectPalette(hOldPalette,true);
     55         ::DeleteObject(hPalette);//释放关于hPalette调色板的一切资源(逻辑笔、画笔、字体、位图、区域或调色板)
     56     }
     57     else//24位真彩色
     58     {
     59         ::StretchDIBits(pDC->GetSafeHdc(),0,0,scaledWidth,scaledHeight,0,0,bitmapWidth,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
     60     }
     61 
     62 }
     63 
     64 void CViewImage::OnDraw2(CDC* pDC,int x_move,int y_move)//这个才是我们需要用的绘制函数
     65 {
     66     int m_scale=1;//控制缩放比例
     67     BYTE* pBitmapData=dib->GetData();//CDib类的指针对象
     68     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
     69     int bitmapHeight=dib->GetHeight();
     70     int bitmapWidth=dib->GetWidth();
     71     int scaledWidth=(int)(bitmapWidth* m_scale);
     72     int scaledHeight=(int)(bitmapHeight* m_scale);
     73     if(dib->GetRGB())
     74     {
     75         CPalette* hPalette=CreateBitmapPalette(dib);//建立CPlalette对象并初始化调色板对象
     76         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);//为true表示后台调色板,将已创建的调色板调用到设备上下文中,并且返回旧的调色板
     77         //上面这个SelectPalette返回的就是老的调色板
     78         pDC->RealizePalette();//使调色板生效
     79         //前面加::表面调用的是win api,是全局函数,不是局部继承的函数
     80         ::StretchDIBits(pDC->GetSafeHdc(),0+x_move,0+y_move,scaledWidth,scaledHeight,0,0,bitmapWidth,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
     81                       //设备上下文句柄
     82         pDC->SelectPalette(hOldPalette,true);
     83         ::DeleteObject(hPalette);//释放关于hPalette调色板的一切资源(逻辑笔、画笔、字体、位图、区域或调色板)
     84     }
     85     else//24位真彩色
     86     {
     87         ::StretchDIBits(pDC->GetSafeHdc(),0+x_move,0+y_move,scaledWidth,scaledHeight,0,0,bitmapWidth,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
     88     }
     89 
     90 }
     91 
     92 void CViewImage::OnDraw3(CDC *pDC,LPBYTE temp,int x_move,int y_move)
     93 {
     94     int m_scale=1;//控制缩放比例
     95     //BYTE* pBitmapData=dib->GetData();//CDib类的指针对象
     96     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
     97     int bitmapHeight=dib->GetHeight();
     98     int bitmapWidth=dib->GetWidth();
     99     int scaledWidth=(int)(bitmapWidth* m_scale);
    100     int scaledHeight=(int)(bitmapHeight* m_scale);
    101     if(dib->GetRGB())
    102     {
    103         CPalette* hPalette=CreateBitmapPalette(dib);//建立CPlalette对象并初始化调色板对象
    104         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);//为true表示后台调色板,将已创建的调色板调用到设备上下文中,并且返回旧的调色板
    105         //上面这个SelectPalette返回的就是老的调色板
    106         pDC->RealizePalette();//使调色板生效
    107         //前面加::表面调用的是win api,是全局函数,不是局部继承的函数
    108         ::StretchDIBits(pDC->GetSafeHdc(),0+x_move,0+y_move,scaledWidth,scaledHeight,0,0,bitmapWidth,bitmapHeight,temp,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    109                       //设备上下文句柄
    110         pDC->SelectPalette(hOldPalette,true);
    111         ::DeleteObject(hPalette);//释放关于hPalette调色板的一切资源(逻辑笔、画笔、字体、位图、区域或调色板)
    112     }
    113     else//24位真彩色
    114     {
    115         ::StretchDIBits(pDC->GetSafeHdc(),0+x_move,0+y_move,scaledWidth,scaledHeight,0,0,bitmapWidth,bitmapHeight,temp,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    116     }
    117 
    118 }
    119 
    120 void CViewImage::OnDraw4(CDC *pDC,int x_move,int y_move,int need_width,int need_height)
    121 {
    122     int m_scale=1;//控制缩放比例
    123     //BYTE* pBitmapData=dib->GetData();//CDib类的指针对象
    124     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    125     /*int bitmapHeight=dib->GetHeight();
    126     int bitmapWidth=dib->GetWidth();*/
    127     int scaledWidth=(int)(need_width* m_scale);
    128     int scaledHeight=(int)(need_height* m_scale);
    129     if(dib->GetRGB())
    130     {
    131         CPalette* hPalette=CreateBitmapPalette(dib);//建立CPlalette对象并初始化调色板对象
    132         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);//为true表示后台调色板,将已创建的调色板调用到设备上下文中,并且返回旧的调色板
    133         //上面这个SelectPalette返回的就是老的调色板
    134         pDC->RealizePalette();//使调色板生效
    135         //前面加::表面调用的是win api,是全局函数,不是局部继承的函数
    136         ::StretchDIBits(pDC->GetSafeHdc(),0+x_move,0+y_move,scaledWidth,scaledHeight,0,0,need_width,need_height,dib->GetData(),pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    137                       //设备上下文句柄
    138         pDC->SelectPalette(hOldPalette,true);
    139         ::DeleteObject(hPalette);//释放关于hPalette调色板的一切资源(逻辑笔、画笔、字体、位图、区域或调色板)
    140     }
    141     else//24位真彩色
    142     {
    143         ::StretchDIBits(pDC->GetSafeHdc(),0+x_move,0+y_move,scaledWidth,scaledHeight,0,0,need_width,need_height,dib->GetData(),pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    144     }
    145 
    146 }
    147 
    148 void CViewImage::OnXiangxia(CDC *pDC)//向下扫描
    149 {
    150     //CDC *pDC=GetDC();
    151     
    152 //    clearmem();//复制图像数据,取得原始图像的拷贝文件???找不到
    153     CDocument *pDoc=GetDocument();//返回与本视图连接的文档类对象指针,这边改了
    154 
    155     //ASSERT_VALID(pDoc);//判断指向的对象是否为空,debug下有效
    156     //if(!pDoc->stateddoc&&state2==1)//???????????
    157     //{
    158         BYTE* pBitmapData=dib->GetData();//将书中的伪变量换成了自己设的
    159         LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    160         int bitmapHeight=dib->GetHeight();
    161         int bitmapWidth=dib->GetWidth();
    162 
    163         if(dib->GetRGB())//如果颜色表指针不为空
    164         {
    165             CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);//一个矩形类
    166             CBrush brush(RGB(255,255,255));
    167             pDC->FillRect(&rect,&brush);//将整个矩阵用白色填满,图像的区域是不包含右边和下边
    168 
    169             CPalette* hPalette=CreateBitmapPalette(dib);
    170             CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    171             pDC->RealizePalette();
    172             for(int j=0;j<bitmapHeight;j++)
    173             {
    174                 //修改了第7个参数,比原书-1,书那样是不对的
    175                 //图像横着是x轴,竖着向下是y轴
    176                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,j,bitmapWidth,1,0,bitmapHeight-j-1,bitmapWidth,1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    177                 //1是设备上下文句柄,2、3参数是绘制图像左上角坐标,4、5是绘制图像的宽度和高度,6、7是要绘制的原图的左下角坐标(--假如坐标超出了,绘制图像相应区域会以白色代替--)(注意,位图行的存储是颠倒的,所以是倒着复制),8、9是原图宽度和高度,10是指向图像数据的指针,11是指向图像BITMAPINFO结构的指针,12是bmiColors包含真实的RGB值还是调色板中的索引值,13指定要进行的光栅运算
    178                 //如果目标矩阵大于要复制的原图区域就进行行和列的拉伸,反之利用光栅操作进行压缩
    179                 Sleep(5);//延时5毫秒
    180             }
    181             pDC->SelectPalette(hOldPalette,true);
    182             ::DeleteObject(hPalette);
    183         }
    184 //    }
    185     //Invalidate();//刷新,调用会出现中断
    186 }
    187 void CViewImage::OnXiangshang(CDC *pDC)//向上扫描
    188 {
    189     //CDocument *pDoc=GetDocument();
    190     BYTE* pBitmapData=dib->GetData();
    191     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    192     int bitmapHeight=dib->GetHeight();
    193     int bitmapWidth=dib->GetWidth();
    194 
    195     if(dib->GetRGB())
    196     {
    197         CRect rect(bitmapWidth+5,0,bitmapWidth*2+5,bitmapHeight);//一个矩形类
    198         CBrush brush(RGB(255,255,255));
    199         pDC->FillRect(&rect,&brush);//将整个矩阵用白色填满,但是只包括矩阵的左上边界,不包括右下边界
    200 
    201         CPalette* hPalette=CreateBitmapPalette(dib);
    202         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    203         pDC->RealizePalette();
    204         for(int j=0;j<bitmapHeight;j++)
    205         {
    206             
    207             ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,bitmapHeight-j-1,bitmapWidth,1,0,j,bitmapWidth,1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    208             Sleep(5);
    209         }
    210         pDC->SelectPalette(hOldPalette,true);
    211         ::DeleteObject(hPalette);
    212     }
    213 }
    214 void CViewImage::OnXiangyou(CDC *pDC)//向右扫描
    215 {
    216     //CDocument *pDoc=GetDocument();
    217     BYTE* pBitmapData=dib->GetData();
    218     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    219     int bitmapHeight=dib->GetHeight();
    220     int bitmapWidth=dib->GetWidth();
    221 
    222     if(dib->GetRGB())
    223     {
    224 
    225         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    226         CBrush brush(RGB(255,255,255));
    227         pDC->FillRect(&rect,&brush);
    228 
    229         CPalette *hPalette=CreateBitmapPalette(dib);
    230         CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
    231         pDC->RealizePalette();
    232         for(int i=0;i<bitmapWidth;i++)
    233         {
    234             ::StretchDIBits(pDC->GetSafeHdc(),i+bitmapWidth+5,0,1,bitmapHeight,i,0,1,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    235             Sleep(5);
    236         }
    237         pDC->SelectPalette(hOldPalette,true);
    238         ::DeleteObject(hPalette);
    239     }
    240 }
    241 void CViewImage::OnXiangzuo(CDC *pDC)//向左扫描
    242 {
    243     //CDocument *pDoc=GetDocument();
    244     BYTE* pBitmapData=dib->GetData();
    245     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    246     int bitmapHeight=dib->GetHeight();
    247     int bitmapWidth=dib->GetWidth();
    248 
    249     if(dib->GetRGB())
    250     {
    251         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    252         CBrush brush(RGB(255,255,255));
    253         pDC->FillRect(&rect,&brush);
    254 
    255         CPalette* hPalette=CreateBitmapPalette(dib);
    256         CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
    257         pDC->RealizePalette();
    258         for(int i=0;i<bitmapWidth;i++)
    259         {
    260             ::StretchDIBits(pDC->GetSafeHdc(),2*bitmapWidth-i+4,0,1,bitmapHeight,bitmapWidth-i-1,0,1,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    261             Sleep(5);
    262         }
    263         pDC->SelectPalette(hOldPalette,true);
    264         ::DeleteObject(hPalette);
    265     }
    266 }
    267 void CViewImage::ToShuiPingYouYi(CDC *pDC)//水平右移
    268 {
    269     //CDocument *pDoc=GetDocument();
    270 
    271     BYTE* pBitmapData=dib->GetData();
    272     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    273     int bitmapHeight=dib->GetHeight();
    274     int bitmapWidth=dib->GetWidth();
    275 
    276     if(dib->GetRGB())
    277     {
    278         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    279         CBrush brush(RGB(255,255,255));
    280         pDC->FillRect(&rect,&brush);
    281 
    282         CPalette *hPalette=CreateBitmapPalette(dib);
    283         CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
    284         pDC->RealizePalette();
    285         
    286         for(int i=0;i<bitmapWidth;i++)
    287         {
    288             //原书这个代码是错误的,图像下部分没有复制到,因为当j小于bitmapHeight而又距离小于8时,下一次就不能复制了
    289             /*for(int j=0;j<bitmapHeight;j=j+8)
    290             {
    291                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,j-8,i+1,8,bitmapWidth-i,bitmapHeight-j,i+1,8,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    292             }*/
    293             //按照自己理解写的,简单又实用
    294             ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,0,i+1,bitmapHeight,bitmapWidth-i-1,0,i+1,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    295             Sleep(3);
    296         }
    297 
    298         pDC->SelectPalette(hOldPalette,true);
    299         ::DeleteObject(hPalette);
    300     }
    301 }
    302 void CViewImage::ToChuiZhiShangYi(CDC *pDC)//垂直向上
    303 {
    304     //CDocument *pDoc=GetDocument();
    305 
    306     BYTE* pBitmapData=dib->GetData();
    307     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    308     int bitmapHeight=dib->GetHeight();
    309     int bitmapWidth=dib->GetWidth();
    310 
    311     if(dib->GetRGB())
    312     {
    313         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    314         CBrush brush(RGB(255,255,255));
    315         pDC->FillRect(&rect,&brush);
    316 
    317         CPalette *hPalette=CreateBitmapPalette(dib);
    318         CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
    319         pDC->RealizePalette();
    320 
    321         for(int j=0;j<bitmapHeight;j++)
    322         {
    323             ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,bitmapHeight-j-1,bitmapWidth,j+1,0,bitmapHeight-1-j,bitmapWidth,j+1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    324             Sleep(4);
    325         }
    326 
    327         pDC->SelectPalette(hOldPalette,true);
    328         ::DeleteObject(hPalette);
    329     }
    330 }
    331 void CViewImage::ToJiaoChaFeiRu(CDC *pDC)//交叉飞入
    332 {
    333     //CDocument *pDoc=GetDocument();
    334 
    335     BYTE* pBitmapData=dib->GetData();
    336     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    337     int bitmapHeight=dib->GetHeight();
    338     int bitmapWidth=dib->GetWidth();
    339 
    340     if(dib->GetRGB())
    341     {
    342         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    343         CBrush brush(RGB(255,255,255));
    344         pDC->FillRect(&rect,&brush);
    345 
    346         CPalette *hPalette=CreateBitmapPalette(dib);
    347         CPalette *hOldPalette=pDC->SelectPalette(hPalette,true);
    348         pDC->RealizePalette();
    349         
    350         for(int i=0;i<bitmapWidth;i++)
    351         {
    352                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,0,i+1,bitmapHeight/2,bitmapWidth-i-1,bitmapHeight/2,i+1,bitmapHeight/2,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    353                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth*2+4-i,bitmapHeight/2,i+1,bitmapHeight-bitmapHeight/2,0,0,i+1,bitmapHeight-bitmapHeight/2,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    354                 Sleep(3);
    355         }
    356 
    357         pDC->SelectPalette(hOldPalette,true);
    358         ::DeleteObject(hPalette);
    359     }
    360 }
    361 void CViewImage::ToSiZhouKuoZhang(CDC *pDC)//中间扩张
    362 {
    363     //CDocument *pDoc=GetDocument();
    364     BYTE* pBitmapData=dib->GetData();
    365     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    366     int bitmapHeight=dib->GetHeight();
    367     int bitmapWidth=dib->GetWidth();
    368 
    369     if(dib->GetRGB())
    370     {
    371         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    372         CBrush brush(RGB(255,255,255));
    373         pDC->FillRect(&rect,&brush);
    374 
    375         CPalette* hPalette=CreateBitmapPalette(dib);
    376         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    377         pDC->RealizePalette();
    378 
    379         //for(int i=1;i<=bitmapWidth/2;i++)//直接从1开始
    380         //{
    381         //    //第一个完全多余,而且函数是错误的,竖长型的图片是不能伸展完全的
    382         //    //::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+bitmapWidth/2-i,bitmapHeight/2-i,i*2,i,bitmapWidth/2-i,bitmapHeight/2-i,i*2,i,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    383         //    ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+bitmapWidth/2-i,bitmapHeight/2-i,i*2,i*2,bitmapWidth/2-i,bitmapHeight/2-i,i*2,i*2,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    384         //    Sleep(30);
    385         //}
    386         int u,d,l,r;//上、下、左、右边界值
    387         if(bitmapHeight%2)
    388         {
    389             u=bitmapHeight/2+1;
    390             d=bitmapHeight/2-1;
    391         }
    392         else
    393         {
    394             u=bitmapHeight/2;
    395             d=bitmapHeight/2-1;
    396         }
    397         if(bitmapWidth%2)
    398         {
    399             l=bitmapWidth/2+1;
    400             r=bitmapWidth/2-1;
    401         }
    402         else
    403         {
    404             l=bitmapWidth/2;
    405             r=bitmapWidth/2-1;
    406         }
    407         do
    408         {    
    409             u=u-1>=0?u-1:0;
    410             d=d+1<bitmapHeight?d+1:bitmapHeight-1;
    411             l=l-1>=0?l-1:0;
    412             r=r+1<bitmapWidth?r+1:bitmapWidth-1;
    413             ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+l,u,r-l+1,d-u+1,l,u,r-l+1,d-u+1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    414             Sleep(10);
    415         }while(!(u==0&&l==0&&d==bitmapHeight-1&&r==bitmapWidth-1));
    416 
    417         pDC->SelectPalette(hOldPalette,true);
    418         ::DeleteObject(hPalette);
    419     }
    420 }
    421 void CViewImage::ToZhongJianShouSuo(CDC *pDC)
    422 {
    423     //CDocument *pDoc=GetDocument();
    424     BYTE* pBitmapData=dib->GetData();
    425     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    426     int bitmapHeight=dib->GetHeight();
    427     int bitmapWidth=dib->GetWidth();
    428 
    429     if(dib->GetRGB())
    430     {
    431         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    432         CBrush brush(RGB(255,255,255));
    433         pDC->FillRect(&rect,&brush);
    434 
    435         CPalette* hPalette=CreateBitmapPalette(dib);
    436         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    437         pDC->RealizePalette();
    438 
    439         for(int j=0;j<bitmapHeight/2+bitmapHeight%2;j++)//解决奇数的时候中间不能写的问题
    440         {
    441             //又是个不完全正确显示代码。。。。有修改
    442             //分别从上下向中间复制
    443             ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,j,bitmapWidth,1,0,bitmapHeight-j-1,bitmapWidth,1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    444             ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,bitmapHeight-j-1,bitmapWidth,1,0,j,bitmapWidth,1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    445             Sleep(10);
    446         }
    447         pDC->SelectPalette(hOldPalette,true);
    448         ::DeleteObject(hPalette);
    449     }
    450 }
    451 void CViewImage::ToShuiPingShanTiao(CDC *pDC)//水平栅条
    452 {
    453     //CDocument *pDoc=GetDocument();
    454     BYTE* pBitmapData=dib->GetData();
    455     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    456     int bitmapHeight=dib->GetHeight();
    457     int bitmapWidth=dib->GetWidth();
    458 
    459     if(dib->GetRGB())
    460     {
    461         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    462         CBrush brush(RGB(255,255,255));
    463         pDC->FillRect(&rect,&brush);
    464 
    465         CPalette* hPalette=CreateBitmapPalette(dib);
    466         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    467         pDC->RealizePalette();
    468 
    469         int scanline=5;//每条栅条的宽度
    470         int k=0;
    471         for(int i=0;i<bitmapWidth;i++)
    472         {
    473             for(int j=0;j<bitmapHeight;j+=2*scanline)
    474             {
    475                 //按照代码的实现效果来看,虽然我并没有加边界判断条件,但是它好像只会复制到有数据的地方,不用判断边界
    476                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,j,i+1,scanline,bitmapWidth-i-1,bitmapHeight-j-scanline,i+1,scanline,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    477                 k=j+scanline;//右侧栅条起始行
    478                 ::StretchDIBits(pDC->GetSafeHdc(),2*bitmapWidth+4-i,k,i+1,scanline,0,bitmapHeight-k-scanline,i+1,scanline,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);                
    479             }
    480             Sleep(5);
    481         }
    482         pDC->SelectPalette(hOldPalette,true);
    483         ::DeleteObject(hOldPalette);
    484     }
    485 }
    486 void CViewImage::TOShuZhiShanTiao(CDC *pDC)//竖直栅条
    487 {
    488     //CDocument *pDoc=GetDocument();
    489     BYTE* pBitmapData=dib->GetData();
    490     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    491     int bitmapHeight=dib->GetHeight();
    492     int bitmapWidth=dib->GetWidth();
    493     if(dib->GetRGB())
    494     {
    495         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    496         CBrush brush(RGB(255,255,255));
    497         pDC->FillRect(&rect,&brush);
    498 
    499         CPalette *hPalette=CreateBitmapPalette(dib);
    500         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    501         pDC->RealizePalette();
    502         int scanline=5;
    503         int k=0;
    504         for(int j=0;j<bitmapHeight;j++)
    505         {
    506             for(int i=0;i<bitmapWidth;i+=2*scanline)
    507             {
    508                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+i,0,scanline,j+1,i,0,scanline,j+1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    509                 k=i+scanline;
    510                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+k,bitmapHeight-1-j,scanline,j+1,k,bitmapHeight-1-j,scanline,j+1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    511             
    512             }
    513             Sleep(5);
    514         }
    515         pDC->SelectPalette(hOldPalette,true);
    516         ::DeleteObject(hPalette);
    517     }
    518 }
    519 void CViewImage::ToTuXiangJianXian(CDC *pDC)//图像渐显
    520 {
    521     //CDocument *pDoc=GetDocument();
    522     BYTE* pBitmapData=dib->GetData();
    523     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    524     int bitmapHeight=dib->GetHeight();
    525     int bitmapWidth=dib->GetWidth();
    526     if(dib->GetRGB())
    527     {
    528         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    529         CBrush brush(RGB(255,255,255));
    530         pDC->FillRect(&rect,&brush);
    531 
    532         CPalette *hPalette=CreateBitmapPalette(dib);
    533         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    534         pDC->RealizePalette();
    535         
    536         LPBYTE temp,temp1,temp2;//temp指向新图像矩阵原始指针
    537         temp=new BYTE[bitmapHeight*bitmapWidth];
    538         memset(temp,0,bitmapHeight*bitmapWidth);
    539         for(int n=0;n<=256;n++)
    540         {
    541             temp1=temp;
    542             temp2=pBitmapData;
    543             for(int i=0;i<bitmapWidth;i++)
    544                 for(int j=0;j<bitmapHeight;j++)
    545                 {
    546                     *temp1=(*temp2)*n/256;//这种写法我还是第一次
    547                     temp2++;
    548                     temp1++;
    549                 }
    550                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,0,bitmapWidth,bitmapHeight,0,0,bitmapWidth,bitmapHeight,temp,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    551                 Sleep(6);
    552         }
    553 
    554         pDC->SelectPalette(hOldPalette,true);
    555         ::DeleteObject(hPalette);
    556         delete[]temp;
    557     }
    558 }
    559 void CViewImage::ToShuiPingBaiYeChuang(CDC* pDC)//水平百叶窗
    560 {
    561     //CDocument *pDoc=GetDocument();
    562     BYTE* pBitmapData=dib->GetData();
    563     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    564     int bitmapHeight=dib->GetHeight();
    565     int bitmapWidth=dib->GetWidth();
    566     if(dib->GetRGB())
    567     {
    568         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    569         CBrush brush(RGB(255,255,255));
    570         pDC->FillRect(&rect,&brush);
    571 
    572         CPalette *hPalette=CreateBitmapPalette(dib);
    573         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    574         pDC->RealizePalette();
    575         //按照原书的根本就不能完全形成,有裂缝,已修改
    576         for(int i=0;i<bitmapWidth/10;i++)
    577             for(int j=0;j<=10;j++)//有=是最后那个不足10份的不能落下
    578             {
    579                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+j*(bitmapWidth/10),0,i+1,bitmapHeight,j*(bitmapWidth/10),0,i+1,bitmapHeight,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    580                 Sleep(1);
    581             }
    582     
    583         pDC->SelectPalette(hOldPalette,true);
    584         ::DeleteObject(hPalette);
    585     }
    586 }
    587 void CViewImage::ToShuZhiBaiYeChuang(CDC* pDC)//垂直百叶窗
    588 {
    589     //CDocument *pDoc=GetDocument();
    590     BYTE* pBitmapData=dib->GetData();
    591     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    592     int bitmapHeight=dib->GetHeight();
    593     int bitmapWidth=dib->GetWidth();
    594     if(dib->GetRGB())
    595     {
    596         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    597         CBrush brush(RGB(255,255,255));
    598         pDC->FillRect(&rect,&brush);
    599 
    600         CPalette *hPalette=CreateBitmapPalette(dib);
    601         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    602         pDC->RealizePalette();
    603         //按照原书的根本就不能完全形成,有裂缝,已修改,注意加上括号了
    604         for(int j=0;j<bitmapHeight/10;j++)
    605             for(int i=0;i<=10;i++)//有=是最后那个不足10份的不能落下
    606             {
    607                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5,i*(bitmapHeight/10),bitmapWidth,j+1,0,bitmapHeight-(i+1)*(bitmapHeight/10),bitmapWidth,j+1,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    608                 Sleep(1);
    609             }
    610     
    611         pDC->SelectPalette(hOldPalette,true);
    612         ::DeleteObject(hPalette);
    613     }
    614 }
    615 void CViewImage::ToMaSaiKeXianShi(CDC *pDC)//马赛克显示
    616 {
    617     //CDocument *pDoc=GetDocument();
    618     BYTE* pBitmapData=dib->GetData();
    619     LPBITMAPINFO pBitmapInfo=dib->GetInfo();
    620     int bitmapHeight=dib->GetHeight();
    621     int bitmapWidth=dib->GetWidth();
    622     long mx=0;
    623     long my=0;
    624     //int scanline=8;//设置显示定位量
    625     int k=0;
    626     int nrw=0;
    627     int nrh=0;
    628     if((bitmapWidth%12)!=0) nrw=1;//方格宽是12,多出来的不够12可以作为一个单独显示
    629     if((bitmapHeight%12)!=0) nrh=1;
    630     long ltilenum=(bitmapWidth/12+nrw)*(bitmapHeight/12+nrh);
    631     POINT *point=new POINT[ltilenum];
    632 
    633     if(dib->GetRGB())
    634     {
    635         CRect rect(bitmapWidth+5,0,2*bitmapWidth+5,bitmapHeight);
    636         CBrush brush(RGB(255,255,255));
    637         pDC->FillRect(&rect,&brush);
    638 
    639         CPalette *hPalette=CreateBitmapPalette(dib);
    640         CPalette* hOldPalette=pDC->SelectPalette(hPalette,true);
    641         pDC->RealizePalette();
    642         //
    643         for(int mi=0;mi<ltilenum;mi++)//方框总数
    644         {
    645             point[mi].x=mx;
    646             point[mi].y=my;
    647             mx=mx+12;
    648             if(mx>=bitmapWidth)//修改了
    649             {
    650                 mx=0;my=my+12;
    651             }
    652         }
    653         //srand((unsigned)time(NULL));//设定随机数种子
    654         //代码不能完全显示,已修改
    655         //for(int i=0;i<=2;i++)
    656         //{
    657         //    //
    658         //    for(int mi=ltilenum-1;mi>=0;mi--)
    659         //    {
    660         //        int n=(int)((double)ltilenum*rand()/RAND_MAX);
    661         //        mx=point[n].x;
    662         //        my=point[n].y;
    663         //        ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+mx,my,12,12,mx,bitmapHeight-my-12,12,12,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    664         //        point[n].x=point[mi].x;//使已经显示过的指向可能还没显示的
    665         //        point[n].y=point[mi].y;
    666         //        Sleep(1);
    667         //    }
    668         //}
    669         //下面是我的解法,记录了显示的数,减少重复和避免没有显示完全图像
    670         int xianshi=0;
    671         int *t=new int[ltilenum];
    672         memset(t,0,ltilenum*sizeof(int));//0表示没有访问过
    673         srand((unsigned)time(NULL));//加上这个反而出不来了
    674         while(xianshi<ltilenum)
    675         {
    676                 int n=(int)((double)ltilenum*rand()/RAND_MAX);
    677                 n=n==ltilenum?ltilenum-1:n;
    678                 if(t[n]==0)
    679                 {
    680                 mx=point[n].x;
    681                 my=point[n].y;
    682                 ::StretchDIBits(pDC->GetSafeHdc(),bitmapWidth+5+mx,my,12,12,mx,bitmapHeight-my-12,12,12,pBitmapData,pBitmapInfo,DIB_RGB_COLORS,SRCCOPY);
    683                 t[n]=1;
    684                 xianshi++;
    685                 Sleep(1);
    686                 }
    687         }
    688 
    689         pDC->SelectPalette(hOldPalette,true);
    690         ::DeleteObject(hPalette);
    691         delete[]point;
    692     }
    693 }
    View Code

    三、mfc菜单栏添加的项:

    四、上面每一项的实现函数,其实下列每一个函数都差不多是重复的框架,只是负责调用:

      1 void CMfcPictureProcessingDlg::On32772()//向下扫描
      2 {
      3     CDib dib;
      4     if(filePath.Compare(_T(""))!=0)
      5     {
      6         dib.LoadFile(filePath);
      7         if(dib.m_valid)
      8         {
      9             CDC *pDC=GetDC();
     10             CViewImage imageview;
     11             imageview.GetDib(&dib);
     12             imageview.OnXiangxia(pDC);
     13         }
     14     }
     15     else{
     16         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
     17     }
     18 }
     19 
     20 
     21 void CMfcPictureProcessingDlg::On32773()//向上扫描
     22 {
     23     // TODO: Add your command handler code here
     24     CDib dib;
     25     if(filePath.Compare(_T(""))!=0)
     26     {
     27         dib.LoadFile(filePath);
     28         if(dib.m_valid)
     29         {
     30             CDC *pDC=GetDC();
     31             CViewImage imageview;
     32             imageview.GetDib(&dib);
     33             imageview.OnXiangshang(pDC);
     34         }
     35     }
     36     else{
     37         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
     38     }
     39 }
     40 
     41 
     42 void CMfcPictureProcessingDlg::On32774()//向右扫描
     43 {
     44     // TODO: Add your command handler code here
     45     CDib dib;
     46     if(filePath.Compare(_T(""))!=0)
     47     {
     48         dib.LoadFile(filePath);
     49         if(dib.m_valid)
     50         {
     51             CDC* pDC=GetDC();
     52             CViewImage imageview;
     53             imageview.GetDib(&dib);
     54             imageview.OnXiangyou(pDC);
     55         }
     56     }
     57     else{
     58         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
     59     }
     60 }
     61 
     62 
     63 void CMfcPictureProcessingDlg::On32775()//向左扫描
     64 {
     65     // TODO: Add your command handler code here
     66     CDib dib;
     67     if(filePath.Compare(_T(""))!=0)
     68     {
     69         dib.LoadFile(filePath);
     70         if(dib.m_valid)
     71         {
     72             CDC *pDC=GetDC();
     73             CViewImage imageview;
     74             imageview.GetDib(&dib);
     75             imageview.OnXiangzuo(pDC);
     76         }
     77     }
     78     else{
     79         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
     80     }
     81 }
     82 
     83 
     84 void CMfcPictureProcessingDlg::On32776()//水平右移
     85 {
     86     // TODO: Add your command handler code here
     87     CDib dib;
     88     if(filePath.Compare(_T(""))!=0)
     89     {
     90         dib.LoadFile(filePath);
     91         if(dib.m_valid)
     92         {
     93             CDC *pDC=GetDC();
     94             CViewImage imageview;
     95             imageview.GetDib(&dib);
     96             imageview.ToShuiPingYouYi(pDC);
     97         }
     98     }
     99     else{
    100         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    101     }
    102 }
    103 
    104 
    105 void CMfcPictureProcessingDlg::On32777()//垂直上移
    106 {
    107     // TODO: Add your command handler code here
    108     CDib dib;
    109     if(filePath.Compare(_T(""))!=0)
    110     {
    111         dib.LoadFile(filePath);
    112         if(dib.m_valid)
    113         {
    114             CDC *pDC=GetDC();
    115             CViewImage imageview;
    116             imageview.GetDib(&dib);
    117             imageview.ToChuiZhiShangYi(pDC);
    118         }
    119     }
    120     else{
    121         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    122     }
    123 }
    124 
    125 
    126 void CMfcPictureProcessingDlg::On32778()//交叉飞入
    127 {
    128     // TODO: Add your command handler code here
    129     CDib dib;
    130     if(filePath.Compare(_T(""))!=0)
    131     {
    132         dib.LoadFile(filePath);
    133         if(dib.m_valid)
    134         {
    135             CDC *pDC=GetDC();
    136             CViewImage imageview;
    137             imageview.GetDib(&dib);
    138             imageview.ToJiaoChaFeiRu(pDC);
    139         }
    140     }
    141     else{
    142         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    143     }
    144 
    145 }
    146 
    147 
    148 void CMfcPictureProcessingDlg::On32779()//中间扩张
    149 {
    150     // TODO: Add your command handler code here
    151     CDib dib;
    152     if(filePath.Compare(_T(""))!=0)
    153     {
    154         dib.LoadFile(filePath);
    155         if(dib.m_valid)
    156         {
    157             CDC *pDC=GetDC();
    158             CViewImage imageview;
    159             imageview.GetDib(&dib);
    160             imageview.ToSiZhouKuoZhang(pDC);
    161         }
    162     }
    163     else{
    164         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    165     }
    166 }
    167 
    168 
    169 void CMfcPictureProcessingDlg::On32780()//清空
    170 {
    171     // TODO: Add your command handler code here
    172     Invalidate();
    173     //还不知道如何禁用菜单
    174     //m_Menu.EnableMenuItem(1,MF_GRAYED);
    175 
    176     /*CCmdUI cmdUI;
    177     cmdUI.m_pOther=NULL;
    178     cmdUI.m_pMenu=&m_Menu;
    179     cmdUI.m_pSubMenu=NULL;
    180 
    181     int count=m_Menu.GetMenuItemCount();
    182     cmdUI.m_nIndexMax=count;
    183     for(int i=1;i<count;i++)
    184     {
    185     int nID=m_Menu.GetMenuItemID(i);
    186     if(-1==nID||0==nID)
    187     continue;
    188     cmdUI.m_nID=nID;
    189     cmdUI.m_nIndex=i;
    190     cmdUI.DoUpdate(this,false);
    191     }*/
    192 }
    193 
    194 
    195 void CMfcPictureProcessingDlg::On32781()//中间收缩
    196 {
    197     // TODO: Add your command handler code here
    198     CDib dib;
    199     if(filePath.Compare(_T(""))!=0)
    200     {
    201         dib.LoadFile(filePath);
    202         if(dib.m_valid)
    203         {
    204             CDC *pDC=GetDC();
    205             CViewImage imageview;
    206             imageview.GetDib(&dib);
    207             imageview.ToZhongJianShouSuo(pDC);
    208         }
    209     }
    210     else{
    211         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    212     }
    213 
    214 }
    215 
    216 
    217 void CMfcPictureProcessingDlg::On32782()//水平栅条
    218 {
    219     CDib dib;
    220     if(filePath.Compare(_T(""))!=0)
    221     {
    222         dib.LoadFile(filePath);
    223         if(dib.m_valid)
    224         {
    225             CDC* pDC=GetDC();
    226             CViewImage imageview;
    227             imageview.GetDib(&dib);
    228             imageview.ToShuiPingShanTiao(pDC);
    229         }
    230     }
    231     else{
    232         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    233     }
    234 }
    235 
    236 
    237 void CMfcPictureProcessingDlg::On32783()//竖直栅条
    238 {
    239     CDib dib;
    240     if(filePath.Compare(_T(""))!=0)
    241     {
    242         dib.LoadFile(filePath);
    243         if(dib.m_valid)
    244         {
    245             CDC* pDC=GetDC();
    246             CViewImage imageview;
    247             imageview.GetDib(&dib);
    248             imageview.TOShuZhiShanTiao(pDC);
    249         }
    250     }
    251     else{
    252         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    253     }
    254 }
    255 
    256 
    257 void CMfcPictureProcessingDlg::On32784()//图像渐显
    258 {
    259     CDib dib;
    260     if(filePath.Compare(_T(""))!=0)
    261     {
    262         dib.LoadFile(filePath);
    263         if(dib.m_valid)
    264         {
    265             CDC* pDC=GetDC();
    266             CViewImage imageview;
    267             imageview.GetDib(&dib);
    268             imageview.ToTuXiangJianXian(pDC);
    269         }
    270     }
    271     else{
    272         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    273     }
    274 }
    275 
    276 
    277 void CMfcPictureProcessingDlg::On32785()//水平百叶窗
    278 {
    279     CDib dib;
    280     if(filePath.Compare(_T(""))!=0)
    281     {
    282         dib.LoadFile(filePath);
    283         if(dib.m_valid)
    284         {
    285             CDC* pDC=GetDC();
    286             CViewImage imageview;
    287             imageview.GetDib(&dib);
    288             imageview.ToShuiPingBaiYeChuang(pDC);
    289         }
    290     }
    291     else{
    292         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    293     }
    294 }
    295 
    296 
    297 void CMfcPictureProcessingDlg::On32786()//竖直百叶窗
    298 {
    299     CDib dib;
    300     if(filePath.Compare(_T(""))!=0)
    301     {
    302         dib.LoadFile(filePath);
    303         if(dib.m_valid)
    304         {
    305             CDC* pDC=GetDC();
    306             CViewImage imageview;
    307             imageview.GetDib(&dib);
    308             imageview.ToShuZhiBaiYeChuang(pDC);
    309         }
    310     }
    311     else{
    312         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    313     }
    314 }
    315 
    316 
    317 void CMfcPictureProcessingDlg::On32787()//马赛克显示
    318 {
    319     CDib dib;
    320     if(filePath.Compare(_T(""))!=0)
    321     {
    322         dib.LoadFile(filePath);
    323         if(dib.m_valid)
    324         {
    325             CDC* pDC=GetDC();
    326             CViewImage imageview;
    327             imageview.GetDib(&dib);
    328             imageview.ToMaSaiKeXianShi(pDC);
    329         }
    330     }
    331     else{
    332         MessageBox(_T("请先选择文件!"),_T("提示"),MB_OK);
    333     }
    334 }
    View Code

    五、程序运行:

    先打开图片:

    选择我们的luna:

    显示出来:

    然后就可以随便点菜单局域栏里的“图像扫描”、“特效显示”里的功能进行测试了~

     六、谢谢大家(o゚v゚)ノ

  • 相关阅读:
    (22)C#windows打包部署
    (2)OLEDB数据库操作
    (5)C#工具箱-数据
    (21)C#VS快捷键
    (1)OracleClient数据库操作(淘汰)
    (4)C#工具箱-菜单和工具栏
    (3)C#工具箱-容器
    (2)C#工具箱-公共控件2
    (9)oracle 表的基本查询
    企鹅
  • 原文地址:https://www.cnblogs.com/studylyn/p/7349819.html
Copyright © 2011-2022 走看看