首页/新闻资讯/正文详情

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

发布时间:2026/9/23 6:22:50 来源:云帆数科 栏目:资讯中心
PlantUML 盲文输出格式(Braille Output)深入解析:从 `--braille` 命令行到 `UGraphicBraille` 栅格化实现
开发工具文档【免费下载链接】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),仅供参考

相关推荐

FCPX插件高效剪辑实战指南:从安装到交付全流程
FCPX插件高效剪辑实战指南:从安装到交付全流程

1. 先补一堂基础课:FCPX插件的安装与运行机制身边不少刚转用FCPX的朋友,第一反应就是去各大插件站疯狂下载,然后直接双击安装,装完重启软件发现插件没出现,就开始怀疑是不是软件坏了。这个流程本身没错,但你… · 2026/9/23 6:22:44

达芬奇免费版与Studio版对比:功能差异与升级建议
达芬奇免费版与Studio版对比:功能差异与升级建议

1. 先搞清楚:免费版和Studio版到底差在哪里1.1 版本定位:不要用“免费”两个字小看了这个巨头先说我做了这么多年剪辑调色后的总判断:达芬奇免费版在剪辑、调色、音频、合成这几条主线上,能覆盖绝大多数短视频和企业宣传片的制作需… · 2026/9/23 6:22:44

成都链家网API重构避坑指南:保姆级教程助你快速上手
成都链家网API重构避坑指南:保姆级教程助你快速上手

成都链家网API重构避坑指南:保姆级教程助你快速上手 版本升级后 API 全变了,后端接口文档还停留在半年前,前端同事对着报错日志抓狂。别慌,这篇保姆级教程专治各种“接口失踪”疑难杂症,带你从混乱中杀出重围。… · 2026/9/23 6:22:44

3天搞定久草免费视频焦在线在线入门到精通实战
3天搞定久草免费视频焦在线在线入门到精通实战

3天搞定久草免费视频焦在线在线入门到精通实战 版本升级后 API 全变了,代码直接报红,这种绝望感谁懂?很多开发者卡在“入门到精通”的过渡期,不是概念不懂,而是环境适配和接口调用细节坑太多。今天不聊虚的,直接拆解一个基于… · 2026/9/23 12:30:07

用StrictMode来检测SQLite的泄漏leaked优秀排错方法:TaoToken统一Key接入AI工具链的配置骨架
用StrictMode来检测SQLite的泄漏leaked优秀排错方法:TaoToken统一Key接入AI工具链的配置骨架

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 12:30:07

3个技巧让防护软件源码解析快500%
3个技巧让防护软件源码解析快500%

3个技巧让防护软件源码解析快500% 配置环境就卡半天?别急,问题往往不在机器,而在你对防护软件底层逻辑的理解偏差。很多开发者一上来就装各种工具,结果内存爆满、CPU狂转,最后只能重装系统。其实,通过源码解析,你会发现防护软件的瓶颈大多集中… · 2026/9/23 12:30:01

苹果查找朋友源码解析: 3步看懂定位逻辑完整示例
苹果查找朋友源码解析: 3步看懂定位逻辑完整示例

苹果查找朋友源码解析: 3步看懂定位逻辑完整示例 面试被问“苹果查找朋友”底层原理时,90%的人卡壳。别慌,今天拆解核心代码,附 完整示例 ,让你面试对答如流。 入口定位:从UI到Core的调用链 “苹果查找朋友”(Find My… · 2026/9/23 12:30:01

Razzle 插件 razzle-plugin-php 实战:在 Universal React 应用中用 Babel 编译 PHP 代码
Razzle 插件 razzle-plugin-php 实战:在 Universal React 应用中用 Babel 编译 PHP 代码

Razzle 插件 razzle-plugin-php 实战:在 Universal React 应用中用 Babel 编译 PHP 代码 【免费下载链接】razzle ✨ Create server-rendered universal JavaScript applications with no configuration 项目地址: https://gitcode.com/gh_mirrors/ra/razzle … · 2026/9/23 12:30:01

5步搞懂 xlsxwriter 底层原理 新手必备速查手册
5步搞懂 xlsxwriter 底层原理 新手必备速查手册

5步搞懂 xlsxwriter 底层原理 新手必备速查手册 刚学会 Python 语法,面对 Excel 需求却不知如何下手?别慌,这份 xlsxwriter 速查手册直接带你拆解底层逻辑,解决“懂语法但不会搭项目”的痛点。… · 2026/9/23 12:29:48

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码