前言
在开发一些特殊场景的工具时,遇到了一个需求:如何在没有任何字体文件的情况下,让汉字在网页中正常显示?经过一番探索,我用易语言实现了一个有趣的解决方案------通过CSS的box-shadow属性,逐像素绘制汉字,生成完全脱离字体依赖的HTML文件。
本文将完整分享这个工具的易语言实现思路和核心代码。
源码下载地址: https://www.ikdya.com/2026/05/01/733.html
一、效果演示

源代码内显示

工具界面很简单:输入汉字、设置字体大小和颜色,点击按钮即可生成一个HTML文件。

生成的HTML在浏览器中打开后,看到的不再是普通文本,而是由数千个像素点拼成的汉字。每个像素点都是一条CSS box-shadow声明,排列在一起就组成了完整的文字轮廓。
二、核心原理
2.1 像素级Box-Shadow绘制
整个工具的核心原理就一个CSS属性:
box-shadow: 10px 15px #333333, 11px 15px #333333, 12px 16px #333333...;
思路很简单:
-
创建一个1px×1px的div作为"画笔"
-
每一条box-shadow就是画笔在指定坐标画一个点
-
成百上千个点按汉字轮廓排列,最终呈现出完整文字
2.2 汉字点阵数据的获取
这是整个工具最核心的难点:如何知道一个汉字每个像素点的坐标?
实现思路:
易语言本身没有直接解析字体轮廓的能力,所以我借助了精易Web浏览器支持库(wke内核)。具体流程如下:
-
在HTML中用Canvas绘制文字:构造一个包含Canvas的临时HTML,在Canvas上绘制指定汉字
-
读取像素数据 :通过
getImageData()获取Canvas上每个像素的透明度 -
提取有效坐标:遍历像素数据,将透明度超过阈值的像素坐标提取出来
-
生成Box-Shadow字符串:将坐标组拼接成CSS的box-shadow格式
三、易语言实现代码
3.1 界面设计
-
编辑框1:输入要渲染的汉字
-
编辑框2:设置像素大小(默认20px)
-
编辑框3:设置颜色值(十六进制,不含#号)
-
按钮1:开始生成
-
精易Web浏览器1:用于渲染和获取像素数据
易语言代码:
.版本 2
.支持库 spec
.支持库 wke
x = " " + 编辑框1.内容
ls = 子文本替换 (#常量2, "文本内容", 子文本替换 (x, #换行符, "\n", , , 真), , , 真)
ls = 子文本替换 (ls, "20px Arial", 编辑框2.内容 + "px Arial", , , 真)
ls = 子文本替换 (ls, "颜色", "#" + 编辑框3.内容, , , 真)
ls = 子文本替换 (ls, "间距", 编辑框2.内容, , , 真)
调试输出 ("1")
写到文件 (取运行目录 () + "\1.html", 到字节集 (ls))
' 信息框 (1, 0, , )
精易Web浏览器1.URL = 取运行目录 () + "\1.html"
调试输出 ("3")
程序_延时 (500)
b = 精易Web浏览器1.取网页源码 ()
ls = 文本_取出中间文本 (b, "zls{", "}zls", 寻找文本 (b, "zls{", , 假) + 10, )
ls = 子文本替换 (#常量1, "代码", ls, , , 真)
写到文件 (取运行目录 () + "\1.txt", 到字节集 (ls))
写到文件 (取运行目录 () + "\1.html", 到字节集 (ls))
适用场景分析
5.1 适合使用的场景
嵌入式设备显示字符
-
单片机、LED点阵屏等设备需要汉字字模数据
-
这个工具稍加改造就能导出C语言数组格式的字模
复古风格设计
-
终端风格网页、像素艺术项目
-
游戏中的像素字体显示
-
极客风格的个人名片或签名
字体依赖隔离
-
在完全无法引入外部字体的环境中显示文字
-
邮件中确保字体样式一致性
5.2 不适合的场景
-
需要SEO的网页:搜索引擎无法识别像素组成的文字
-
需要文本交互的场景:用户无法选择和复制文字
-
高频率更新的内容:每次都要重新生成HTML