期望效果如下:給每張圖片的右下角添加一個文字水印。

1.准備畫布
使用Bitmap加載圖片,並創建畫布。
var img = Bitmap.FromFile("1.png"); var g = Graphics.FromImage(img); //設置畫布平滑性 g.SmoothingMode = SmoothingMode.AntiAlias;
如果不設置g.SmoothingMode,則繪制三角形時,斜邊會出現鋸齒。具體可參考:https://msdn.microsoft.com/zh-cn/library/z714w2y9.aspx
2.填充半透明三角形
首先確定三角邊的長度,此處使用等邊直角三角形,因此取圖片長和寬中較小的一邊的三分之一作為直角邊。
然后開始添加三角形的形狀,使用GraphicsPath記錄連續的直線,位置是從三角形的左下角-->右上角-->右下角直角-->左下角。
最后填充三角形形狀,Color.FromArgb(120, Color.Black)可實現半透明效果,120的值在0-255之間,255為不透明。
//填充半透明三角形 var triggleLeg = (img.Width > img.Height ? img.Height : img.Width) / 3; var path = new GraphicsPath(); path.AddLine(img.Width - triggleLeg, img.Height, img.Width, img.Height - triggleLeg); path.AddLine(img.Width, img.Height - triggleLeg, img.Width, img.Height); path.AddLine(img.Width, img.Height, img.Width - triggleLeg, img.Height); g.FillPath(new SolidBrush(Color.FromArgb(120, Color.Black)), path);
3.旋轉畫布
首先將畫布的坐標原點移動到三角形斜邊的中心,這樣接下來繪制文字時方便控制文字位置。然后將畫布旋轉45度。
//將原點移動到三角形斜邊的中間位置 g.TranslateTransform(img.Width - triggleLeg / 2, img.Height - triggleLeg / 2); //旋轉45度 g.RotateTransform(-45);
如果不是等邊直角三角形,則g.RotateTransform(-45)中的度數需要計算。根據公式 a2+b2=c2,可計算出斜邊長度,然后根據 角度θ=arccos(a/c)可計算出角度。
//Math.Acos返回值是相對PI的值,因此需要轉換為度數 var angle = Math.Acos(a / Math.Sqrt(Math.Pow(a, 2) + Math.Pow(b, 2))) / Math.PI * 180; g.RotateTransform((float)-angle);
4.繪制文字
繪制文字時,為保證文字居中,需要首先測量文字的大小。如果文字較多,長度超過了最大顯示區域,則需要再對文字進行換行處理,這里暫時沒有做。
繪制文字的起點為:0-長度/2,這樣能保證文字居中顯示。
//繪制水印文字 var font = new Font("Microsoft Yahei", 10, FontStyle.Regular); string text = "龍雲是也"; //測量文字長度 var size = g.MeasureString(text, font); //繪制文字時,以文字長度的中間位置為中心,因此繪制的起點為:0-長度/2;並設置高度距離原點半行高 g.DrawString(text, font, Brushes.White, -size.Width / 2, size.Height / 2); size = g.MeasureString(DateTime.Now.ToString("yyyy-MM-dd"), font); g.DrawString(DateTime.Now.ToString("yyyy-MM-dd"), font, Brushes.White, -size.Width / 2, size.Height * 3 / 2);
最終效果如下:

