怎么将一个正方形图片裁剪成圆形呢

如何将一个正方形图片裁剪成圆形呢?
大家好。对图像处理不太了解,但是目前需要做这个功能,无奈只好发帖求助大家。正方形的图片,希望裁剪成圆形的图片,正方形的边长作为圆形的直径,大家应该明白我的意思了吧。
多谢。
------解决思路----------------------
1.GDIPlus载入原图片
2.新建一个GDIPlus::Bitmap对象,指定宽度、高度
3.基于Bitmap创建一个GDIPlus::Graphics对象
4.创建一个GDIPlus::Region对象,可以设置为圆形(用在第5步)
5.调用GDIPlus::Graphics的Clip方法,设置剪切区域
6.画出原图片
7.新的Bitmap保存到内存或文件(GDIPlus::Bitmap::Save)
------解决思路----------------------
Clipping with a Region 

--------------------------------------------------------------------------------

One of the properties of the Graphics class is the clipping region. All drawing done by a given Graphics object is restricted to the clipping region of that Graphics object. You can set the clipping region by calling the SetClip method.

The following example constructs a path that consists of a single polygon. Then the code constructs a region based on that path. The address of the region is passed to the SetClip method of a Graphics object, and then two strings are drawn. 

Hide Example

// Create a path that consists of a single polygon.
Point polyPoints[] = {Point(10, 10), Point(150, 10), 
   Point(100, 75), Point(100, 150)};
GraphicsPath path;
path.AddPolygon(polyPoints, 4);
// Construct a region based on the path.
Region region(&path);
// Draw the outline of the region.
Pen pen(Color(255, 0, 0, 0));
graphics.DrawPath(&pen, &path);
// Set the clipping region of the Graphics object.
graphics.SetClip(&region);
// Draw some clipped strings.
FontFamily fontFamily(L"Arial");
Font font(&fontFamily, 36, FontStyleBold, UnitPixel);
SolidBrush solidBrush(Color(255, 255, 0, 0));
graphics.DrawString(L"A Clipping Region", 20, &font, 
   PointF(15, 25), &solidBrush);
graphics.DrawString(L"A Clipping Region", 20, &font, 
   PointF(15, 68), &solidBrush);
The following illustration shows the clipped strings.






--------------------------------------------------------------------------------

------解决思路----------------------
试了一下还真的可以,这是代码:
	CImage a;
a.Load("C:\\Documents and Settings\\All Users\\Documents\\My Pictures\\示例图片\\Winter.jpg");

int w = a.GetWidth();
int h = a.GetHeight();

CImage b;
b.Create(w,h,24,0);

HDC dc0 = a.GetDC();
HDC dc1 = b.GetDC();

HRGN hGn = ::CreateEllipticRgn(0, 0 ,w,h);
int nm = ::SelectClipRgn(dc1,hGn);

::BitBlt(dc1,0,0,w,h,dc0,0,0,SRCCOPY);

::SelectClipRgn(dc1,NULL);//恢复----将整个dc的全部区域作为绘制区域
::DeleteObject(hGn);

b.Save("C:\\Documents and Settings\\All Users\\Documents\\My Pictures\\示例图片\\0.png");
a.ReleaseDC();
b.ReleaseDC();