工控编程吧
标题:
151上位机VC MFC使用GDI+实现锐化浮雕等效果
[打印本页]
作者:
qq263946146
时间:
2016-1-7 19:52
标题:
151上位机VC MFC使用GDI+实现锐化浮雕等效果
(, 下载次数: 0)
上传
点击文件名下载附件
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;
}
复制代码
功能代码过多,不一一列出,可下载例程源码学习
我们来演示实现的整个过程
[iqiyi]http://player.video.qiyi.com/dd6f2a7a4791fe165dd937b77ebf92b8/0/0/w_19rtdmkkgh.swf-albumId=5149440509-tvId=5149440509-isPurchase=0-cnId=12[/iqiyi]
(, 下载次数: 0)
上传
点击文件名下载附件
[note]1[/note]
欢迎光临 工控编程吧 (https://www.gkbc8.com/)
Powered by Discuz! X3.4