CImage 类及其常用成员函数用法详解 二

CImage类图像显示函数应用示例

在CImage 类及其常用成员函数用法详解一的示例中使用了BitBlt()成员函数来显示图像,其代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

下面继续演示其它用于图像显示的成员函数的用法 。

AlphaBlend的用法示例

修改图像显示代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,然后点击加载图像,如下:

加载图像后,点击显示图像,结果如下:

显示图像为不透明。修改代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);
		mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载同一张图片,显示结果如下:

 图像变为半透明。AlphaBlend还有另外3个重载函数。

下面用另一个函数来显示图像,代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,显示同一张图像的结果如下:

 下面换另一个函数来显示图像,代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,显示同一张图像的结果如下:

图像放大了一倍。下面换另一个函数来显示图像,代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,显示同一张图像的结果如下:

         MaskBlt()成员函数的使用示例

        修改图像显示代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载图像,如下:

点击显示图像,结果如下:

修改代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载同一张图像,点击,显示图像,结果如下: 

说明该函数也可以用于正常显示图像。MaskBlt有几个重载函数,下面逐一演示一下,修改代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));

	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载图像:

显示图像,结果如下:

再修改代码,如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);

	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

 试运行,加载图像:

显示图像,如下:

再修改代码,如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载图像:

显示图像,结果如下:

        PlgBlt()函数的用法示例

        修改图像显示代码,代码如下 :

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		//mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

		//PlgBlt
		CPoint point[3];
		point[0] = CPoint(0, 0);
		point[1] = CPoint(mImage.GetWidth(),0);
		point[2] = CPoint(0, mImage.GetHeight());
		mImage.PlgBlt(dc.GetSafeHdc(), point);

	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

 试运行,加载图像:

显示图像,结果如下:

PlgBlt()函数,有几个重载函数,下面列出其示例代码

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		//mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

		//PlgBlt
		CPoint point[3];
		point[0] = CPoint(0, 0);
		point[1] = CPoint(mImage.GetWidth(),0);
		point[2] = CPoint(0, mImage.GetHeight());
		//mImage.PlgBlt(dc.GetSafeHdc(), point);
		//mImage.PlgBlt(dc.GetSafeHdc(), point,0,0, mImage.GetWidth(), mImage.GetHeight());
		mImage.PlgBlt(dc.GetSafeHdc(), point, CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()));

	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

        StretchBlt ()函数用法示例

        StretchBlt ()函数有几个重载函数,这里列出其示例代码,先注释起来,留一个做调试演示,代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		//mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

		//PlgBlt
		CPoint point[3];
		point[0] = CPoint(0, 0);
		point[1] = CPoint(mImage.GetWidth(),0);
		point[2] = CPoint(0, mImage.GetHeight());
		//mImage.PlgBlt(dc.GetSafeHdc(), point);
		//mImage.PlgBlt(dc.GetSafeHdc(), point,0,0, mImage.GetWidth(), mImage.GetHeight());
		//mImage.PlgBlt(dc.GetSafeHdc(), point, CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()));

		//StretchBlt
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth()*2, mImage.GetHeight()*2);
		//mImage.StretchBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2));
		mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth()* 2, mImage.GetHeight() * 2,0, 0, mImage.GetWidth() , mImage.GetHeight());
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载图像:

 显示图像,结果如下:

 TransparentBlt()函数示例

修改图像显示代码,代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		//mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

		//PlgBlt
		/*
		CPoint point[3];
		point[0] = CPoint(0, 0);
		point[1] = CPoint(mImage.GetWidth(),0);
		point[2] = CPoint(0, mImage.GetHeight());
		*/
		//mImage.PlgBlt(dc.GetSafeHdc(), point);
		//mImage.PlgBlt(dc.GetSafeHdc(), point,0,0, mImage.GetWidth(), mImage.GetHeight());
		//mImage.PlgBlt(dc.GetSafeHdc(), point, CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()));

		//StretchBlt
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth()*2, mImage.GetHeight()*2);
		//mImage.StretchBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2));
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth() * 2, mImage.GetHeight() * 2,0, 0, mImage.GetWidth(), mImage.GetHeight());

		//TransparentBlt
		mImage.TransparentBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2, 0x000000);//将黑色设为透明色
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载图像:

显示图像,结果如下:

 TransparentBlt()函数有几个重载函数,下面列出其用法示例代码,就不再做演示,代码如下: 

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		//mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

		//PlgBlt
		/*
		CPoint point[3];
		point[0] = CPoint(0, 0);
		point[1] = CPoint(mImage.GetWidth(),0);
		point[2] = CPoint(0, mImage.GetHeight());
		*/
		//mImage.PlgBlt(dc.GetSafeHdc(), point);
		//mImage.PlgBlt(dc.GetSafeHdc(), point,0,0, mImage.GetWidth(), mImage.GetHeight());
		//mImage.PlgBlt(dc.GetSafeHdc(), point, CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()));

		//StretchBlt
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth()*2, mImage.GetHeight()*2);
		//mImage.StretchBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2));
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth() * 2, mImage.GetHeight() * 2,0, 0, mImage.GetWidth(), mImage.GetHeight());

		//TransparentBlt
		//mImage.TransparentBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2, 0x000000);//将黑色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2),0xFFFFFF);//将白色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0, mImage.GetWidth(), mImage.GetHeight(),0x000000);//将黑色设为透明色
		mImage.TransparentBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x000000);//将黑色设为透明色
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

         Draw()函数实例

Draw()函数有多个重载函数,这里将其用法示例代码都写出来,然后注释掉,只演示测试试后一个重载函数用法。代码如下:

void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	Invalidate();
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		//mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

		//PlgBlt
		/*
		CPoint point[3];
		point[0] = CPoint(0, 0);
		point[1] = CPoint(mImage.GetWidth(),0);
		point[2] = CPoint(0, mImage.GetHeight());
		*/
		//mImage.PlgBlt(dc.GetSafeHdc(), point);
		//mImage.PlgBlt(dc.GetSafeHdc(), point,0,0, mImage.GetWidth(), mImage.GetHeight());
		//mImage.PlgBlt(dc.GetSafeHdc(), point, CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()));

		//StretchBlt
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth()*2, mImage.GetHeight()*2);
		//mImage.StretchBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2));
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth() * 2, mImage.GetHeight() * 2,0, 0, mImage.GetWidth(), mImage.GetHeight());

		//TransparentBlt
		//mImage.TransparentBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2, 0x000000);//将黑色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2),0xFFFFFF);//将白色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0, mImage.GetWidth(), mImage.GetHeight(),0x000000);//将黑色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x000000);//将黑色设为透明色

		//void CCImageTest1Dlg::OnBnClickedDisplayImage()
{
	// TODO: 在此添加控件通知处理程序代码
	OnPaint();
	
	if (!mImage.IsNull())
	{
		CClientDC dc(this);
		//BitBlt
		//mImage.BitBlt(dc.GetSafeHdc(), 20, 20, SRCCOPY);
		
		// AlphaBlend
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0xFF);//不透明,图像最清晰
		//mImage.AlphaBlend(dc.GetSafeHdc(), 20, 20, 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CPoint(20, 20), 0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(),20,20,mImage.GetWidth()*2, mImage.GetHeight()*2,0,0, mImage.GetWidth(), mImage.GetHeight(),0x80);
		//mImage.AlphaBlend(dc.GetSafeHdc(), CRect(20, 20, mImage.GetWidth() * 2, mImage.GetHeight() * 2), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x80);

		//MaskBlt
		/*
		CImage mskImage;
		HBITMAP hbmMask;
		mskImage.Load(L"c.jpeg");
		if (mskImage.IsNull())
			MessageBox(L"Mask image load failed!");
		hbmMask = (HBITMAP)mskImage.Detach();
		mImage.MaskBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth(), mImage.GetHeight(),0,0, hbmMask,0,0,0);
		*/
		//mImage.MaskBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0,NULL, 0, 0);
		//mImage.MaskBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CPoint(0, 0), NULL, CPoint(0, 0));
		//mImage.MaskBlt(dc.GetSafeHdc(), 0,0, NULL);
		//mImage.MaskBlt(dc.GetSafeHdc(), CPoint(0, 0), NULL);

		//PlgBlt
		/*
		CPoint point[3];
		point[0] = CPoint(0, 0);
		point[1] = CPoint(mImage.GetWidth(),0);
		point[2] = CPoint(0, mImage.GetHeight());
		*/
		//mImage.PlgBlt(dc.GetSafeHdc(), point);
		//mImage.PlgBlt(dc.GetSafeHdc(), point,0,0, mImage.GetWidth(), mImage.GetHeight());
		//mImage.PlgBlt(dc.GetSafeHdc(), point, CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()));

		//StretchBlt
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth()*2, mImage.GetHeight()*2);
		//mImage.StretchBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2));
		//mImage.StretchBlt(dc.GetSafeHdc(), 0,0, mImage.GetWidth() * 2, mImage.GetHeight() * 2,0, 0, mImage.GetWidth(), mImage.GetHeight());

		//TransparentBlt
		//mImage.TransparentBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2, 0x000000);//将黑色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2),0xFFFFFF);//将白色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), 0, 0, mImage.GetWidth(), mImage.GetHeight(), 0, 0, mImage.GetWidth(), mImage.GetHeight(),0x000000);//将黑色设为透明色
		//mImage.TransparentBlt(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), 0x000000);//将黑色设为透明色

		//Draw
		//mImage.Draw(dc.GetSafeHdc(), 0, 0, mImage.GetWidth()* 2, mImage.GetHeight()*2, 0, 0, mImage.GetWidth(), mImage.GetHeight());//将图像放大两倍显示
		//mImage.Draw(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth(), mImage.GetHeight()), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2));//将图像缩小为原来的一半倍显示
		//mImage.Draw(dc.GetSafeHdc(), 100, 100);//将100,100点作为显示图像的左上角位置
		//mImage.Draw(dc.GetSafeHdc(), CPoint(100, 100));//将100,100点作为显示图像的左上角位置
		//mImage.Draw(dc.GetSafeHdc(), 0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2);//将图像放大两倍显示
		mImage.Draw(dc.GetSafeHdc(), CRect(0, 0, mImage.GetWidth() * 2, mImage.GetHeight() * 2));//将图像放大两倍显示

	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}
	}
	else
	{
		MessageBox(L"还没加载图像!");
	}

}

试运行,加载图像:

显示图像,结果如下:

与图像数据操作相关的方法

获取图像的高度与宽度

       获取图像高度与宽度分别用到GetHeight,GetWidth方法。

       GetHeight 检索图像的高度(以像素为单位)。其原型如下:

       int GetHeight() const throw();

       返回值:图像的高度(以像素为单位)。

       GetWidth 检索图像的宽度(以像素为单位)。其原型如下:

       int GetWidth() const throw();

       返回值:位图的宽度(以像素为单位)。

       GetBits 检索指向位图中给定像素的实际位值的指针。其原型如下:

       void* GetBits() throw();

       返回值:指向位图缓冲区的指针。 如果位图是自下而上的 DIB,则指针指向缓冲区末端附近。 如果位图是自上而下的 DIB,则指针指向缓冲区的第一个字节。用此指针以及 GetPitch 返回的值,可以在图像中查找和更改各个像素。

       GetBPP 检索每像素位数的值。其原型如下:

       int GetBPP() const throw();

       返回值:每像素位数。此值确定定义每个像素的位数以及位图中颜色的最大数量。每像素位数通常为 1、4、8、16、24 或 32。

       GetColorTable 从 DIB 节调色板的条目范围检索红、绿、蓝 (RGB) 颜色值。其原型如下:

       void GetColorTable(

UINT iFirstColor,

UINT nColors,

RGBQUAD* prgbColors) const throw();

       参数:

              iFirstColor 要检索的第一个条目的颜色表索引。

              nColors 要检索的颜色表条目数。

              prgbColors 指向 RGBQUAD 结构数组的指针,用于检索颜色表条目。

       GetDC 检索当前已选择图像的设备上下文。其原型如下:

       HDC GetDC() const throw();

       返回值:设备上下文的句柄。

       GetMaxColorTableEntries 检索颜色表中的最大条目数。其原型如下:

       int GetMaxColorTableEntries() const throw();

       返回值:颜色表中的条目数。此方法仅支持 DIB 节位图。

       GetPitch 检索图像的间距。其原型如下:

       int GetPitch() const throw();

       返回值:图像的间距。 如果返回值为负数,则位图为自下而上的 DIB,其原点为左下角。 如果返回值为正数,则位图为自上而下的 DIB,其原点为左上角。间距是两个内存地址之间的距离(以字节为单位),这两个地址分别表示一个位图行开头和下一个位图行开头。 由于间距度量以字节为单位,因此图像的间距有助于确定像素格式。 间距还可以包含为位图保留的额外内存。将GetPitch 与 GetBits 结合使用查找图像的各个像素。

       GetPixel 检索x 和y指定的位置的像素颜色。其原型如下:

       COLORREF GetPixel(int x, int y) const throw();

       参数:

              X 像素的 x 坐标。

              Y 像素的 y 坐标。

       返回值:像素的红、绿、蓝 (RGB) 值。 如果像素位于当前剪切区域之外,则返回值为

CLR_INVALID 。

       GetPixelAddress 检索像素的确切地址。其原型如下:

       void* GetPixelAddress(int x, int y) throw();

       参数:

              X 像素的 x 坐标。

              Y 像素的 y 坐标。

       该地址根据像素的坐标、位图的间距以及每像素位数确定。对于每像素少于 8 位的格式,此方法返回包含像素的字节的地址。 例如,如果图像格式每像素有 4 位,则  GetPixelAddress 返回字节中第一个像素的地址,并且必须计算每字节2 像素。此方法仅支持 DIB 节位图。

       GetTransparentColor 检索调色板中透明颜色的索引位置。其原型如下:

       LONG GetTransparentColor() const throw();

       返回值:透明颜色的索引。

       SetPixel 设置位图中给定位置像素的颜色。其原型如下:

       void SetPixel(int x, int y, COLORREF color) throw();

       参数:

              X 要设置的像素的水平位置。

              Y 要设置的像素的垂直位置。

              Color 设置像素的颜色。

       注意:如果像素坐标位于所选剪切区域之外,此方法将失败。

       SetPixelIndexed   将像素颜色设置为位于调色板中iIndex的颜色。其原型如下:

       void SetPixelIndexed(int x, int y, int iIndex) throw();

       参数:

              X 要设置的像素的水平位置。

              Y 要设置的像素的垂直位置。

              iIndex 调色板中颜色的索引。

       SetPixelRGB 将x和y指定位置的像素设置为r 、g 和b所表示的颜色,采用红、绿、蓝 (RGB) 图像。其原型如下:

       void SetPixelRGB(

int x,

int y,

BYTE r,

BYTE g,

BYTE b) throw();

       参数:

              x 要设置的像素的水平位置。

              y 要设置的像素的垂直位置。

              r 红色的强度。

              g 绿色的强度。

              b 蓝色的强度。

       SetTransparentColor 将给定索引位置的颜色设置为透明。其原型如下:

       LONG SetTransparentColor(LONG iTransparentColor) throw();

       参数:

iTransparentColor 在调色板中,要设置为透明的颜色的索引。 如果为 -1,则不会将颜色设置为透明。

       返回值: 先前设置为透明的颜色的索引。

       IsDIBSection 确定附加位图是否为DIB节。其原型如下:

       bool IsDIBSection() const throw();

       返回值:如果附加位图是DIB节,则返回TRUE 。 否则为FALSE 。

       如果位图不是 DIB 节,则不能使用以下 CImage 方法,该方法仅支持 DIB 节位图:GetBits、GetColorTable、GetMaxColorTableEntries、GetPitch、GetPiexlAddress、IsIndexed、SetColorTable。

       IsIndexed 确定位图的像素是否映射到调色板。其原型如下:

bool IsIndexed() const throw();

返回值:如已索引,则返回TRUE ;否则返回FALSE。仅当位图是 8 位(256 种颜色)或更少时,此方法才会返回TRUE 。

        与图像像素操作相关的常用函数已在前面的示例中用过,未用到的都是不常用的函数,这里就不再用实例演示了。

图像存储

使用CImage类可以轻松实现图像存储,且可存储为CImage类所支持的其他格式。图像存储的函数为Save。其原型如下:

HRESULT Save(

IStream* pStream,

REFGUID guidFileType) const throw();

       HRESULT Save(

LPCTSTR pszFileName,

REFGUID guidFileType = GUID_NULL) const throw();

       参数:

              pStream 指向包含文件图像数据的 COM IStream 对象的指针。

              pszFileName 指向图像文件名的指针。

              guidFileType 保存图像的文件类型。可以是以下值之一:

                     ImageFormatBMP 未压缩的位图图像。

                     ImageFormatPNG 可移植网络图形格式 (PNG) 压缩图像。

                     ImageFormatJPEG JPEG 压缩图像。

                     ImageFormatGIF GIF 压缩图像。

       返回值:一个标准  HRESULT 。调用此函数以使用指定的名称和类型保存图像。 如果未包含  guidFileType 参数,则文件名的文件扩展名将用于确定图像格式。 如果未提供扩展名,则图像将以 BMP 格式保存

       图像存储示例

        为对话框的保存图像按钮添加事件响应函数,代码如下:

void CCImageTest1Dlg::OnBnClickedSave()
{
	// TODO: 在此添加控件通知处理程序代码
	if (mImage.IsNull())
	{
		MessageBox(L"图像对象为空,没有图像可存储");
	}
	else
	{
		CString m_Path, m_strEx, m_strName;
		CFileDialog fdlg(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All files(*.*)|*.*||"));
		if (fdlg.DoModal() == IDOK)
		{
			m_Path = fdlg.GetPathName();
			m_strEx = fdlg.GetFileExt();
			m_strName = fdlg.GetFileName();

			m_Path.ReleaseBuffer();
			m_strEx.ReleaseBuffer();
			m_strName.ReleaseBuffer();
		}
		if (m_strEx == "BMP" || m_strEx == "bmp" || m_strEx == "TIFF" || m_strEx == "tiff" || m_strEx == "PNG" || m_strEx == "png" || m_strEx == "jpeg" || m_strEx == "JPEG")
		{
			mImage.Save(m_Path);
		}
		else if (m_strEx == "")
		{
			m_Path += ".bmp";
			mImage.Save(m_Path);
		}
	}

}

试运行,加载图像:

显示图像:

保存图像,输入文件名a1

 然后点击保存。

再点击加载图像,可看到在上次加载图像的文件夹中多了一个a1.bmp文件,说明图像保存成功。

分离附加在CImage对象上的位图

       实现分离附加在CImage对象上的方法有Destroy与Detach。

       Destroy 从CImage 对象中分离位图并销毁位图。其原型如下:

       void Destroy() throw();

       Detach 从CImage 对象中分离位图。其原型如下:

       HBITMAP Detach() throw();

       返回值:分离位图的句柄,如果无附加位图,则为NULL 。                     

获取当前已选择图像的DC(设备上下文)及释放DC及资源

       GetDC 检索当前已选择图像的设备上下文。其原型如下:

       HDC GetDC() const throw();

       返回值:设备上下文的句柄。对于GetDC的每次调用,必须后续调用ReleaseDC。

       ReleaseDC 释放设备上下文。其原型如下:

void ReleaseDC() const throw();

       因为一次只能在设备上下文中选择一个位图,所以每次调用 GetDC 时都必须调用

ReleaseDC 。

       ReleaseGDIPlus 释放由GDI+占用的资源。其原型如下:

       void ReleaseGDIPlus() throw();

    如果GDI+有用到Cimage对象位图资源,必须调用此方法以释放由全局CImage对象分配的资源。

        CImage类及成员函数用法详解就介绍到这里。实例源码(基于VS2022),已上传到CSDN,链接为:https://download.csdn.net/download/billliu66/89165102

  • 27
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Bill66

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值