首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

GDI+ 實現高質量文字陰影特效(反走樣+雙三次插值)

     編輯:關於VC++

效果原理

傳統文字陰影只是偏移繪製不同顏色文字,效果生硬。本文利用 GDI+ 的 反走樣 與 高質量雙三次插值 實現真實的軟陰影/半陰影效果:

  1. 創建 1/4 大小的內存位圖
  2. 用縮放矩陣繪製微小文字(含偏移模擬陰影位移)
  3. 開啟反走樣,使用 50% 透明黑色畫刷繪製
  4. 將小位圖放大 4 倍繪製到目標 DC,插值模式設置為 InterpolationModeHighQualityBicubic
  5. 最後在原位置繪製正常文字(白色/主色)

完整實現代碼

void CDropShadowEffectTextView::OnDraw(CDC* pDC) {
    using namespace Gdiplus;
    
    CDropShadowEffectTextDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc) return;
    
    CRect ClientRect;
    GetClientRect(&ClientRect);
    CSize ClientSize(ClientRect.Width(), ClientRect.Height());
    RectF theRect(ClientRect.left, ClientRect.top, ClientRect.Width(), ClientRect.Height());
    PointF textPos(10, ClientSize.cy / 3);
    
    CStringW text(L"文字陰影特效");
    FontFamily fontFamily(L"Times New Roman");
    Font font(&fontFamily, 100, FontStyleBold, UnitPixel);
    
    Graphics g(pDC->m_hDC);
    
    // 背景漸變
    LinearGradientBrush b(theRect, Color::Blue, Color::AliceBlue, 90.0f);
    g.FillRectangle(&b, theRect);
    
    // 1. 創建 1/4 大小的內存位圖
    Bitmap bm(ClientSize.cx / 4, ClientSize.cy / 4, &g);
    Graphics* bmpg = Graphics::FromImage(&bm);
    
    // 2. 設置反走樣渲染
    bmpg->SetTextRenderingHint(TextRenderingHintAntiAlias);
    
    // 3. 縮放矩陣:縮小 4 倍 + 偏移 (3,3) 模擬陰影位移
    Matrix mx(0.25f, 0, 0, 0.25f, 3, 3);
    bmpg->SetTransform(&mx);
    
    // 4. 繪製陰影文字(50% 透明黑)
    bmpg->DrawString(text, -1, &font, textPos, NULL, &SolidBrush(Color(128, 0, 0, 0)));
    
    // 5. 目標 DC 設置高質量雙三次插值
    g.SetInterpolationMode(InterpolationModeHighQualityBicubic);
    g.SetTextRenderingHint(TextRenderingHintAntiAlias);
    
    // 6. 放大繪製小位圖 → 產生模糊邊緣的軟陰影
    g.DrawImage(&bm, theRect, 0, 0, bm.GetWidth(), bm.GetHeight(), UnitPixel);
    
    // 7. 最後繪製正常文字
    g.DrawString(text, -1, &font, textPos, NULL, &SolidBrush(Color::White));
}

關鍵技術點解析

技術點作用參數說明
縮小繪製將文字光柵化為低分辨率Matrix(0.25, 0, 0, 0.25, 3, 3) 縮放 0.25x + 位移 3px
反走樣生成帶 alpha 通道的平滑邊緣TextRenderingHintAntiAlias
半透明畫刷模擬陰影透明度Color(128, 0, 0, 0) = 50% alpha 黑色
雙三次插值放大將鋸齒邊緣平滑為漸變陰影InterpolationModeHighQualityBicubic
疊加繪製陰影在下、文字在上先 DrawImage 再 DrawString

效果對比

文字陰影特效演示

左側為普通文字,右側為帶軟陰影效果。JPEG 壓縮導致效果輕微損失,實際運行效果更佳。

擴展應用場景

  • UI 控件美化:按鈕、標籤、標題欄文字陰影增強可讀性
  • 水印生成:半透明文字疊加在圖片上
  • 遊戲 UI:傷害數字、浮動提示的陰影描邊
  • 報表打印:標題行陰影效果提升專業感

性能優化建議

  1. 緩存位圖:相同文字/字體/大小複用陰影位圖,避免每幀重算
  2. 適度縮放比例:1/4 是平衡點,過小失真,過大失去模糊效果
  3. 避免頻繁創建 Font/Brush:提升為成員變量複用
  4. 考慮 DirectWrite:現代應用可遷移至 DirectWrite + Direct2D 獲得更好性能與功能

總結

此技巧巧妙利用了 GDI+ 的矩陣變換、反走樣光柵化、高質量插值三大特性,以極少代碼實現了媲美專業圖形軟件的文字軟陰影效果。適用於 VC6+GDI+ 到現代 MSVC 所有版本,是 GDI+ 程式設計的經典範例。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved