GDI+ 的配置
1. 引入库文件
以MFC 单文档程序为例
新建一个MFC单文档程序,如GdiPlus,在右击项目,选择 属性--> Input-->Additional Dependencies ,在其中添加 gdiplus.lib
2. 包含头文件
在 stdafx.h 中 添加如下语句
#include <GdiPlus.h> using namespace Gdiplus;3. 初始化GDI+
在使用GDI+之前,要初始化GDI+
在CGdiPlusApp类中添加两个变量
GdiplusStartupInput m_GdiplusStartupInput; ULONG_PTR m_GdiplusToken;在InitInstance()函数中添加初始化语句
GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL);
初始化GDI+完成后,就可以使用GDI+中的对象和函数,进行图像处理
4. 关闭GDI+程序退出时,要关闭GDI+
在ExitInstance()函数中添加关闭语句
GdiplusShutdown(m_GdiplusToken);
可以在CGdi_PlusView的OnDraw()函数中,使用GDI+
下面的代码实现了:
1. 基本图形的绘制
2. 创建新的Bitmap,设置并显示
3. 将一张图片透明化显示
4. 将透明的图片保存到硬盘
Graphics graph(pDC->GetSafeHdc()); //-------------------------------------- //绘制基本图形:直线和贝塞尔曲线 Gdiplus::Pen red_pen(Color::Red,10); red_pen.SetDashStyle(DashStyleDash); Gdiplus::Point pt1(0,300); Gdiplus::Point pt2(200,200); Gdiplus::Point pt3(400,400); Gdiplus::Point pt4(600,100); graph.DrawLine(&red_pen,pt1,pt2); graph.DrawBezier(&red_pen,pt1,pt2,pt3,pt4); //--------------------------------------- //创建一个bitmap,设置前十行为红色,其他行为半透明绿色,显示 int nWidth = 400; int nHeight = 400; BYTE* picData = new BYTE[nWidth*nHeight*4]; memset(picData,0,nWidth*nHeight*4); Bitmap bm(nWidth,nHeight,nWidth*4,PixelFormat32bppARGB,picData);//创建bitmap for(int row=0;row<nHeight;++row) { for(int col=0;col<nWidth;++col) { if(row<10) //设置前十行红色,不透明 { picData[row*nWidth*4+col*4+2] = 255; //RedW picData[row*nWidth*4+col*4+3] = 255; //Alpha } else //设置其他行为绿色色,半透明 { picData[row*nWidth*4+col*4+1] = 255; //Green picData[row*nWidth*4+col*4+3] = 125; //Alpha } } } graph.DrawImage(&bm,700,10); delete[] picData; //--------------------------------------- //图像色彩处理,设置透明度 Image image(L"1.jpg"); float alpha =0.1;//原图的10% ColorMatrix cm = { 1,0,0,0,0, 0,1,0,0,0, 0,0,1,0,0, 0,0,0,alpha,0, 0,0,0,0,1}; ImageAttributes imageAttr; imageAttr.SetColorMatrix(&cm); int w = image.GetWidth()/3; int h = image.GetHeight()/3; Bitmap bm1(w,h); Rect rect(0,0,w,h); Graphics g(&bm1); g.DrawImage(&image,rect,0,0,w,h,UnitPixel,&imageAttr);//将image绘制到bitmap中 graph.DrawImage(&image,0,400,0,0,w,h,UnitPixel);//原始图像,缩放9倍 [左上角(0,400)] graph.DrawImage(&bm1,w,400); //透明10% //-------------------------------------- //图像保存 //获取编码器的CLSID [class id] UINT num=0; //图像编码器的数量 UINT size=0; //图像编码器数组的字节数 CLSID encoderClsid; ImageCodecInfo* pICI=NULL; GetImageEncodersSize(&num,&size);//获得系统编码器的数量和大小 if(size==0) return;//失败 pICI = (ImageCodecInfo*)(malloc(size)); //编码器 if(pICI==NULL) return;//失败 GetImageEncoders(num,size,pICI); //获取编码器信息 for(int j=0;j<num;++j) { if(wcscmp(pICI[j].MimeType,L"image/png")==0)//jpeg bmp gif tiff png { encoderClsid = pICI[j].Clsid; } } free(pICI); bm1.Save(L"tranparentPic.png",&encoderClsid);//只有png才能保存下来透明信息