151上位机VC MFC使用GDI+实现锐化浮雕等效果
151上位机VC MFC使用GDI+实现锐化浮雕等效果
功能展示
GDI+ 是微软对窗口DGI的升级,对图片的操作十分方便,我们当前例程实现图片的淡入淡出,灰度效果,底片效果,浮雕效果,油画效果,木刻效果,照射效果,锐化效果; 要点提示 通过微软的GDI+能够快速轻松实现 对图片各种操作; GDI+使用前,得下载微软的GDIPLUS支持包,可从微软的管网下载,我们这里给大家进行了打包; 然后是添加头文件再进行简单的初始化操作,在CWinApp派生类的InitInstance函数中进行此项工作是最好的;
实现功能 1.新建基于对话框的应用程序 2.使用前准备GDI+:将例程根目录Include文件夹复制到自己工程根目录。 在StdAfx.h头文件包含GDI+ 头文件及库文件//使用GDI+第一步 #define UNICODE #ifndef ULONG_PTR #define ULONG_PTR unsigned long* #endif #include "Include/gdiplus.h" using namespace Gdiplus; #pragma comment(lib, "Include/gdiplus.lib") 在APP类的InitInstance()中进行初始化 //使用GDI+第二步 GdiplusStartupInputgdiplusStartupInput; ULONG_PTR gdiplusToken; GdiplusStartup(&gdiplusToken,&gdiplusStartupInput, NULL); 在程序退出时 进行GDI+ 环境的关闭
//使用GDI+第三步 GdiplusShutdown(gdiplusToken); //关闭gdiplus的环境 3,准备好GDI+后,便是使用GDI+ 实现我们想要的功能:
准备三幅位图,放在res文件夹内,拖拽一图片控件,修改ID为IDC_RECT,用于显示图片。依次拖拽按钮关联函数,实现淡入淡出,灰度效果,底片效果,浮雕效果,油画效果,木刻效果,照射效果,锐化效果 - void CGkbc8Dlg::OnButton2()
- {
- KillTimer(1);
- //
- Graphics g(GetDlgItem(IDC_RECT)->GetDC()->m_hDC);
- g.Clear(Color::White);
- Bitmap image(L"res/2.bmp");
- int Width =image.GetWidth()-1;
- int Height =image.GetHeight()-1;
- //绘制原图
- g.DrawImage(&image,0, 0);
- g.TranslateTransform((REAL)image.GetWidth(),0.f);
- /*image2、image3分别用来保存最大值法
- 和加权平均法处理的灰度图像*/
- Bitmap *image2=image.Clone(Rect(0,0,image.GetWidth(), image.GetHeight()),PixelFormatDontCare);
- Bitmap *image3=image.Clone(Rect(0,0,image.GetWidth(), image.GetHeight()),PixelFormatDontCare);
- Color color;
- //使用平均值进行灰度处理
- for(int i=Width; i>=0;i--)
- for( int j=Height; j>=0;j--)
- {
- image.GetPixel(i,j, &color);
- //求出平均三个色彩分量的平均值
- int middle=(color.GetR()+color.GetG()+color.GetB())/3;
- Color colorResult(255,middle,middle,middle);
- image.SetPixel(i,j, colorResult);
- }
- //重新绘制灰度化图
- g.DrawImage(&image, Rect(0, 0, Width, Height));
-
复制代码- //在新位置显示最大值法进行灰度处理的结果
- g.TranslateTransform((REAL)image.GetWidth(),0.f);
- //使用最大值法进行灰度处理
- for(i=Width; i>=0;i--)
- {
- for(int j=Height; j>=0;j--)
- {
- image2->GetPixel(i,j, &color);
- int tmp=color.GetR()>color.GetG()? color.GetR():color.GetG();
- int maxcolor=tmp>color.GetB()? tmp:color.GetB();
- Color colorResult(255,maxcolor,maxcolor,maxcolor);
- //设置处理后的灰度信息
- image2->SetPixel(i, j, colorResult);
- }
- }
- //重新绘制灰度化图
- g.DrawImage(image2, Rect(0, 0, Width, Height));
- //在第二行绘制图片
- g.ResetTransform();
- g.TranslateTransform(0.f, (REAL)image.GetHeight());
- //使用加权平均法进行灰度处理
- for(i=Width; i>=0;i--)
- {
- for(int j=Height; j>=0;j--)
- {
- image3->GetPixel(i, j, &color);
- int R=(int)(0.3f*color.GetR());
- int G=(int)(0.59f*color.GetG());
- int B=(int)(0.11f*color.GetB());
- Color colorResult(255,R,G,B);
- //设置处理后的灰度信息
- image3->SetPixel(i, j, colorResult);
- }
- }
- //重新绘制灰度化图
- g.DrawImage(image3, Rect(0, 0, Width, Height));
- g.TranslateTransform((REAL)image.GetWidth(),0.f);
- //灰度的还原演示,还原使用最大值法处理的灰度图像image2
- for(i=Width; i>0;i--)
- {
-
复制代码- for(int j=Height; j>0;j--)
- {
- image2->GetPixel(i,j, &color);
- int R=color.GetR();
- int G=color.GetG();
- int B=color.GetB();
- //分别对RGB三种色彩分量进行伪彩色还原
- //进行红色分量的还原
- if(R<127)
- R=0;
- if(R>=192)
- R=255;
- if(R<=191&&R>=128)
- R=4*R-510;
- /*进行绿色分量的还原,为了还原后的绿色分量再次参加比较,
- 这里设置一个变量YES表示G是否已经参加了比较*/
- bool yes;
- yes=false;
- if(G<=191&&G>=128&&(!yes))
- {
- G=255;
- yes=true;
- }
- if(G>=192&&(!yes))
- {
- G=1022-4*G;
- yes=true;
- }
- if(G<=63&&(!yes))
- {
- G=254-4*G;
- yes=true;
- }
- if(G<=127&&G>=67&&(!yes))
- G=4*G-257;
- //进行蓝色分量的还原
- if(B<=63)
- B=255;
- if(B>=128)
- B=0;
-
复制代码- if(B>=67&&B<=127)
- B=510-4*B;
- //还原后的伪彩色
- Color colorResult(255,R,G,B);
- //将还原后的RGB信息重新写入位图
- image2->SetPixel(i, j, colorResult);
- }
- }
- //重新绘制还原后的伪彩色位图
- //重新绘制灰度化图
- g.DrawImage(image2, Rect(0, 0, Width, Height));
- delete image2;
- delete image3;
- }
复制代码
功能代码过多,不一一列出,可下载例程源码学习 我们来演示实现的整个过程
|