WPF 文本描边+外发光效果实现
解决思路:
(1)描边效果可以将文本字符串用GDI+生成Bitmap,然后转成BitmapImage,再用WPF的Image控件显示。
(2)外发光效果用WPF自带的Effect实现
代码:
1 using System;
2 using System.Drawing;
3 using System.Drawing.Drawing2D;
4 using System.Drawing.Text;
5 using System.IO;
6
7 namespace TextHighLighthDemo
8 {
9 public class FancyText
10 {
11 private static System.Windows.Media.Imaging.BitmapImage BitmapToBitmapImage(System.Drawing.Bitmap bitmap)
12 {
13 using (MemoryStream stream = new MemoryStream())
14 {
15 bitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png); // 坑点:格式选Bmp时,不带透明度
16
17 stream.Position = 0;
18 System.Windows.Media.Imaging.BitmapImage result = new System.Windows.Media.Imaging.BitmapImage();
19 result.BeginInit();
20 result.CacheOption = System.Windows.Media.Imaging.BitmapCacheOption.OnLoad;
21 result.StreamSource = stream;
22 result.EndInit();
23 result.Freeze();
24 return result;
25 }
26 }
27
28 private static Bitmap ImageFromText(string strText, Font fnt, Color clrFore, Color clrBack, int blurAmount = 5)
29 {
30 Bitmap bmpOut = null;
31 int sunNum = 255; //光晕的值
32 using (Graphics g = Graphics.FromHwnd(IntPtr.Zero))
33 {
34 SizeF sz = g.MeasureString(strText, fnt);
35 using (Bitmap bmp = new Bitmap((int)sz.Width, (int)sz.Height))
36 using (Graphics gBmp = Graphics.FromImage(bmp))
37 using (SolidBrush brBack = new SolidBrush(Color.FromArgb(sunNum, clrBack.R, clrBack.G, clrBack.B)))
38 using (SolidBrush brFore = new SolidBrush(clrFore))
39 {
40 gBmp.SmoothingMode = SmoothingMode.HighQuality;
41 gBmp.InterpolationMode = InterpolationMode.HighQualityBilinear;
42 gBmp.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
43 gBmp.DrawString(strText, fnt, brBack, 0, 0);
44 bmpOut = new Bitmap(bmp.Width + blurAmount, bmp.Height + blurAmount);
45 using (Graphics gBmpOut = Graphics.FromImage(bmpOut))
46 {
47 gBmpOut.SmoothingMode = SmoothingMode.HighQuality;
48 gBmpOut.InterpolationMode = InterpolationMode.HighQualityBilinear;
49 gBmpOut.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
50 //阴影光晕
51 for (int x = 0; x <= blurAmount; x++)
52 {
53 for (int y = 0; y <= blurAmount; y++)
54 {
55 gBmpOut.DrawImageUnscaled(bmp, x, y);
56 }
57 }
58 gBmpOut.DrawString(strText, fnt, brFore, blurAmount / 2, blurAmount / 2);
59 }
60 }
61 }
62 return bmpOut;
63 }
64
65 /// <summary>
66 /// 文本转图片
67 /// </summary>
68 /// <param name="strText"></param>
69 /// <param name="fnt"></param>
70 /// <param name="clrFore"></param>
71 /// <param name="clrBack"></param>
72 /// <param name="blurAmount"></param>
73 /// <returns></returns>
74 public static System.Windows.Media.Imaging.BitmapImage BitmapImageFromText(string strText, Font fnt, Color clrFore, Color clrBack, int blurAmount = 5)
75 {
76
77 return BitmapToBitmapImage(ImageFromText(strText, fnt, clrFore, clrBack, blurAmount));
78 }
79
80 }
81 }
应用:
(1)XMAL代码
<Grid Background="Gray">
<StackPanel Height="300">
<Image x:Name="img" Height="70" VerticalAlignment="Top" >
<Image.Effect>
<DropShadowEffect Color="#00ffff" ShadowDepth="0" BlurRadius="15"/>
</Image.Effect>
</Image>
<Image x:Name="img1" Height="35" VerticalAlignment="Top" Margin="0 10 0 0">
<Image.Effect>
<DropShadowEffect Color="#00ffff" ShadowDepth="0" BlurRadius="5"/>
</Image.Effect>
</Image>
</StackPanel>
</Grid>
(2)code behind
var backColor = System.Drawing.ColorTranslator.FromHtml("#037be2");
var forColor= System.Drawing.ColorTranslator.FromHtml("#ffffff");
img.Source = FancyText.BitmapImageFromText("测试字体,微软雅黑", new System.Drawing.Font("Microsoft YaHei", 60, System.Drawing.FontStyle.Bold), forColor, backColor, 6);
img1.Source = FancyText.BitmapImageFromText("外发光+描边", new System.Drawing.Font("Microsoft YaHei", 30, System.Drawing.FontStyle.Bold), forColor, backColor, 3);
效果:

优化点:可以将FancyText封装成自定义控件,定义描边大小,颜色值等依赖属性,直接为WPF使用。
WPF 文本描边+外发光效果实现的更多相关文章
- WPF 文本框添加水印效果
有的时候我们需要为我们的WPF文本框TextBox控件添加一个显示水印的效果来增强用户体验,比如登陆的时候提示输入用户名,输入密码等情形.如下图所示: 这个时候我们除了可以修改TextBox控件的控件 ...
- 使用 WPF 做个 PowerPoint 系列 基于 OpenXML 解析实现 PPT 文本描边效果
本文是使用 WPF 做个 PowerPoint 系列的博客,本文来告诉大家如何解析 PPT 里面的文本描边效果,在 WPF 应用中绘制出来,实现像素级相同 背景知识 在开始之前,期望你了解了 PPT ...
- WPF文本框密码框添加水印效果
WPF文本框密码框添加水印效果 来源: 阅读:559 时间:2014-12-31 分享: 0 按照惯例,先看下效果 文本框水印 文本框水印相对简单,不需要重写模板,仅仅需要一个VisualBrush ...
- WPF文字描边的解决方法(二)——支持文字竖排和字符间距调整
原文:WPF文字描边的解决方法(二)--支持文字竖排和字符间距调整 自前天格式化文本效果出来后,今天又添加文本竖排和调整字符间距的功能.另外,由于上次仓促,没来得及做有些功能的设计时支持,这次也调整好 ...
- WPF 实现跑马灯效果的Label控件,数据绑定方式实现
原文:WPF 实现跑马灯效果的Label控件,数据绑定方式实现 项目中需要使用数据绑定的方式实现跑马灯效果的Label,故重构了Label控件:具体代码如下 using System; using S ...
- 纯CSS实现帅气的SVG路径描边动画效果(转载)
本文转载自: 纯CSS实现帅气的SVG路径描边动画效果
- JS 文本输入框放大镜效果
JS 文本输入框放大镜效果 今天下午研究了下 "文本输入框放大镜效果" 当然KISSY官网也有这种组件 请看kissy demo 其实这种效果 对于很多童鞋来说 应该并不陌生!我今 ...
- WPF绘制党徽(立体效果,Cool)
原文:WPF绘制党徽(立体效果,Cool) 前面用WPF方式绘制了党旗(WPF制作的党旗) ,去年3月份利用C# 及GDI+绘制过党徽,这次使用WPF来绘制党徽. ------------------ ...
- WPF 扩大,回弹效果
原文:WPF 扩大,回弹效果 <Window x:Class="Fish.AccountBook.View.Test.PanelWindow" xmlns="htt ...
随机推荐
- LAMP架构—源码编译安装 (爱情受过伤,为爱跳过鸭绿江)
LAMP架构--源码编译安装 1.LAMP架构概述 2.编译安装Apache httpd 服务 3.编译安装mysql 服务 4.编译安装PHP 解析服务 5.利用LAMP搭建论坛 1.LAMP架构概 ...
- TensorFlow优化器浅析
本文基于tensorflow-v1.15分支,简单分析下TensorFlow中的优化器. optimizer = tf.train.GradientDescentOptimizer(learning_ ...
- Tomcat是什么?
Tomcat简单的说就是一个运行JAVA的网络服务器,底层是Socket的一个程序,它也是JSP和Serlvet的一个容器. 为什么我们需要用到Tomcat 如果你学过html,css,你会知道你写的 ...
- ApplicationStartedEvent与ContextStartedEvent有区别吗?
大家好,我是DD! 今天跟大家聊聊这个问题:ApplicationStartedEvent与ContextStartedEvent有区别吗? 对了,最近花了几周时间,把SpringForAll社区 3 ...
- jmeter变量嵌套:__V
问题复现 ${name_${n}} 下面没有获取到结果 解决方案 __V是用于执行变量名表达式 ${__V(name_${n})} 获取到结果
- jQuery下载安装使用教程
一:下载jQuery 下载链接:jQuery官网 中文文档:jQuery AP中文文档 1.jQuery版本 1.x:兼容IE678,使用最为广泛的,官方只做BUG维护,功能不再新增.因此一般项目来说 ...
- smbms项目核心功能实现
SMBMS 数据库: 项目如何搭建? 考虑使用不使用Maven?依赖,Jar 1.项目搭建准备工作 搭建一个maven web项目 配置Tomcat 测试项目是否能够跑起来 导入项目中会遇到的jar包 ...
- 论文解读(Geom-GCN)《Geom-GCN: Geometric Graph Convolutional Networks》
Paper Information Title:Geom-GCN: Geometric Graph Convolutional NetworksAuthors:Hongbin Pei, Bingzhe ...
- 以小25倍参数量媲美GPT-3的检索增强自回归语言模型:RETRO
NLP论文解读 原创•作者 | 吴雪梦Shinemon 研究方向 | 计算机视觉 导读说明: 一个具有良好性能的语言模型,一定量的数据样本必不可少.现有的各种语言模型中,例如GPT3具有1750亿的参 ...
- Iterator迭代
今天在牛客网练题的时候,出现了Iterator的题,实在想不起来这是什么,于是去查阅了相关资料,顺便自己去IDEA试了一下.总结了一些相关知识如下: 什么是Iterator? 我们来看看菜鸟教程里的解 ...