效果示意图

image.png
前台主要代码
- 注意一定要设置
TextOptions.TextFormattingMode = "Display"
<RichTextBox x:Name="RichTextEditor"
MinWidth="100"
Background="#01ffffff"
BorderBrush="Black"
BorderThickness="1"
TextOptions.TextHintingMode="Fixed">
<FlowDocument FontStyle="Normal"
FontWeight="Normal"
FontSize="192"
FontFamily="宋体"
LineHeight="0.0034"
TextOptions.TextFormattingMode="Display"
x:Name="EditorDocument">
<Paragraph>
<Run>HELLOHELLOHELL</Run>
</Paragraph>
</FlowDocument>
</RichTextBox>
后台主要代码
- 注意一定要将文本最后的 "\r\n" 去除再绘制 否则绘制的文本可能另起一行与原本的文本不一致
- 如果是斜体加上粗体 那么 选择 SingleBitPerPixelGridFit 模式 否则选择AntiAliasGridFit 模式
/// <summary>
/// 将RichTextBox中的文本 转换成图片并设置成背景
/// </summary>
private void SaveRichTextAsImage(FlowDocument flowDocument)
{
var height = RichTextEditor.ActualHeight - 2;
var width = RichTextEditor.ActualWidth - 2;
int bold = flowDocument.FontWeight == FontWeights.Bold ? 1 : 0;
var italic = flowDocument.FontStyle == FontStyles.Italic ? 2 : 0;
int underline = 0;
var fontStyle = (System.Drawing.FontStyle)(bold + italic + underline);
var content = GetTextEditorContent(flowDocument);
using (Bitmap bitmap = new Bitmap((int)width, (int)height))
{
using (Graphics g = Graphics.FromImage(bitmap))
{
Font font = new System.Drawing.Font("宋体", (float)flowDocument.FontSize, fontStyle, GraphicsUnit.Pixel);
RectangleF rectangleF = new RectangleF(4.1f, 12, (float)width, (float)height);
GraphicsContainer gc = g.BeginContainer();
try
{
g.SmoothingMode = SmoothingMode.HighQuality;
g.PixelOffsetMode = PixelOffsetMode.Default; // PixelOffsetMode.HighQuality 在插入带有文字的图片变模糊
g.InterpolationMode = InterpolationMode.HighQualityBicubic;
if (fontStyle == (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic))
{
// 如果是斜体加上粗体 那么 选择 SingleBitPerPixelGridFit 模式
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.SingleBitPerPixelGridFit;
}
else
{
g.TextRenderingHint = System.Drawing.Text.TextRenderingHint.AntiAliasGridFit;
}
g.CompositingMode = CompositingMode.SourceOver;
g.CompositingQuality = CompositingQuality.HighQuality;
g.DrawString(content, font, System.Drawing.Brushes.Red, rectangleF,
StringFormat.GenericTypographic);
}
catch (Exception e)
{
}
finally
{
g.EndContainer(gc);
}
}
#region 保存为图片和生成背景图片
var bitmapSource = Bitmap2BitmapSource(bitmap);
var imageBrush = new ImageBrush(bitmapSource);
imageBrush.Stretch = Stretch.None;
RichTextEditor.Background = imageBrush;
bitmap.Save("test.png");
#endregion 保存为图片和生成背景图片
}
}
/// <summary>
/// 获取文本内容 不带\r\n
/// </summary>
/// <returns></returns>
private string GetTextEditorContent(FlowDocument flowDocument)
{
string content = string.Empty;
try
{
var textrange = new TextRange(flowDocument.ContentStart, flowDocument.ContentEnd);
content = textrange.Text;
int index = -1;
for (var i = content.Length - 1; i >= 0; i--)
{
if (content[i] != '\r' && content[i] != '\n')
{
index = i;
break;
}
}
if (index >= 0 && index != content.Length - 1)
{
content = content.Substring(0, index + 1);
}
}
catch (Exception ex)
{
//Log.Write(ex);
}
return content;
}
网友评论