第二章 图像的显示
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后面没有分号
二、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 }
三、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 }
五、程序运行:
先打开图片:
选择我们的luna:
显示出来:
然后就可以随便点菜单局域栏里的“图像扫描”、“特效显示”里的功能进行测试了~
六、谢谢大家(o゚v゚)ノ