QQ登录

只需一步,快速开始

151上位机VC MFC使用GDI+实现锐化浮雕等效果

[ 复制链接 ]

151上位机VC MFC使用GDI+实现锐化浮雕等效果

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,用于显示图片。依次拖拽按钮关联函数,实现淡入淡出,灰度效果,底片效果,浮雕效果,油画效果,木刻效果,照射效果,锐化效果
  1. void CGkbc8Dlg::OnButton2()
  2. {
  3.         KillTimer(1);
  4.         //
  5.         Graphics g(GetDlgItem(IDC_RECT)->GetDC()->m_hDC);
  6.         g.Clear(Color::White);
  7.         Bitmap image(L"res/2.bmp");
  8.         int Width =image.GetWidth()-1;
  9.         int Height =image.GetHeight()-1;

  10.         //绘制原图
  11.         g.DrawImage(&image,0, 0);
  12.         g.TranslateTransform((REAL)image.GetWidth(),0.f);

  13.         /*image2、image3分别用来保存最大值法
  14.         和加权平均法处理的灰度图像*/
  15.         Bitmap *image2=image.Clone(Rect(0,0,image.GetWidth(), image.GetHeight()),PixelFormatDontCare);
  16.         Bitmap *image3=image.Clone(Rect(0,0,image.GetWidth(), image.GetHeight()),PixelFormatDontCare);

  17.         Color color;
  18.         //使用平均值进行灰度处理
  19.         for(int i=Width; i>=0;i--)
  20.                 for( int j=Height; j>=0;j--)
  21.                 {
  22.                         image.GetPixel(i,j, &color);
  23.                         //求出平均三个色彩分量的平均值
  24.                         int middle=(color.GetR()+color.GetG()+color.GetB())/3;
  25.                         Color colorResult(255,middle,middle,middle);
  26.                         image.SetPixel(i,j, colorResult);
  27.                 }
  28.         //重新绘制灰度化图
  29.         g.DrawImage(&image, Rect(0, 0, Width, Height));

  30.         
复制代码
  1. //在新位置显示最大值法进行灰度处理的结果
  2.         g.TranslateTransform((REAL)image.GetWidth(),0.f);
  3.         //使用最大值法进行灰度处理
  4.         for(i=Width; i>=0;i--)
  5.         {
  6.                 for(int j=Height; j>=0;j--)
  7.                 {
  8.                         image2->GetPixel(i,j, &color);
  9.                         int tmp=color.GetR()>color.GetG()? color.GetR():color.GetG();
  10.                         int maxcolor=tmp>color.GetB()? tmp:color.GetB();
  11.                         Color colorResult(255,maxcolor,maxcolor,maxcolor);
  12.                         //设置处理后的灰度信息
  13.                         image2->SetPixel(i, j, colorResult);
  14.                 }
  15.         }

  16.         //重新绘制灰度化图
  17.         g.DrawImage(image2, Rect(0, 0, Width, Height));
  18.         //在第二行绘制图片
  19.         g.ResetTransform();
  20.         g.TranslateTransform(0.f, (REAL)image.GetHeight());

  21.         //使用加权平均法进行灰度处理
  22.         for(i=Width; i>=0;i--)
  23.         {
  24.                 for(int j=Height; j>=0;j--)
  25.                 {
  26.                         image3->GetPixel(i, j, &color);
  27.                         int R=(int)(0.3f*color.GetR());
  28.                         int G=(int)(0.59f*color.GetG());
  29.                         int B=(int)(0.11f*color.GetB());

  30.                         Color colorResult(255,R,G,B);
  31.                         //设置处理后的灰度信息
  32.                         image3->SetPixel(i, j, colorResult);
  33.                 }
  34.         }
  35.         //重新绘制灰度化图
  36.         g.DrawImage(image3, Rect(0, 0, Width, Height));
  37.         g.TranslateTransform((REAL)image.GetWidth(),0.f);
  38.         //灰度的还原演示,还原使用最大值法处理的灰度图像image2
  39.         for(i=Width; i>0;i--)
  40.         {
  41.                

复制代码
  1. for(int j=Height; j>0;j--)
  2.                 {
  3.                         image2->GetPixel(i,j, &color);
  4.                         int R=color.GetR();
  5.                         int G=color.GetG();
  6.                         int B=color.GetB();
  7.                         //分别对RGB三种色彩分量进行伪彩色还原

  8.                         //进行红色分量的还原
  9.                         if(R<127)
  10.                                 R=0;
  11.                         if(R>=192)
  12.                                 R=255;
  13.                         if(R<=191&&R>=128)
  14.                                 R=4*R-510;

  15.                         /*进行绿色分量的还原,为了还原后的绿色分量再次参加比较,
  16.                         这里设置一个变量YES表示G是否已经参加了比较*/

  17.                         bool yes;
  18.                         yes=false;
  19.                         if(G<=191&&G>=128&&(!yes))
  20.                         {
  21.                                 G=255;
  22.                                 yes=true;
  23.                         }
  24.                         if(G>=192&&(!yes))
  25.                         {
  26.                                 G=1022-4*G;
  27.                                 yes=true;
  28.                         }
  29.                         if(G<=63&&(!yes))
  30.                         {
  31.                                 G=254-4*G;
  32.                                 yes=true;
  33.                         }
  34.                         if(G<=127&&G>=67&&(!yes))
  35.                                 G=4*G-257;

  36.                         //进行蓝色分量的还原
  37.                         if(B<=63)
  38.                                 B=255;
  39.                         if(B>=128)
  40.                                 B=0;
  41.                         
复制代码
  1. if(B>=67&&B<=127)
  2.                                 B=510-4*B;

  3.                         //还原后的伪彩色
  4.                         Color colorResult(255,R,G,B);
  5.                         //将还原后的RGB信息重新写入位图
  6.                         image2->SetPixel(i, j, colorResult);

  7.                 }
  8.         }
  9.         //重新绘制还原后的伪彩色位图
  10.         //重新绘制灰度化图
  11.         g.DrawImage(image2, Rect(0, 0, Width, Height));

  12.         delete image2;
  13.         delete image3;
  14. }
复制代码

功能代码过多,不一一列出,可下载例程源码学习
我们来演示实现的整个过程
请点击此处下载

请先注册会员后在进行下载

已注册会员,请先登录后下载

文件名称:151.上位机VC MFC使用GDI 实现锐化浮雕等效果.rar 
文件大小:1.07 MB  售价:10金币
下载权限: 不限 以上或 VIP会员   [购买捐助会员]   [充值积分]   有问题联系我

  

您的支持是我们创作的动力!  

  

您可花点闲钱积分自助任意充值

  

成为VIP会员 全站资源任意下载永久更新!


回复

使用道具 举报

快速回复 返回列表 客服中心 搜索