news 2026/8/6 14:00:22

从组态软件到Web可视化:SagooIoT组态工具的工程化设计实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从组态软件到Web可视化:SagooIoT组态工具的工程化设计实践

从组态软件到Web可视化:SagooIoT组态工具的工程化设计实践

一、凌晨三点的电话

上周三凌晨三点,我被一阵急促的电话铃声惊醒。

电话那头是浙江一家注塑工厂的技术主管老周,声音里带着明显的焦躁:“平台又崩了!组态软件连不上PLC,产线上三台注塑机的实时数据全断了,夜班工人不知道模温是多少,模具差点废了 !”

这不是老周第一次半夜给我打电话。他们工厂用的是一套老牌的国产组态软件,部署在一台Windows工控机上。问题是那台工控机已经跑了五年没关过机,硬盘时不时报SMART错误。更要命的是,那套组态软件是2018年的版本,厂家早就停止维护了,连Windows 10的兼容性补丁都不再提供。

“老周,别急,我们上周不是帮你们把SagooIoT的平台搭起来了吗?组态功能模块上周五就上线了,你试试用浏览器打开。”

电话那头沉默了几秒,然后是键盘声。

“诶?打开了?这…这是网页?不是要装客户端吗?”

“不用,浏览器就能用。你看左边组件库里,我们把你们产线常用的注塑机模板、温度曲线组件、模具状态图都预置好了,拖进来绑定设备属性就行。”

十五分钟后,老周的产线大屏恢复了正常。他对着屏幕沉默了一会儿,然后说了一句让我至今难忘的话:

“我花了八万块买的组态软件,不如你们一个网页。”

这句话,也是我今天想和大家聊的话题——在万物互联的时代,传统的组态软件模式正在被Web可视化工具彻底颠覆,而SagooIoT在这个方向上,走在了所有开源物联网平台的前面。


二、传统组态软件的四大原罪

2.1 客户端枷锁:一套软件锁死一台机器

传统组态软件(如WinCC、组态王、力控、iFix等)都是典型的C/S架构。你需要:

  • 在每台需要查看画面的电脑上安装客户端
  • 购买对应的授权License(一个画面一个点都是钱)
  • 绑定特定的Windows版本(Win7还好,Win10/11就要各种兼容模式)

我曾经遇到一个最离谱的案例:某化工厂的车间主任想在家用iPad看一下产线状态,供应商报价——五万八,而且只支持Windows平板。

2.2 厂商锁定:换平台等于推倒重来

传统组态软件都有自己私有的工程文件格式。你花了三个月做的组态画面,换个品牌就是废纸。这种数据层面的厂商锁定,让工厂在技术选型上几乎没有议价能力。

更可怕的是,一旦原厂商停止维护(这在工控行业太常见了),你的整个SCADA系统就成了"僵尸系统"——能跑,但没人敢动。

2.3 协作困境:一个人的组态工程

传统组态的工程文件通常是二进制的,无法用Git管理版本。三个人同时改一个画面?不存在的。只能一个人改完,另一个人再改,然后手动合并——实际上大多数时候就是互相覆盖。

我在一个汽车零部件项目中见过最夸张的情况:一个组态画面被三个工程师交替修改,最后谁都记不清哪个版本是最新的,只能把三个人的修改重新做了一遍。

2.4 扩展无力:定制一个组件难于登天

传统组态软件的组件库是封闭的。如果内置的仪表盘不满足需求,你想自定义一个"带趋势预测的温控曲线"?要么花大价钱找厂商定制(周期3个月起),要么用基础控件拼凑(效果惨不忍睹),要么放弃。


三、SagooIoT的答案:Web原生组态

面对这些痛点,SagooIoT团队在V2版本中做了一个大胆的决策:不集成任何传统组态引擎,从零构建一个完全Web原生的可视化组态工具。

这个决策在当时看来很冒险——组态软件是一个极其成熟的领域,从零开始的工程量巨大。但我们的判断是:Web技术在2024年已经足够成熟,Canvas、SVG、WebSocket、WebAssembly等能力完全可以支撑工业级组态的需求。

3.1 设计理念:一切皆组件

SagooIoT组态工具的核心设计理念是:一切皆组件,组件皆可编排。

无论是一个温度仪表盘、一条实时曲线、一个设备状态指示灯,还是一个完整的生产线示意图——都是组件。组件有三要素:

要素说明示例
视图(View)组件的视觉呈现SVG图形、Canvas动画、图片
数据(Data)绑定的数据源设备属性、聚合计算、API数据
行为(Action)交互逻辑点击跳转、超限变色、弹窗告警

3.2 系统架构

┌─────────────────────────────────────────────────────┐ │ 组态编辑器 (Web) │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ 组件库 │ 画布引擎 │ 属性面板 │ 图层管理 │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ ├─────────────────────────────────────────────────────┤ │ 渲染引擎 │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ SVG渲染 │ Canvas │ WebGL │ CSS 3D │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ ├─────────────────────────────────────────────────────┤ │ 数据总线 (WebSocket) │ │ ┌──────────────────────────────────────────┐ │ │ │ 设备属性 → 数据映射 → 组件属性实时更新 │ │ │ └──────────────────────────────────────────┘ │ ├─────────────────────────────────────────────────────┤ │ 后端服务 │ │ ┌──────────┬──────────┬──────────┬──────────┐ │ │ │ 工程管理 │ 模板市场 │ 数据源管理│ 权限控制 │ │ │ └──────────┴──────────┴──────────┴──────────┘ │ └─────────────────────────────────────────────────────┘

3.3 组件体系设计

SagooIoT的组件库目前包含六大类别、超过60个预置组件:

组件库 ├── 图表类 │ ├── 折线图、柱状图、饼图、仪表盘 │ ├── 实时曲线、历史趋势 │ └── 雷达图、散点图、热力图 ├── 工业控件 │ ├── 管道、阀门、泵、电机 │ ├── 储罐(带液位动画)、传送带 │ └── 指示灯、开关、旋钮 ├── 数据展示 │ ├── 数字翻牌器、跑马灯 │ ├── 表格、列表、卡片 │ └── 状态标签、进度条 ├── 地图类 │ ├── 设备分布地图 │ ├── 轨迹回放 │ └── 电子围栏 ├── 媒体类 │ ├── 视频播放器(对接GB28181/RTSP) │ ├── 图片、轮播图 │ └── 3D模型查看器 └── 容器类 ├── Tab页签、分组面板 ├── 弹窗、抽屉 └── 自适应布局容器

每个组件都支持通过JSON Schema定义其可配置属性,这让组件具备了自我描述的能力——编辑器不需要硬编码任何组件的配置界面,一切都是数据驱动的。

3.4 数据绑定机制

这是组态工具最核心的能力,也是和"画图软件"的本质区别。SagooIoT实现了一套通用的数据绑定协议:

{"bindings":[{"target":"component.temperature.value","source":"device.property","deviceId":"dev_injection_molding_01","property":"mold_temp","transform":{"type":"linear","scale":1.0,"offset":0,"precision":1},"thresholds":[{"min":0,"max":180,"color":"#52c41a"},{"min":180,"max":210,"color":"#faad14"},{"min":210,"max":300,"color":"#f5222d"}]}]}

这段配置实现的效果是:当注塑机的模温属性变化时,组态画面上的温度仪表盘实时更新数值,并且在正常范围(0-180℃)显示绿色,预警范围(180-210℃)显示橙色,超限(210℃+)显示红色。

关键技术点

  1. 双向绑定:设备属性变化自动推送到组件,用户在组态画面上的操作(如点击开关)也可以下发指令到设备
  2. 数据变换:支持线性变换、公式计算、脚本处理等多种数据预处理方式
  3. 阈值告警:组件级别的阈值配置,颜色自动切换,无需依赖告警模块
  4. WebSocket实时推送:基于SagooIoT的消息总线,端到端延迟控制在100ms以内

四、实战案例:汽车零部件工厂的产线可视化改造

4.1 项目背景

宁波某汽车零部件工厂,有12条注塑生产线,每条线配备3~5台设备,总计约50台注塑机。原来的监控方案是:

  • 一台Windows工控机上运行某国产组态软件
  • 通过OPC DA协议采集PLC数据
  • 车间大屏通过VGA线延长器(30米!)投屏
  • 厂长办公室另外买了一台客户端授权

年授权费用:画面授权 + 驱动授权 + 客户端授权 =2.8万元/年

4.2 改造方案

我们使用SagooIoT替换了原有的组态系统:

对比维度原方案SagooIoT方案
部署方式Windows工控机 + 客户端Docker容器,浏览器访问
接入协议OPC DA(需额外驱动)MQTT直连(去掉中间层)
画面数量按授权(12个画面)无限制
客户端数量按授权(2个)无限制
移动端不支持响应式设计,手机/平板可用
异地访问VPN + 远程桌面HTTPS直接访问
画面开发客户端IDE(单人)浏览器在线编辑(多人协作)
版本管理手动备份.工程文件Git管理JSON工程文件
年度成本28,000元0元(开源)

4.3 组态画面设计

以"1号注塑生产线"画面为例,我们在一页中配置了以下组件:

┌──────────────────────────────────────────────────────┐ │ 1号注塑生产线 - 实时监控 2026-08-05 │ ├──────────────┬───────────────────┬───────────────────┤ │ 设备状态概览 │ 关键参数曲线 │ 产量统计 │ │ ┌──────────┐ │ 📈 模温趋势 │ 班产量: 1,247 件 │ │ │ ● 注塑机1 │ │ │ 合格率: 98.3% │ │ │ ● 注塑机2 │ │ 180℃ ──────── │ 节拍: 32.5s │ │ │ ● 注塑机3 │ │ │ │ │ │ ◐ 注塑机4 │ │ 时间 → │ 废品率趋势 ↓ │ │ │ ○ 注塑机5 │ │ │ │ │ └──────────┘ │ │ │ ├──────────────┴───────────────────┴───────────────────┤ │ 设备详情(点击设备节点切换) │ │ ┌─────────────────────────────────────────────┐ │ │ │ 注塑机 #1 │ 模温: 195℃ │ 压力: 82MPa │ 周期: 32s│ │ │ │ │ 射胶量: 245g │ 冷却时间: 12s │ │ │ └─────────────────────────────────────────────┘ │ └──────────────────────────────────────────────────────┘

整个画面从设计到上线,一个工程师花了不到4个小时,其中包括:

  • 30分钟:从模板库中克隆"注塑产线"模板
  • 1小时:根据实际设备布局调整组件位置和尺寸
  • 1.5小时:配置数据绑定(50台设备 × 平均5个属性 = 250个数据点)
  • 1小时:调试阈值颜色和告警联动

如果用原来的组态软件,同样的工作量至少需要2~3天。

4.4 意外收获:手机上的组态画面

改造完成后,最让工厂老板惊喜的不是大屏效果——而是他可以在手机上随时查看产线状态。

因为SagooIoT的组态工具采用响应式设计,组态画面会自动适配不同屏幕尺寸。老板在出差的高铁上,打开手机浏览器就能看到每个车间的实时产量。

"这个功能,原来的组态软件报价三万多,还只能看不能操作。"老板笑着说。


五、技术深潜:组态编辑器的核心实现

5.1 画布引擎

画布是组态编辑器的核心。SagooIoT选择了SVG + HTML混合渲染的方案:

// 组件渲染的核心抽象classWidgetRenderer{constructor(canvas,widget){this.canvas=canvas// 画布容器this.widget=widget// 组件定义this.container=null// DOM容器this.bindings=newMap()// 数据绑定关系}// 创建组件DOM结构mount(){this.container=document.createElement('div')this.container.className='scada-widget'this.container.style.cssText=this.computeStyle()// 根据组件类型选择渲染方案switch(this.widget.type){case'chart':this.renderChart()// Canvas (ECharts)breakcase'svg-shape':this.renderSvg()// SVGbreakcase'video':this.renderVideo()// HTML5 Videobreakdefault:this.renderHtml()// HTML}this.canvas.appendChild(this.container)this.setupBindings()}// 建立数据绑定setupBindings(){this.widget.bindings.forEach(binding=>{// 订阅设备属性变化constunsubscribe=dataBus.subscribe(`device.${binding.deviceId}.${binding.property}`,(value)=>this.onDataChange(binding,value))this.bindings.set(binding.target,unsubscribe)})}// 数据变化时更新组件onDataChange(binding,value){// 应用数据变换consttransformed=this.applyTransform(value,binding.transform)// 根据阈值更新样式constcolor=this.evaluateThresholds(transformed,binding.thresholds)// 更新组件显示this.updateDisplay(binding.target,transformed,color)}}

5.2 组件热加载

SagooIoT的组件库支持热加载,你可以随时上传自定义组件,无需重启服务:

// 自定义组件的描述文件 component.json{"name":"注塑机状态面板","id":"injection-molding-panel","version":"1.0.0","icon":"🏭","category":"工业控件","props":{"deviceId":{"type":"string","label":"绑定设备"},"showTrend":{"type":"boolean","default":true,"label":"显示趋势"},"refreshInterval":{"type":"number","default":5,"label":"刷新间隔(秒)"}},"render":"render.js","style":"style.css"}

组件的渲染逻辑是一个独立的JS模块:

// render.js - 自定义组件的渲染逻辑exportdefaultfunctionrender(container,props,dataBus){const{deviceId,showTrend,refreshInterval}=props// 创建DOM结构container.innerHTML=`<div class="inj-panel"> <div class="inj-header"> <span class="inj-name" id="device-name">加载中...</span> <span class="inj-status" id="device-status"></span> </div> <div class="inj-body"> <div class="inj-metric"> <label>模温</label> <span id="mold-temp" class="metric-value">--</span> </div> <div class="inj-metric"> <label>压力</label> <span id="pressure" class="metric-value">--</span> </div> <div class="inj-metric"> <label>周期</label> <span id="cycle-time" class="metric-value">--</span> </div> </div>${showTrend?'<div class="inj-trend" id="trend-chart"></div>':''}</div>`// 订阅设备数据dataBus.subscribe(`device.${deviceId}.name`,(name)=>{document.getElementById('device-name').textContent=name})dataBus.subscribe(`device.${deviceId}.mold_temp`,(val)=>{constel=document.getElementById('mold-temp')el.textContent=val+'℃'el.className=`metric-value${val>210?'danger':val>180?'warning':'normal'}`})dataBus.subscribe(`device.${deviceId}.pressure`,(val)=>{document.getElementById('pressure').textContent=val+' MPa'})dataBus.subscribe(`device.${deviceId}.cycle_time`,(val)=>{document.getElementById('cycle-time').textContent=val+'s'})dataBus.subscribe(`device.${deviceId}.status`,(status)=>{constel=document.getElementById('device-status')el.textContent=status==='online'?'● 在线':'○ 离线'el.className=status==='online'?'status-online':'status-offline'})// 趋势图(可选)if(showTrend){constchart=echarts.init(document.getElementById('trend-chart'))dataBus.subscribe(`device.${deviceId}.mold_temp.history`,(data)=>{chart.setOption({xAxis:{type:'time',show:false},yAxis:{type:'value',show:false},series:[{data:data,type:'line',smooth:true,areaStyle:{opacity:0.3},lineStyle:{width:1.5}}]})})}}

5.3 工程文件版本化

这是传统组态软件做不到的能力。SagooIoT的组态工程文件是纯JSON格式,天然支持Git版本管理:

# 一个典型的组态工程目录结构scada-project/ ├── project.json# 工程元信息├── pages/ │ ├── line-1.json# 1号产线画面│ ├── line-2.json# 2号产线画面│ └── overview.json# 总览画面├── templates/# 自定义模板│ ├── injection-machine.json │ └── conveyor-belt.json ├── components/# 自定义组件│ └── custom-gauge/ │ ├── component.json │ ├── render.js │ └── style.css └── .git/

这意味着:

  • 多人协作:两个工程师可以同时编辑不同画面,Git自动合并
  • 版本回滚:画面改坏了?git revert一键恢复
  • 变更审计:谁在什么时候改了什么,Git log一目了然
  • CI/CD集成:组态画面可以走标准的代码审查和自动化测试流程

六、踩过的三个大坑

6.1 SVG性能陷阱

问题:第一个版本中,我们使用纯SVG渲染所有组件。当组态画面上的组件超过200个时,浏览器的帧率从60fps掉到15fps以下,操作画布时明显卡顿。

原因:SVG的每个元素都是一个DOM节点,200个组件意味着上千个DOM节点。在数据刷新时(每秒10次),大量DOM更新触发了频繁的重排重绘。

解决方案

  • 静态组件(背景、管道、文字标签)使用SVG,一次性渲染后不再更新
  • 动态组件(仪表盘、实时曲线、数字翻牌器)使用Canvas渲染
  • 视频组件使用HTML5 Video标签
  • 实现了一个脏矩形检测机制,只重绘变化的区域

改造后,300个组件的画面也能稳定在55fps以上。

6.2 WebSocket断线重连的数据一致性

问题:生产线上的WiFi环境不稳定,WebSocket偶尔会断开。重连后,组件显示的数值和实际设备值不一致。

解决方案:实现了全量同步+增量更新的双通道机制:

  • 重连成功后,先拉取一次全量数据快照,确保所有组件回到正确状态
  • 然后再切换到增量推送模式
  • 每个数据包都带有序列号,客户端自动检测丢包并请求补发
// 数据总线中的重连逻辑classDataBus{reconnect(){this.ws=newWebSocket(this.url)this.ws.onopen=()=>{// 第一步:请求全量同步this.ws.send(JSON.stringify({type:'SYNC_FULL',devices:this.getAllDeviceIds(),seq:this.lastSeq}))}this.ws.onmessage=(event)=>{constmsg=JSON.parse(event.data)if(msg.type==='SYNC_FULL_RESP'){// 第二步:批量更新所有绑定this.applyFullSync(msg.data)this.mode='incremental'// 第三步:切回增量模式}elseif(msg.type==='DATA_UPDATE'&&this.mode==='incremental'){// 正常增量更新this.applyUpdate(msg.data)this.lastSeq=msg.seq}}}}

6.3 不同分辨率下的布局适配

问题:工厂大屏是1920×1080,车间工控机是1366×768,老板手机是390×844。同一个组态画面在这三种设备上要么变形,要么显示不全。

解决方案:实现了三套布局策略

  1. 等比缩放模式(大屏专用):画面整体等比缩放填充屏幕,不出现滚动条
  2. 流式布局模式(桌面端):组件相对位置不变,尺寸按百分比计算
  3. 堆叠布局模式(移动端):组件自动换行,从上到下排列

这三种模式在工程配置中设定,组态编辑器自动预览不同分辨率下的效果。


七、为什么竞品没有组态工具?

让我们横向对比一下主流开源物联网平台:

特性SagooIoTThingsBoardEdgeX FoundryMainflux
仪表盘✅ 内置组态✅ 基础仪表盘❌(需第三方)
可视化配置✅ Web组态编辑器
工业组件库✅ 60+组件
自定义组件✅ 热加载⚠️ 有widget系统
多分辨率适配✅ 三模式⚠️ 有限
工程版本管理✅ Git/JSON
视频集成✅ GB28181/RTSP
模板市场✅ 在线模板库

ThingsBoard有仪表盘(Dashboard)功能,但它本质上是"图表排版工具",而不是"工业组态工具"。它缺少:工业组件库(管道、阀门、电机等)、实时数据驱动的动画效果、设备控制的双向交互。

EdgeX FoundryMainflux作为更纯粹的后端平台,几乎没有可视化能力,需要第三方工具配合。

SagooIoT的独特之处在于:它将组态工具作为一等公民内置在平台中,而且在以下方面做到了竞品没有的深度:

  • 工业场景原生组件(不是通用图表组件改的)
  • 双向数据绑定(不仅能看,还能控制设备)
  • 在线模板市场(开箱即用,不需要从零画)

八、未来的方向

组态工具团队正在推进几个令人兴奋的方向:

8.1 3D数字孪生

基于Three.js/WebGL,实现产线的3D数字孪生。不再是平面的管道图,而是可以旋转、缩放、点击设备查看详情的立体模型。目前已经在注塑产线场景中完成了原型验证。

8.2 AI辅助组态

利用大语言模型理解自然语言描述,自动生成组态画面。比如你说"帮我做一个注塑车间的监控画面,左边是设备列表,中间是大屏图表,右边是告警列表",AI就能自动从组件库中选择合适的组件并完成基础布局。

8.3 低代码组态

将组态编辑器的能力抽象为低代码平台的组件编排能力,让非工业场景也能受益。比如:数据中心的机柜监控、办公楼的能耗管理、冷链物流的温度监控——只要有数据绑定的可视化需求,就能用组态工具搞定。

8.4 离线组态

结合SagooIoT的边缘计算能力,组态画面可以在边缘网关本地运行。即使云端断网,车间大屏依然能正常显示设备数据。


九、总结

回到文章开头老周的那个电话。

传统组态软件困在"安装包+授权文件+工控机"的枷锁里太久了。在云计算和Web技术已经深入各行各业的2026年,一个需要装客户端、绑定Windows系统、按画面收年费的工业软件,本身就是一种技术负债。

SagooIoT的Web组态工具,试图回答一个问题:工业可视化能不能像用Figma做UI设计一样简单?

我们的答案是:可以,而且应该更简单。因为组态的本质不是"画画",而是"把设备和数据用最直观的方式呈现给需要看的人"——这件事,Web技术已经做得足够好了。

浏览器打开即用,不需要安装。
JSON工程文件,Git管理版本。
在线模板市场,开箱即用。
手机、平板、大屏、PC,一个画面适配所有设备。
开源免费,没有按画面/按客户端/按年的授权费。

如果你正在为工厂的组态软件续费而头疼,或者正在规划新的产线可视化项目,不妨试试SagooIoT。

项目地址
在线文档
在线演示


本文是SagooIoT系列技术文章的第11篇。相关系列文章:《从if-else到拖拽连线:可视化规则引擎》《从硬编码到热插拔:插件架构》《从"能看"到"好看能用":数据大屏设计哲学》《从告警风暴到精准治理:告警系统演进之路》《从协议巴别塔到统一语言:多协议接入层》《从云端到边缘:边缘计算架构落地实践》《从版本混乱到一键升级:OTA固件升级》《从监控孤岛到视联一体:视频监控中心》等。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/6 13:55:29

库存 SQL 忽快忽慢,别先怪索引:把 WHERE 函数冲突拆成可复现实验

同一条库存查询有时走索引、有时全表扫描&#xff0c;常被归因于“优化器不稳定”。更常见的原因是 WHERE 中的类型转换、日期函数或字符串函数改变了谓词形态&#xff0c;再叠加参数类型、数据分布和统计信息&#xff0c;最终产生不同计划。本文用可搜索条件、隐式转换和区间边…

作者头像 李华
网站建设 2026/8/6 13:54:39

终极指南:如何用FanControl实现Windows风扇精准控制

终极指南&#xff1a;如何用FanControl实现Windows风扇精准控制 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/F…

作者头像 李华
网站建设 2026/8/6 13:51:28

终极英雄联盟客户端自动化指南:三分钟告别繁琐登录

终极英雄联盟客户端自动化指南&#xff1a;三分钟告别繁琐登录 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power &#x1f680;. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 你是否厌倦了每次玩英雄联盟时重…

作者头像 李华
网站建设 2026/8/6 13:47:46

Horos医学影像软件:macOS上免费的DICOM查看器完全指南

Horos医学影像软件&#xff1a;macOS上免费的DICOM查看器完全指南 【免费下载链接】horos Horos™ is a free, open source medical image viewer. The goal of the Horos Project is to develop a fully functional, 64-bit medical image viewer for OS X. Horos is based up…

作者头像 李华
网站建设 2026/8/6 13:46:37

终极指南:用CycleGAN实现漫画自动上色的完整方案

终极指南&#xff1a;用CycleGAN实现漫画自动上色的完整方案 【免费下载链接】Manga-colorization---cycle-gan Tutorial about the use of cycle-gan to colorize a manga 项目地址: https://gitcode.com/gh_mirrors/ma/Manga-colorization---cycle-gan 还在为黑白漫画…

作者头像 李华