C#給圖片添加右下角斜角文字水印


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

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);

  最終效果如下:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM