c#利用GDI +给图片添加文字(文字自适应矩形区域)

  

  

这篇文章是GDI +总结系列的第二篇,如果对GDI +的基础使用不熟悉的朋友可以先看第一篇文章《c#使用GDI +画图》。

  


  

  

需求是要做一个编辑文字的页面。用户在网页端写文字,文字区域是个矩形框,用户可以通过下方的拖动条调节文字大小。
  

  

如下图:

  

 C #利用GDI +给图片添加文字(文字自适应矩形区域)
  

  

提交数据的时候前端传文字区域的左上角和右下角定位给后台。因为前端的字体大小单位与后端没什么关系,所以不能直接传字体大小,也就是后端要根据矩形区域以及文字内容来自己推算用什么样的字体大小合适。

  

简单说就是知道文字的矩形区域,以及文字内容,要让文字内容根据矩形区域大小调整到适合的字体大小能比较合适地填满这个区域。

  


  

  

图形类有个MeasureString方法,可以用来计算以当前字体写出来的文字会占据多少像素。
  如下:

     ////摘要://测量用指定的System.Drawing。字体绘制的指定字符串。////参数://文本://要测量的字符串。////字体://System.Drawing.Font,它定义字符串的文本格式。////返回结果://此方法返回System.Drawing。SizeF结构,该结构表示文本参数指定的,使用字体参数绘制的字符串的大小,单位由System.Drawing.Graphics.PageUnit//属性指定。////异常://T: System.ArgumentException://字体为null。   公共SizeF MeasureString(字符串文本、字体字体);      

这个方法返回的SizeF包含宽度和高度属性,读取这两个属性可以获取到文字内容所占的宽高(以像素为单位)。

     ////摘要://获取或设置此System.Drawing。SizeF结构的水平分量。////返回结果://此System.Drawing。SizeF结构的水平分量,通常以像素为单位进行度量。   公共宽度{浮动;设置;}//摘要://获取或设置此System.Drawing。SizeF结构的垂直分量。////返回结果://此System.Drawing。SizeF结构的垂直分量,通常以像素为单位进行度量。   公共浮子高度{;设置;}      

于是我们可以先根据前端传过来的文字左上角与右下角定位,算出文字的矩形区域,然后估计一个字体大小,再用MeasureString方法计算出估算的文字所占区域,比较和实际的文字区域大小,大了则缩小字体,小了则增大字体。这样即可大约找出合适的文字大小。

  


  

  

添加文字方法

     ///& lt; summary>///图片添加文字,文字大小自适应///& lt;/summary>///& lt;参数name=" imgPath祝辞图片路径& lt;/param>///& lt;参数name=" locationLeftTop祝辞左上角定位(x1, y1) & lt;/param>///& lt;参数name=" locationRightBottom祝辞右下角定位(x2, y2) & lt;/param>///& lt;参数name=拔谋尽痹谖淖帜谌? lt;/param>///& lt;参数name="字体名祝辞字体名称& lt;/param>///& lt; returns>添加文字后的位图对象& lt;/returns>   公共静态位图AddText (locationRightBottom locationLeftTop imgPath的字符串,字符串,字符串,字符串文本字符串字体名="华文行楷”)   {   图像img=Image.FromFile (imgPath);   int宽度=img.Width;   int高度=img.Height;   位图bmp=新的位图(宽度、高度);   图形图=Graphics.FromImage (bmp);//计算文字区域//左上角   string []=locationLeftTop.Split位置(" ");   浮动x1=float.Parse(位置[0]);   浮动日元=float.Parse(位置[1]);//右下角   位置=locationRightBottom.Split (" ");   浮动x2=float.Parse(位置[0]);   浮动y2=float.Parse(位置[1]);//区域宽高   浮动fontWidth=x2 - x1;   浮动fontHeight=y2 - y1;   浮动字形大?fontHeight;//初次估计先用文字区域高度作为文字字体大小,后面再做调整,单位为px      字形大小,字体字体=new字体(字体名GraphicsUnit.Pixel);   SizeF科幻=图。MeasureString(文本、字体);   int *=0;//调整字体大小以适应文字区域   如果(科幻小说。宽度比;fontWidth)   {   而(科幻小说。宽度比;fontWidth)   {   字形大小- f=0.1;   字形大小,字体=新字体(字体名GraphicsUnit.Pixel);   科幻小说=图。MeasureString(文本、字体);   * + +;   }      控制台。WriteLine(“一开始估计大了,最终字体大小为{0},循环了{1}次”,font.ToString(),次);   }   else if(科幻小说。宽度& lt;fontWidth)   {   而(科幻小说。宽度& lt;fontWidth)   {   字形大小+ f=0.1;   字形大小,字体=新字体(字体名GraphicsUnit.Pixel);   科幻小说=图。MeasureString(文本、字体);   * + +;   }      控制台。WriteLine(“一开始估计小了,最终字体大小为{0},循环了{1}次”,font.ToString(),次);   }//最终的得出的字体所占区域一般不会刚好等于实际区域//所以根据两个区域的相差之处再把文字开始位置(左上角定位)稍微调整一下   x1 +=(fontWidth - sf.Width)/2;   y1 +=(fontHeight - sf.Height)/2;   图。DrawImage (img, 0, 0,宽度、高度);   图。拉带(文本、字体、新SolidBrush (Color.Black), (x1, y1);   graph.Dispose ();   img.Dispose ();   返回bmp;   }

c#利用GDI +给图片添加文字(文字自适应矩形区域)