C++將方形的頭像轉換爲圓形的頭像
好久沒有更新博客了,正好最近有空,整理一下用到的一些知識點,方便以後要再次用到,同時也給需要的人做個參考,歡迎指正!
將方形的頭像轉換成圓形的頭像在很多地方都會用到,網上也有很多的例子,嘗試了很多種方法,但是效果都不怎麼好,有的轉換之後會出現比較明顯的鋸齒,明顯不能符合要求,最終是採用GDI+實現,效果比較明顯;廢話不多說,直接貼代碼:
bool GetCircleImage(CString strSource, CString strTarget)
{
Image image(strSource);
Bitmap b(image.GetWidth(), image.GetHeight());
Graphics g(&b);
g.SetSmoothingMode(Gdiplus::SmoothingModeHighQuality);
GraphicsPath p(FillModeAlternate);
p.AddEllipse(0, 0, image.GetWidth(), image.GetHeight());
g.FillPath(&TextureBrush(&image), &p);
//獲取編碼器的CLSID [class id]
UINT num = 0; //圖像編碼器的數量
UINT size = 0; //圖像編碼器數組的字節數
CLSID encoderClsid;
ImageCodecInfo* pICI = NULL;
GetImageEncodersSize(&num, &size);//獲得系統編碼器的數量和大小
if (size == 0) return false;//失敗
pICI = (ImageCodecInfo*)(malloc(size)); //編碼器
if (pICI == NULL) return false;//失敗
GetImageEncoders(num, size, pICI); //獲取編碼器信息
for (UINT 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);
Status s = b.Save(strTarget, &encoderClsid);//只有png才能保存下來透明信息
return true;
}
下面是轉換前後的對比圖:
C++將方形的頭像轉換爲圓形的頭像
圖1 轉換前(方形)
C++將方形的頭像轉換爲圓形的頭像
圖2 轉換後(圓形)