美文网首页
使用gdi绘画与WPF的RichTextBox 文本重合

使用gdi绘画与WPF的RichTextBox 文本重合

作者: 雪之梦_8f14 | 来源:发表于2019-06-20 14:20 被阅读0次

完整代码

效果示意图

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;
        }

相关文章

网友评论

      本文标题:使用gdi绘画与WPF的RichTextBox 文本重合

      本文链接:https://www.haomeiwen.com/subject/unwdqctx.html