第二章 图像的显示

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゚)ノ

posted @ 2017-08-12 20:26  Joanna-In-Hdu&Hust  阅读(879)  评论(0编辑  收藏  举报