实现代码:
public void ConvertTextFileToImage(string title, string content, string logoPath, string imageFile) { Bitmap newBitmap = null; Graphics g = null; try { Font titleFont = new Font("宋体", 50); Font contentFont = new Font("宋体", 30); newBitmap = new Bitmap(1920, 1080, PixelFormat.Format32bppArgb); using (var logoFile = Image.FromFile(logoPath))//logo图片 { g = Graphics.FromImage(newBitmap); int rowHeight = (int)(Math.Ceiling(g.MeasureString("位置", titleFont).Height)); Rectangle recangleTitle = new Rectangle(0, 0, 1920, rowHeight); //标题 DrawStringTitle(g, titleFont, title, recangleTitle, logoFile.Height + 100); //描述内容 Rectangle recangle = new Rectangle(0, 0, 1920, 1080 - rowHeight); DrawStringWrap(g, contentFont, content, recangle, rowHeight + logoFile.Height + 200); //logo图片 g.DrawImage(logoFile, new Rectangle((1920 - logoFile.Width) / 2, 30, logoFile.Width, logoFile.Height)); // MemoryStream tempStream = new MemoryStream(); newBitmap.Save(imageFile, ImageFormat.Png); } } finally { if (g != null) g.Dispose(); if (newBitmap != null) newBitmap.Dispose(); } } /// <summary> /// 绘制文本自动换行(超出截断) /// </summary> /// <param name=\"graphic\">绘图图面</param> /// <param name=\"font\">字体</param> /// <param name=\"text\">文本</param> /// <param name=\"recangle\">绘制范围</param> private void DrawStringWrap(Graphics graphic, Font font, string text, Rectangle recangle, int top = 0) { List<string> textRows = GetStringRows(graphic, font, text, recangle.Width); int rowHeight = (int)(Math.Ceiling(graphic.MeasureString("测试", font).Height)); int maxRowCount = recangle.Height / rowHeight; int drawRowCount = (maxRowCount < textRows.Count) ? maxRowCount : textRows.Count; //int top = (recangle.Height - rowHeight * drawRowCount) / 2; //int top = 0; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Near; sf.LineAlignment = StringAlignment.Center; for (int i = 0; i < drawRowCount; i++) { Rectangle fontRectanle = new Rectangle(recangle.Left, top + rowHeight * i, recangle.Width, rowHeight); graphic.DrawString(textRows[i], font, new SolidBrush(Color.Black), fontRectanle, sf); } } /// <summary> /// 绘制居中的标题(超出截断) /// </summary> /// <param name=\"graphic\">绘图图面</param> /// <param name=\"font\">字体</param> /// <param name=\"text\">文本</param> /// <param name=\"recangle\">绘制范围</param> private void DrawStringTitle(Graphics graphic, Font font, string text, Rectangle recangle, int top = 0) { List<string> textRows = GetStringRows(graphic, font, text, recangle.Width); int rowHeight = (int)(Math.Ceiling(graphic.MeasureString("测试", font).Height)); int maxRowCount = recangle.Height / rowHeight; int drawRowCount = (maxRowCount < textRows.Count) ? maxRowCount : textRows.Count; //int top = (recangle.Height - rowHeight * drawRowCount) / 2; //int top = 0; StringFormat sf = new StringFormat(); sf.Alignment = StringAlignment.Center; sf.LineAlignment = StringAlignment.Center; for (int i = 0; i < drawRowCount; i++) { Rectangle fontRectanle = new Rectangle(recangle.Left, top + rowHeight * i, recangle.Width, rowHeight); graphic.DrawString(textRows[i], font, new SolidBrush(Color.Black), fontRectanle, sf); } } /// <summary> /// 将文本分行 /// </summary> /// <param name=\"graphic\">绘图图面</param> /// <param name=\"font\">字体</param> /// <param name=\"text\">文本</param> /// <param name=\"width\">行宽</param> /// <returns></returns> private List<string> GetStringRows(Graphics graphic, Font font, string text, int width) { int RowBeginIndex = 0; int rowEndIndex = 0; int textLength = text.Length; List<string> textRows = new List<string>(); for (int index = 0; index < textLength; index++) { rowEndIndex = index; if (index == textLength - 1) { textRows.Add(text.Substring(RowBeginIndex)); } else if (rowEndIndex + 1 < text.Length && text.Substring(rowEndIndex, 1) == "\n") { textRows.Add(text.Substring(RowBeginIndex, rowEndIndex - RowBeginIndex)); rowEndIndex = index += 1; RowBeginIndex = rowEndIndex; } else if (graphic.MeasureString(text.Substring(RowBeginIndex, rowEndIndex - RowBeginIndex + 1), font).Width > width) { textRows.Add(text.Substring(RowBeginIndex, rowEndIndex - RowBeginIndex)); RowBeginIndex = rowEndIndex; } } return textRows; }
调用示例:
ConvertTextFileToImage(".NET(C#)new关键字的三种用法", "new是我们大家所熟知的英文单词,但在C#中,它是一个关键字,它可以做运算符,也可以做修饰符,还可以用在泛型T参数约束中。下面我们来介绍一下这3种用法。", @"E:\softwaredir\\img\logo.png", @"E:\softwaredir\\img\th.png");