C#实现在底图上动态生成文字和图片

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
/// <summary>
/// 在底图上画指定路径的图片
/// </summary>
/// <param name="g">画板实例</param>
/// <param name="path">图片路径</param>
/// <param name="totalWidth">画区总长度</param>
/// <param name="totalHeight">画区总高度</param>
/// <param name="px">起点X坐标</param>
/// <param name="py">起点Y坐标</param>
   private void FontPic( ref Graphics g, string path, int totalWidth, int totalHeight, int px, int py)
   {
    if (File.Exists(path))
    {
     var pImg = Image.FromFile(path);
     //如果图片大于画布区域,则缩小
     if (totalHeight < pImg.Height && totalWidth < pImg.Width)
     {
      Image newPic = GetReducedImage(pImg, totalWidth, totalHeight);
      if (newPic != null )
      {
       DrawPic( ref g, totalWidth, totalHeight, px, py, newPic);
      }
     }
     else if (totalHeight < pImg.Height && totalWidth >= pImg.Width)
     {
      Image newPic = GetReducedImage(pImg, pImg.Width, totalHeight);
      if (newPic != null )
      {
       DrawPic( ref g, totalWidth, totalHeight, px, py, newPic);
      }
     }
     else if (totalHeight >= pImg.Height && totalWidth < pImg.Width)
     {
      Image newPic = GetReducedImage(pImg, totalWidth, pImg.Height);
      if (newPic != null )
      {
       DrawPic( ref g, totalWidth, totalHeight, px, py, newPic);
      }
     }
     else
     {
      DrawPic( ref g, totalWidth, totalHeight, px, py, pImg);
     }
    }
   }
   /// <summary>
   /// 在图上画图片
   /// </summary>
   /// <param name="g">画板实例</param>
   /// <param name="totalWidth">画区总长度</param>
   /// <param name="totalHeight">画区总高度</param>
   /// <param name="px">起点X坐标</param>
   /// <param name="py">起点Y坐标</param>
   /// <param name="pImg">要画的图片实例</param>
   private void DrawPic( ref Graphics g, int totalWidth, int totalHeight, int px, int py, Image pImg)
   {
    px += GetValue(totalWidth, pImg.Width);
    py += GetValue(totalHeight, pImg.Height);
  
    g.DrawImage( new Bitmap(pImg, new Size(GetSize(totalWidth, pImg.Width), GetSize(totalHeight, pImg.Height))),
     new Rectangle(px, py, totalWidth, totalHeight),
     0, 0, totalWidth, totalHeight, GraphicsUnit.Pixel);
   }
   /// <summary>
   /// 生成缩略图重载方法1,返回缩略图的Image对象
   /// </summary>
   /// <param name="width">缩略图的宽度</param>
   /// <param name="height">缩略图的高度</param>
   /// <returns>缩略图的Image对象</returns>
   public Image GetReducedImage(Image resourceImage, int width, int height)
   {
    try
    {
     Image data = null ;
     //用指定的大小和格式初始化Bitmap类的新实例
     using (Bitmap bitmap = new Bitmap(width, height, PixelFormat.Format32bppArgb))
     {
      //从指定的Image对象创建新Graphics对象
      using (Graphics graphics = Graphics.FromImage(bitmap))
      {
       //清除整个绘图面并以透明背景色填充
       //graphics.Clear(Color.Transparent);
       //在指定位置并且按指定大小绘制原图片对象
       graphics.DrawImage(resourceImage, new Rectangle(0, 0, width, height));
      }
      data = new Bitmap(bitmap);
     }
     return data;
    }
    catch (Exception e)
    {
     throw e;
    }
   }
   /// <summary>
   /// 比较两个值,得到给到给定值(判断是否越界)
   /// </summary>
   /// <param name="total">总长度</param>
   /// <param name="width">指定长度</param>
   /// <returns></returns>
   public int GetSize( int total, int width)
   {
    if (total > width)
    {
     return width;
    }
    else
    {
     return total;
    }
   }
   /// <summary>
   /// 更加传入的值计算得到新值(计算点坐标)
   /// </summary>
   /// <param name="total">总长度</param>
   /// <param name="width">指定长度</param>
   /// <returns></returns>
   private int GetValue( int total, int width)
   {
    return (total - width) / 2;
   }
   /// <summary>
   /// 在图片上画出文字
   /// </summary>
   /// <param name="g">图片对象</param>
   /// <param name="pointX">文字x坐标</param>
   /// <param name="pointY">文字y坐标</param>
   /// <param name="word">文字内容</param>
   /// <param name="textWidth">文本宽度</param>
   /// <param name="textHeight">文本高度</param>
   private static void DrawStringWord(Graphics g, int pointX, int pointY, string word, int textWidth, int textHeight, int fontSize = 30)
   {
    Font font = new Font( "微软雅黑" , fontSize, (FontStyle.Regular));
    RectangleF textArea = new RectangleF(pointX, pointY, textWidth, textHeight);
    Brush brush = new SolidBrush(Color.Black);
    g.DrawString(word, font, brush, textArea);
   }

猜你喜欢

转载自www.cnblogs.com/lhbit342/p/10947030.html