c#如何使用GDI +实现添加中心旋转(任意角度)的文字

  介绍

这篇文章主要介绍了c#如何使用GDI +实现添加中心旋转(任意角度)的文字,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获、下面让小编带着大家一起了解一下。

<强>需求

需求是要实现给图片添加任意角度旋转的文字,文字的旋转中心要是在文字区域中央,就像CSS的旋转函数一样的效果。如下:

 C #如何使用GDI +实现添加中心旋转(任意角度)的文字”>,</p> <p> <强>分析,思路</强> </p> <p>图形类有个RotateTransform方法,可以传入任意角度的值来旋转画板。但是这个方法的旋转中心是画板的左上角,所以直接单单用这个方法不能满足我们的需求。此外,图形类还有个TranslateTransform方法可以改变坐标的原点,而且这个方法是沿着矩形的x, y轴平移的,即就算图片旋转了一定的角度后,再调用TranslateTransform方法,它还是沿着x, y轴平移。于是通过以下三个步骤即可实现图片中心旋转。</p> <ol类= <李>

把画板(图形对象)原点平移到矩形中心位置(x, y)

<李>

在(x, y)位置绕原点旋转画板N度

<李>

画板退回(- x - y)的距离

还是看不懂的同学看下面的图应该就明白了

 C #如何使用GDI +实现添加中心旋转(任意角度)的文字”>,</p> <p>明白了原理,那不容易推断出,如果要旋转的中心不是图片中心而是文字中心,那步骤还是一样的,只是把(x, y)改为文字中心的坐标就好了。</p> <p>除了上面说的方法,其实还有一个方法可以实现中心旋转,那就是使用矩阵类。矩阵类的RotateAt方法可以指定矩阵旋转的中心位置。</p> <pre类=//,//摘要:   ,//,沿,point 参数中指定的点并通过预先计算该旋转,来顺时针旋转此,System.Drawing.Drawing2D.Matrix。   ,//,//参数:   ,//角度:   ,//,旋转角度(范围)(单位:度)。   ,//,//://大敌;,一个,System.Drawing.PointF,表示旋转中心。   ,[TargetedPatchingOptOut (“Performance  critical 用inline 却;能够type  of  method  across  NGen  image  boundaries"))   ,public  void  RotateAt (float 角,,PointF 点),

图形类属的变换性返回的就是矩阵对象,该属性可以,集。因此我们先获取原来的画板的矩阵,然后使用RotateAt方法旋转该矩阵,再把旋转后的矩阵赋值给画板就好了。

<强>具体实现

<强>添加任意角度文字方法

///, & lt; summary>///,图片添加任意角度文字(文字旋转是中心旋转,角度顺时针为正)///,& lt;/summary>///,& lt; param  name=癷mgPath"在图片路径& lt;/param>///,& lt; param  name=發ocationLeftTop"在文字左上角定位(x1, y1) & lt;/param>///,& lt; param  name=癴ontSize"在字体大小,单位为像素& lt;/param>///,& lt; param  name=皌ext"在文字内容& lt;/param>///,& lt; param  name=癮ngle"在文字旋转角度& lt;/param>///,& lt; param  name=癴ontName"在字体名称& lt;/param>///,& lt; returns>添加文字后的位图对象& lt;/returns>   public  Bitmap  AddText (string  imgPath, string  locationLeftTop,, int 字形大小,,string 文本,int  angle =, 0,, string  fontName =,“华文行楷“)   {   ,Image  img =, Image.FromFile (imgPath);   ,int  width =, img.Width;   ,int  height =, img.Height;   ,Bitmap  bmp =, new 位图(宽度,高度);   ,Graphics  Graphics =, Graphics.FromImage (bmp);   ,//画底图   ,graphics.DrawImage (img, 0, 0,,宽度,高度);   ,Font  Font =, new 字体(字体名,字形大小,,GraphicsUnit.Pixel);   ,SizeF  sf =, graphics.MeasureString(文本,字体);,//,计算出来文字所占矩形区域   ,//左上角定位   ,string[]的位置=,locationLeftTop.Split (& # 39; & # 39;);   ,float  x1 =, float.Parse(位置[0]);   ,float  y1 =, float.Parse(位置[1]);   ,//进行文字旋转的角度定位   ,if  (angle  !=, 0)   ,{   # region 才能法一:TranslateTransform平移,+,RotateTransform旋转/*,才能   ,,*,注意:   ,,*,Graphics.RotateTransform的旋转是以图形对象的左上角为原点,旋转整个画板的。   ,,*,同时x, y坐标轴也会跟着旋转。即旋转后的x, y轴依然与矩形的边平行   ,,*,而Graphics.TranslateTransform方法,是沿着x, y轴平移的   ,,*,因此分三步可以实现中心旋转   ,,*,1。把画板(图形对象)平移到旋转中心   ,,*,2。旋转画板   ,,*,3。把画板平移退回相同的距离(此时的x, y轴仍然是与旋转后的矩形平行的)   ,,*/////,才能把画板的原点(默认是左上角)定位移到文字中心//graphics.TranslateTransform才能(x1  +, sf.Width /, 2, y1  +, sf.Height /, 2);////,才能旋转画板//graphics.RotateTransform才能(角);////,才能回退画板x, y轴移动过的距离//graphics.TranslateTransform才能(- (+ x1  sf.Width /, 2),,,(时间+ y1  sf.Height /, 2));   # endregion才能   # region 才能法二:矩阵旋转   Matrix 才能;Matrix =, graphics.Transform;   matrix.RotateAt才能(角,new  PointF(时间+ x1  sf.Width /, 2, y1  +, sf.Height /, 2));   时间=graphics.Transform 才能;矩阵;   # endregion才能   ,}   ,//写上自定义角度的文字   ,graphics.DrawString(字体,文本,还以为;new  SolidBrush (Color.Black), x1, y1);   ,graphics.Dispose ();   ,img.Dispose ();   ,return 骨形态发生蛋白;   }

c#如何使用GDI +实现添加中心旋转(任意角度)的文字