GDI+初探之图像透明显示和保存



GDI+初探之图像透明显示和保存

GDI+ 的配置                                                                                                     

1.  引入库文件

以MFC 单文档程序为例

新建一个MFC单文档程序,如GdiPlus,在右击项目,选择 属性–> Input–>Additional Dependencies ,在其中添加 gdiplus.lib

2. 包含头文件

在 stdafx.h 中 添加如下语句

 

  1. #include <GdiPlus.h>
  2. using namespace Gdiplus;
#include <GdiPlus.h>
using namespace Gdiplus;

3. 初始化GDI+

 

在使用GDI+之前,要初始化GDI+

在CGdiPlusApp类中添加两个变量

 

  1. GdiplusStartupInput m_GdiplusStartupInput;
  2. ULONG_PTR m_GdiplusToken;
GdiplusStartupInput m_GdiplusStartupInput;
ULONG_PTR m_GdiplusToken;

在InitInstance()函数中添加初始化语句

 

 

  1. GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL);
GdiplusStartup(&m_GdiplusToken,&m_GdiplusStartupInput,NULL);

 

初始化GDI+完成后,就可以使用GDI+中的对象和函数,进行图像处理


4. 关闭GDI+

程序退出时,要关闭GDI+

在ExitInstance()函数中添加关闭语句

 

  1. GdiplusShutdown(m_GdiplusToken);
GdiplusShutdown(m_GdiplusToken);

GDI+的使用

 

可以在CGdi_PlusView的OnDraw()函数中,使用GDI+

下面的代码实现了:

1.  基本图形的绘制

2. 创建新的Bitmap,设置并显示

3. 将一张图片透明化显示

4. 将透明的图片保存到硬盘

 

  1. Graphics graph(pDC->GetSafeHdc());
  2. //————————————–
  3. //绘制基本图形:直线和贝塞尔曲线
  4. Gdiplus::Pen red_pen(Color::Red,10);
  5. red_pen.SetDashStyle(DashStyleDash);
  6. Gdiplus::Point pt1(0,300);
  7. Gdiplus::Point pt2(200,200);
  8. Gdiplus::Point pt3(400,400);
  9. Gdiplus::Point pt4(600,100);
  10. graph.DrawLine(&red_pen,pt1,pt2);
  11. graph.DrawBezier(&red_pen,pt1,pt2,pt3,pt4);
  12. //—————————————
  13. //创建一个bitmap,设置前十行为红色,其他行为半透明绿色,显示
  14. int nWidth = 400;
  15. int nHeight = 400;
  16. BYTE* picData = new BYTE[nWidth*nHeight*4];
  17. memset(picData,0,nWidth*nHeight*4);
  18. Bitmap bm(nWidth,nHeight,nWidth*4,PixelFormat32bppARGB,picData);//创建bitmap
  19. for(int row=0;row<nHeight;++row)
  20. {
  21.     for(int col=0;col<nWidth;++col)
  22.     {
  23.         if(row<10)   //设置前十行红色,不透明
  24.         {
  25.             picData[row*nWidth*4+col*4+2] = 255;    //RedW
  26.             picData[row*nWidth*4+col*4+3] = 255;    //Alpha
  27.         }
  28.         else        //设置其他行为绿色色,半透明
  29.         {
  30.             picData[row*nWidth*4+col*4+1] = 255;    //Green
  31.             picData[row*nWidth*4+col*4+3] = 125;    //Alpha
  32.         }
  33.     }
  34. }
  35. graph.DrawImage(&bm,700,10);
  36. delete[] picData;
  37. //—————————————
  38. //图像色彩处理,设置透明度
  39. Image image(L”1.jpg”);
  40. float alpha =0.1;//原图的10%
  41. ColorMatrix cm = {
  42.     1,0,0,0,0,
  43.     0,1,0,0,0,
  44.     0,0,1,0,0,
  45.     0,0,0,alpha,0,
  46.     0,0,0,0,1};
  47. ImageAttributes imageAttr;
  48. imageAttr.SetColorMatrix(&cm);
  49. int w = image.GetWidth()/3;
  50. int h = image.GetHeight()/3;
  51. Bitmap bm1(w,h);
  52. Rect rect(0,0,w,h);
  53. Graphics g(&bm1);
  54. g.DrawImage(&image,rect,0,0,w,h,UnitPixel,&imageAttr);//将image绘制到bitmap中
  55. graph.DrawImage(&image,0,400,0,0,w,h,UnitPixel);//原始图像,缩放9倍 [左上角(0,400)]
  56. graph.DrawImage(&bm1,w,400);    //透明10%
  57. //————————————–
  58. //图像保存
  59. //获取编码器的CLSID [class id]
  60. UINT num=0;                     //图像编码器的数量
  61. UINT size=0;                    //图像编码器数组的字节数
  62. CLSID encoderClsid;
  63. ImageCodecInfo* pICI=NULL;
  64. GetImageEncodersSize(&num,&size);//获得系统编码器的数量和大小
  65. if(size==0) return;//失败
  66. pICI = (ImageCodecInfo*)(malloc(size)); //编码器
  67. if(pICI==NULL) return;//失败
  68. GetImageEncoders(num,size,pICI);    //获取编码器信息
  69. for(int j=0;j<num;++j)
  70. {
  71.     if(wcscmp(pICI[j].MimeType,L”image/png”)==0)//jpeg bmp gif tiff png
  72.     {
  73.         encoderClsid = pICI[j].Clsid;
  74.     }
  75. }
  76. free(pICI);
  77. bm1.Save(L”tranparentPic.png”,&encoderClsid);//只有png才能保存下来透明信息
	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才能保存下来透明信息

 

 

效果如下:

 

http://blog.csdn.net/jarvischu/article/details/12622837