GDI+数字图像处理初探
来源:互联网 发布:战锤2全面战争 优化 编辑:程序博客网 时间:2024/05/19 00:39
GDI+开发环境的Visual C++6.0的配置
特殊说明
简单的GDI+数字图像处理的对话框程序
新建一个基于对话框的MFC应用程序
编写对话框的OnPaint函数
{
CPaintDC dc(this); // device context for painting
// TODO: Add your message handler code here
// Do not call CDialog::OnPaint() for painting messages
if(m_filename!="")
{
graphics.DrawImage(m_pImage,0,0);
UpdateWindow();
}
}
Image* m_pImage;
CString m_filename;
编写图像灰度化的程序
用ImageAttribute类来对图形的RGB分量进行操作
int nWidth=m_pImage->GetWidth();
int nHeight=m_pImage->GetHeight();
Bitmap image(nWidth,nHeight);
Rect rect(0,0,nWidth,nHeight);
Graphics graph(&image);
0.299f,0.299f,0.299f,0.0f,0.0f,
0.587f,0.587f,0.587f,0.0f,0.0f,
0.114f,0.114f,0.114f,0.0f,0.0f,
0.0f, 0.0f, 0.0f, 1.0f,0.0f,
0.0f, 0.0f, 0.0f, 0.0f,1.0f
};
imageAttr.SetColorMatrix(&colorMatrix);
GetEncoderClsid(L"image/bmp",&encoderClsid);
m_filename="C://icetim.bmp";
RedrawWindow();
通过获取每个像素点的值来图像的RGB分量进行操作
//比ImageAttribute要慢的多
int nWidth=m_pImage->GetWidth();
int nHeight=m_pImage->GetHeight();
{
for(int j=0;j<nWidth;j++)
{
bitmap.GetPixel(j,i,&color);
int y=(color.GetR()+color.GetB()+color.GetG())/3;
//colorTemp.SetValue(color.MakeARGB(color.GetA(),color.GetR()/3,color.GetG()/3,color.GetB()/3));
colorTemp.SetValue(color.MakeARGB(color.GetA(),y,y,y));
bitmap.SetPixel(j,i,colorTemp);
}
}
CLSID encoderClsid;
GetEncoderClsid(L"image/bmp",&encoderClsid);
m_pImage->Save(L"C://icetim.bmp",&encoderClsid,NULL);
m_filename="C://icetim.bmp";
RedrawWindow();
两种方法的比较
GetEncoderClsid函数
int GetEncoderClsid(const WCHAR *format, CLSID *pClsid)
{
int nRet = -1;
ImageCodecInfo * pCodecInfo = NULL;
UINT nNum = 0,nSize = 0;
GetImageEncodersSize(&nNum,&nSize);
if (nSize<0)
{
return nRet;
}
pCodecInfo = new ImageCodecInfo[nSize];
if (pCodecInfo==NULL)
{
return nRet;
}
GetImageEncoders(nNum,nSize,pCodecInfo);
for (UINT i=0; i<nNum; i++)
{
if (wcscmp(pCodecInfo[i].MimeType,format)==0)
{
*pClsid = pCodecInfo[i].Clsid;
nRet = i;
return nRet;
}
else
{
continue;
}
}
delete[] pCodecInfo;
return nRet;
}
程序运行时截图
打开和保存图片文件
这里GDI+支持的图片文件格式是很多的,比如bmp、gif、png、jpg、jpeg、tiff等,因此这里的图片灰度化的程序都能正常的处理这些图片。当然也能保存成这些格式的图片。
打开图片文件的程序:
void CGDIDlg::OnFileOpen()
{
// TODO: Add your command handler code here
//利用系统的打开对话框
static char szFilter[]="位图文件(*.bmp;*.dib)|*.bmp;*.dib|JPG文件(*.jpg)|*.jpg|JPEG文件(*.jpeg)|*.jpeg|GIF文件(*.gif)|*.gif|PNG文件(*.png)|*.png|All Files(*.*)|*.*||";
CFileDialog dlg(true,"*.bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal()==IDOK)
{
UpdateData(true);
m_filename=dlg.GetPathName();
m_pImage=Image::FromFile(m_filename.AllocSysString());
}
else
{
return;
}
//OnPaint();
RedrawWindow();
}
保存图片文件的程序:
void CGDIDlg::OnFileSave()
{
// TODO: Add your command handler code here
if(m_filename=="")
{
AfxMessageBox("请先打开图片");
return;
}
//利用系统的保存对话框
CString filename;
static char szFilter[]="位图文件(*.bmp;*.dib)|*.bmp;*.dib|JPEG文件(*.jpeg;*.jpg)|*.jpeg;*.jpg|GIF文件(*.gif)|*.gif|PNG文件(*.png)|*.png|All Files(*.*)|*.*||";
CFileDialog dlg(true,"*.bmp",NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if(dlg.DoModal()==IDOK)
{
UpdateData(true);
filename=dlg.GetPathName();
}
else
{
return;
}
CLSID encoderClsid;
CString strExt=filename.Right(3);
strExt.MakeLower();
if(strExt==L"png")
{
GetEncoderClsid(L"image/png",&encoderClsid);
}
else if(strExt==L"jpg")
{
GetEncoderClsid(L"image/jpg",&encoderClsid);
}
else if(strExt==L"gif")
{
GetEncoderClsid(L"image/gif",&encoderClsid);
}
else
{
GetEncoderClsid(L"image/bmp",&encoderClsid);
}
Status status=m_pImage->Save(filename.AllocSysString(),&encoderClsid,NULL);
if(status==Ok)
{
AfxMessageBox("保存成功");
}
else
{
AfxMessageBox("保存失败");
}
}
- GDI+数字图像处理初探
- 使用GDI+处理数字图像
- 数字图像和数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 数字图像处理
- 网站风格--大气
- 图像分割和轮廓提取
- How to integrate XBAP application into Java applet container?
- 数字图像的边缘检测
- GDI+开发环境的配置
- GDI+数字图像处理初探
- 获得mac地址的四个方法
- 批处理登陆邮箱代码分析
- 模态对话框和非模态对话框
- Axure RP Pro - jQuery - 如何在Axure RP Pro生成的HTML原型文档中集成jQuery
- 图像的中值滤波
- 图像平移、上下翻转、左右翻转
- 关于很多初学者对于eclipse默认cldc和midp的问题
- SQL Server的链接服务器技术小结