资讯动态

PlantUML 盲文输出格式(Braille Output)深入解析:从 `--braille` 命令行到 `UGraphicBraille` 栅格化实现

发布时间:2026/9/23 6:22:56 来源:尧图企业网站定制
开发工具文档【免费下载链接】plantumlGenerate diagrams from textual description项目地址https://gitcode.com/gh_mirrors/pl/plantuml点击查看免费下载PlantUML 在传统的 PNG/SVG 等图形输出之外提供了一种面向触觉阅读场景的braille-png输出格式它把时序图、类图等 UML 图先转换成一张由“凸点”构成的 Braille 点阵网格再以 PNG 图片形式输出从而可以被盲文打印/触觉显示设备读取。本文以 src/main/java/net/sourceforge/plantuml/braille/readme.md 为骨架结合braille包的完整源码从命令行入口、格式注册、栅格化渲染管线、字符映射、尺寸计算到支持范围逐一展开帮助你理解并复用这一无障碍输出能力。一、包定位braille包在 PlantUML 中的角色braille包的官方定位非常明确——该包提供用于将图导出为 Braille 输出格式的类export diagram to a Braille output format其包级注释也确认了这一职责见 package-info.java。整个包共 14 个源文件可以按职责划分为四层层次类职责入口/画布UGraphicBraille.java实现 Klimt 绘图接口的 Braille 后端注册各形状的驱动栅格模型BrailleGrid.java、Coords.java点阵状态存储、坐标换算、线/矩形/曲线/多边形光栅化字符映射BrailleChar.java、BrailleCharFactory.java、BrailleUtils.java字母/数字/符号到 Braille 六点6-dot位图的映射形状驱动DriverLineBraille.java、DriverRectangleBraille.java、DriverPolygonBraille.java、DriverDotPathBraille.java、DriverTextBraille.java、DriverCenteredCharacterBraille.java把 Klimt 几何/文本对象写入栅格输出BrailleDrawer.java把栅格渲染成最终 PNG该包最早源于论坛上的需求讨论QA-4752主题为把类图翻译成盲文是 PlantUML 无障碍accessibility方向的一个探索性实现。需要说明的是这是一个实验性、面向特定触觉场景的功能它输出的仍然是 PNG 图片点阵图的像素化呈现并且目前只覆盖了部分图形对象见后文支持范围。二、从命令行激活--braille标志与格式注册Braille 输出通过标准命令行参数激活。在 CliFlag.java 中定义了T_BRAILLE(--braille, Arity.UNARY_BOOLEAN, FileFormat.BRAILLE_PNG),对应的文件格式枚举在 FileFormat.java 中注册为BRAILLE_PNG(braille-png, image/png), //典型用法# 将 diagram.puml 渲染为 braille-png 输出生成 diagram.braille.png plantuml -tbraille diagram.puml # 或使用长选项 plantuml --braille diagram.puml关于文件名的两个细节见 FileFormat.java输出文件后缀为.braille.png而不是普通的.png便于与常规 PNG 输出区分该格式的 MIME 类型声明为image/png即它本质上仍是一张 PNG 位图。在 PlantUmlTask.java 中可以看到Ant 构建任务同样支持formatbraille并映射到FileFormat.BRAILLE_PNG因此--braille能力在 CLI 与 Ant 集成中均可使用。由于BrailleUtils.isBraille(char)判定Character.UnicodeBlock.BRAILLE_PATTERNS见 BrailleUtils.java说明该格式与 Unicode 盲文字符块U2800 起的 Braille Patterns直接相关栅格最终呈现的就是这些盲文图案的点位。三、渲染管线从 Klimt 绘图指令到 Braille 栅格PlantUML 所有输出格式共享同一套 Klimt 绘图模型UGraphicUDriver机制。Braille 输出也不例外其管线如下选择 StringBounderFileFormat.getDefaultStringBounder()在BRAILLE_PNG分支返回 StringBounderBraille.java见 FileFormat.java所有文字度量按 Braille 字符规格计算详见第五节。创建 UGraphicTextBlockExporter在BRAILLE_PNG分支实例化new UGraphicBraille(backcolor, colorMapper, stringBounder)见 TextBlockExporter.java。注册驱动UGraphicBraille.register()为每种 Klimt 形状注册对应的UDriver并显式忽略部分形状见 UGraphicBraille.javaprivate void register() { ignoreShape(URectangle.class); registerDriver(URectangle.class, new DriverRectangleBraille(this)); registerDriver(UText.class, new DriverTextBraille()); registerDriver(ULine.class, new DriverLineBraille(this)); registerDriver(UPolygon.class, new DriverPolygonBraille(this)); ignoreShape(UEllipse.class); ignoreShape(UImage.class); ignoreShape(UPath.class); registerDriver(DotPath.class, new DriverDotPathBraille()); registerDriver(UCenteredCharacter.class, new DriverCenteredCharacterBraille()); }栅格累积各个Driver*Braille把几何对象解析成离散点写入同一个 BrailleGrid 栅格。导出 PNGUGraphicBraille.writeToStream()借助TextBlockExporter.builder(new BrailleDrawer(grid), new FileFormatOption(FileFormat.PNG), false)把栅格绘制成 PNG 输出见 UGraphicBraille.java——即Braille 栅格 → PNG 位图的最终一步由BrailleDrawer完成。其中UGraphicBraille继承自 Klimt 的AbstractUGraphicBrailleGrid并实现ClipContainer这意味着裁剪clip能力同样作用于 Braille 渲染DriverRectangleBraille与DriverLineBraille中都会先取clipContainer.getClip()对几何做裁剪后再写入栅格见 DriverRectangleBraille.java、DriverLineBraille.java。四、栅格模型BrailleGrid与CoordsBrailleGrid是 Braille 输出的核心数据结构见 BrailleGrid.java要点如下分辨率单位quanta由UGraphicBraille.QUANTA 4定义见 UGraphicBraille.java。所有浮点坐标经toInt(value) (int) Math.round(value / quanta)换算成整数栅格坐标quanta即一个盲文点位的尺寸。状态存储用SetCoords on保存所有被激活的点位Coords是(x, y)整数坐标的不可变值对象equals/hashCode由x y * 8192决定见 Coords.java。当点位写入时minX/minY/maxX/maxY边界会同步更新供BrailleDrawer计算画布尺寸。几何光栅化rectangle(x, y, w, h)四条边分别调用hline/vline逐点激活line(x1,y1,x2,y2)仅支持水平或垂直线斜线会打印warning line到 stderr 并忽略见 BrailleGrid.javadrawDotPath(x, y, DotPath)把贝塞尔曲线逐段细分subdivide当控制点间距大于quanta时持续递归二分直到逼近到点级精度BrailleGrid.javadrawPolygon(points)逐边递归中点细分a.distance(b) quanta时取中点一分为二并闭合首尾BrailleGrid.java。这种递归细分直到小于一个 quanta的策略是 Braille 栅格能表达曲线/斜边的关键虽然直线line只支持横竖但多边形与曲线路径通过细分逼近出近似形状。五、文字渲染Braille 六点字符映射这是整个包最Blind-friendly的部分图中文字不再渲染为普通字体而是逐个字符翻译成盲文点位。5.1 字符 → 六点位图映射BrailleChar.java 用一个 0~63 的整数id表示一个 Braille 字符的六点组合。draw()把 6 个点映射到 2 列 × 3 行的栅格单元上见 BrailleChar.java栅格偏移位权重(x0, y0)1(x0, y1)2(x0, y2)4(x1, y0)8(x1, y1)16(x1, y2)32fromChar(char)是完整的映射表覆盖26 个小写/大写字母a–z / A–Z例如a→1、b→12、c→18、w→281632 等标准 Grade 1 Braille 字母编码数字 0–9复用 a–j 的字母位型1→a、2→b …0→j符合盲文中数字前缀 a–j 的惯例常用标点空格→0、→2、;→24、:→216、!→2416、(/)→241632、?/./→2432、,→4、-→432未支持字符的兜底返回63全 6 点即未定义字符会以六点全亮的方式在触觉上提示读者BrailleChar.java。5.2 文本驱动与工厂BrailleCharFactory.build(String) 把字符串逐字符转成ListBrailleChar不可变列表DriverTextBraille 负责排布每个字符绘制后横向推进quanta * 3即 3 个点位宽度对应 2 列点 1 列间距起点整体做y - quanta*3; x quanta的偏移校正DriverCenteredCharacterBraille 处理UCenteredCharacter如带圈字符的居中场景。5.3 文字度量StringBounderBraille布局引擎需要知道文字占多大空间StringBounderBraille.calculateDimension()给出与渲染一致的公式见 StringBounderBraille.javafinal int nb BrailleCharFactory.build(text).size(); final double quanta UGraphicBraille.QUANTA; // 4 final double height 5 * quanta; // 3 行点 上下边距 final double width 3 * nb * quanta 1; // 每字符 3 个点位宽getDescent()返回一个quantagetFileFormat()声明FileFormat.BRAILLE_PNG。这样布局阶段与渲染阶段对一个 Braille 字符的认知完全一致避免文字溢出或重叠。六、最终输出BrailleDrawer如何把栅格画成 PNGBrailleDrawer.java 实现TextBlock承担栅格 → 图形的最终绘制常量step 9网格间距、spotSize 5凸点直径尺寸calculateDimension()依据栅格边界计算width (maxX-minX)*step spotSize 2、height (maxY-minY)*step spotSize 2绘制顺序以#F0F0F0浅灰绘制横竖参考网格线辅助触觉定位切回黑色遍历栅格中所有激活点位在每个(x,y)处用UEllipse.build(spotSize, spotSize)画一个实心圆作为凸点BrailleDrawer.java。输出结果就是一张浅灰网格 黑色凸点的 PNG 位图盲文打印设备/软件可依据凸点分布将其转译为可触摸的盲文图形。七、支持范围与已知限制基于源码的客观评估从UGraphicBraille.register()的注册表可以客观推断当前支持与不支持的图形对象支持矩形URectangle——仅轮廓边框无填充DriverRectangleBraille中与颜色/渐变相关的 SVG 代码均被注释掉见 DriverRectangleBraille.java水平/垂直线ULine多边形UPolygon与贝塞尔路径DotPath——通过递归细分逼近文本UText与居中字符UCenteredCharacter——按盲文字符位图渲染裁剪clip语义。不支持ignoreShape直接跳过椭圆UEllipse、图片UImage、通用路径UPath。其中椭圆被忽略意味着圆形节点、圆角矩形、泳道圆角等依赖椭圆的图形元素不会出现在 Braille 输出中BrailleGrid.line()对斜线会打印warning line并跳过因此箭头等斜线段也无法直接表达。这些限制说明该功能更适合表达以矩形框和横竖连线为主的简单结构图如基础类图骨架、时序图消息线读者在选用时应结合实际图型验证。另外两点工程细节值得注意UGraphicBraille构造器中有一段被注释掉的渐变背景HtmlColorGradient相关代码UGraphicBraille.java佐证了当前版本不渲染颜色/渐变信息只保留几何轮廓DriverDotPathBraille在param.getColor().isTransparent() false时才绘制DriverDotPathBraille.java即透明色路径会被跳过。八、源码地图继续深入阅读的入口如果你希望进一步研究或扩展 Braille 输出推荐按以下路径阅读格式定义与命令行src/main/java/net/sourceforge/plantuml/FileFormat.javaBRAILLE_PNG分支、后缀规则、src/main/java/net/sourceforge/plantuml/cli/CliFlag.java--braille标志绘图后端src/main/java/net/sourceforge/plantuml/braille/UGraphicBraille.java栅格与几何光栅化src/main/java/net/sourceforge/plantuml/braille/BrailleGrid.java、src/main/java/net/sourceforge/plantuml/braille/Coords.java字符映射src/main/java/net/sourceforge/plantuml/braille/BrailleChar.java、src/main/java/net/sourceforge/plantuml/braille/BrailleCharFactory.java文字度量src/main/java/net/sourceforge/plantuml/StringBounderBraille.java形状驱动src/main/java/net/sourceforge/plantuml/braille/Driver*.java共 6 个最终 PNG 绘制src/main/java/net/sourceforge/plantuml/braille/BrailleDrawer.java官方文档入口src/main/java/net/sourceforge/plantuml/braille/readme.md本文所依据的目录说明文档九、小结PlantUML 的 Braille 输出是一条完整独立的渲染管线命令行--braille/-tbraille→FileFormat.BRAILLE_PNG→StringBounderBraille盲文文字度量→UGraphicBrailleKlimt 后端注册 6 类驱动→BrailleGrid以quanta4为分辨率的点阵 递归细分光栅化→BrailleDrawer网格凸点 PNG。它把 UML 图翻译成触觉可读的盲文点阵是 PlantUML 面向无障碍场景的一个实验性功能其文字部分采用 Grade 1 盲文字母/数字/标点映射图形部分以矩形、横竖线与细分曲线为主椭圆、图片、斜线等暂不支持。理解这层文本 → 点位 → PNG的转换机制无论是用于无障碍方案集成、还是在此基础上扩展新的 Braille 图形支持都能做到有的放矢。赞分享开发工具文档【免费下载链接】plantumlGenerate diagrams from textual description项目地址https://gitcode.com/gh_mirrors/pl/plantuml点击查看免费下载相关推荐Linux Braille Console盲文控制台在内核早期引导阶段输出到 VisioBraille 设备Linux Braille Console盲文控制台在内核早期引导阶段输出到 VisioBraille 设备 导读 本文讲解 Linux 内核中的盲文控操作系统内核驱动驱动开发虚拟化嵌入式网络存储CPython 输入与输出Input and Output完整指南从格式化输出到文件读写与 JSON 持久化CPython 输入与输出Input and Output完整指南从格式化输出到文件读写与 JSON 持久化 导读 程序输出Output与输入Inp编程语言语言运行时解释器标准库PlantUML GraphML 导出深入解析从文本描述到标准图交换格式PlantUML GraphML 导出深入解析从文本描述到标准图交换格式 GraphML 是一种基于 XML 的通用图数据交换格式可被众多图分析工具如 y开发工具文档创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价