本地运行的 RGB 转 CMYK 小工具,基于 Flask + Pillow + ICC 色彩管理。支持印刷 ICC、手动调整、条带预览与批量输出;文件不离开本机。
| 能力 | 说明 |
|---|---|
| 印刷 CMYK | 使用 ICC 将 sRGB 映射到目标印刷 CMYK,非简单伪转换 |
| 激光打印机(RGB 输出) | 可选仅输出 sRGB 优化图,不转四色,适合桌面彩机 |
| 多种 ICC 预设 | FOGRA、ISO、ECI、日本、北美等(具体以 Web 界面列表为准,可自上传) |
| 手动调整 | 亮/对比/饱和/色温、四色偏移、TAC 总墨量限制 |
| 三档模拟 + 条带 | 屏幕 / 激光模拟 / 印刷·CMYK 软打样;左右对比预览 |
| 成品预览 | 转换完成后可加载「成品图」到右侧,与条带同逻辑的高清预览 |
| 灯箱放大 | 点击条带可拉高清、缩放平移(适应窗口 / 1:1) |
| 本地运行 | 数据不上公网,适合内网/离线环境 |
- Python 3.10+(3.8+ 通常也可,以本机测试为准)
- 首次使用需 安装依赖;ICC 可运行
python download_profiles.py或按界面提示准备profiles/
双击 start.bat,会依次:
- 结束占用 5000 端口的旧进程(避免改代码后仍跑旧服务)
pip install -r requirements.txt- 启动
python app.py并打开浏览器
在命令行中亦可:
pip install -r requirements.txt
python download_profiles.py # 首次或缺少 ICC 时
python app.py浏览器访问:http://127.0.0.1:5000 。停止服务:运行窗口中按 Ctrl+C。
| 模式 | 说明 |
|---|---|
| 印刷厂·CMYK | 走 RGB →(ICC)→ CMYK,可输出 TIFF / JPEG / PDF,建议嵌入 ICC 以便印厂/软件正确解读 |
| 激光打印机·RGB | 在 RGB 空间做预补偿,输出带 sRGB ICC 的 JPEG/PNG/TIFF,适合直接打驱动 |
在界面顶部切换;激光模式会套用一套默认建议参数,并可与「激光」条带模拟对照。
- 左:当前图的 RGB(或屏幕模式下与右侧同源)
- 右:依所选 模拟 从服务端生成 JPEG 条带图(长边有下限,避免过糊),浏览器用
<img>显示,与下载文件走同一套色彩管线后再缩小分辨率 - 三种模拟
- 屏幕显示:仅原图,不做分色模拟
- 激光打印机:纯 RGB 观感模拟(与印刷 ICC 不同管线)
- 印刷·CMYK:先 CMYK 再软打样为屏显 sRGB,便于与印刷意匠对照
- 点击放大:再请求更高
max_side的图进灯箱,可缩放、拖拽;若觉与条带略有色差,多为缩放与不同查看器对 CMYK 的解读差异(见常见问题)
说明:早期文档若写「最长边 600px」或「Canvas 绘制」已过时;当前以仓库内
app.py与templates/index.html为准。
- 选择 非「简单数学 / basic」 且
profiles/中 存在对应 ICC 时,CMYK 导出会尽量 内嵌该 ICC 字节 到 JPEG/TIFF(以及 PDF 内嵌图)。 - 选择 基础转换 时,不内嵌印刷 ICC;各软件可能按内置公式把 CMYK 当屏显,观感会与软打样条带有差别。
- 激光(RGB)导出:在支持时内嵌 sRGB 配置。
- 转换成功后,队列中会标注 「已内嵌 ICC」/「未内嵌 ICC」(接口字段
icc_embedded),便于核对。
内置/可选印刷标准的名称、标签以 Web 页面 ICC 区 为准(含 ECI ISO、PSO、非涂布、日本/北美等);亦可 上传自定义 .icc / .icm(界面「上传」入口)。
色彩转换要点(实现上)
- 优先使用
ImageCms.buildTransform建链,失败时回退到profileToProfile等,减轻部分环境报cannot build transform的问题。 - 条带/灯箱里的 CMYK→sRGB 与「成品图浏览器预览」尽量 同一类 profileToProfile 多意图重试,减少条带过亮/过白与下载后在其他软件中观感不一致。
- RGB 阶段:亮度、对比度、饱和度、色温(在 ICC 转 CMYK 之前)。
- CMYK 阶段:C/M/Y/K 通道微调(%),TAC 总墨量上限(如 300%),超限时按比例压墨。
- 界面可加载 预设、保存/恢复自己的参数组合等(以页面为准)。
输入
JPG、PNG、TIFF、BMP、WEBP、PDF(多页按页处理)。
输出(印刷模式)
TIFF(LZW)、JPEG(高质)、PDF(内嵌 CMYK 图像,版式按 300DPI 换算等逻辑)。
输出(激光模式)
JPEG、PNG、TIFF,嵌入 sRGB ICC(如生成成功)。
支持多文件入队、逐条转换;每条成功后可单文件下载,全部结束后可 ZIP 打包下载(以界面按钮为准)。
若仓库内包含 manifest.json(Manifest V3),可在 Chrome/Edge 开发者模式下 「加载已解压的扩展」 指向本项目目录,使用弹窗内 RGB / HEX 与 CMYK 大致换算 等能力(与主站转换引擎独立,精度以扩展内说明为准)。
| 路径 | 说明 |
|---|---|
app.py |
Flask 应用:上传、转换、预览、下载、API |
templates/index.html |
单页前端(条带、灯箱、调整区、队列表) |
start.bat |
Windows 一键装依赖、杀旧进程、启服务 |
requirements.txt |
Python 依赖 |
download_profiles.py |
拉取/准备 ICC 的辅助脚本 |
profiles/ |
放 ICC 的目录,界面也可上传至此 |
uploads/ |
临时上传(转换后清理) |
outputs/ |
转换结果(可自行定期清理) |
manifest.json 等 |
浏览器扩展(若使用) |
| 包 | 用途 |
|---|---|
| flask | Web 与路由 |
| Pillow | 图像、ICC、编码 |
| PyMuPDF (fitz) | PDF 光栅化 |
| reportlab | 生成内嵌图片的 PDF |
| numpy | 通道与 TAC 的像素运算 |
- 大图可先按
proc_limit在入 ICC 前限边,以控制内存,再与全尺寸意匠对齐。 - 条带/灯箱预览为 sRGB JPEG;下载的 CMYK 文件在不同查看器里会按各自 CMS 转屏,与浏览器里看到的条带不会像素级相同,属正常现象。
- TAC 为四通道 0–255 求和后超过阈值则整体缩放。
- PDF 输入:按设定 DPI 渲染为 RGB 再走同一套转 CMYK 流程。
更细的公式与管线以源码注释为准。
Q:预览比下载更亮/更白?
A:预览是软打样到 sRGB 的图;下载是 CMYK(+内嵌 ICC)。浏览器与 Photoshop/ACDSee 的转换链不同,会存在观感差。已尽量让条带与「成品预览」用相近的 profileToProfile 流程;选择 带 ICC 的印刷预设 并在支持 ICC 的软件里看下载文件,最接近印刷意图。
Q:报 cannot build transform?
A:多由 ICC 与 LCMS 组合不兼容导致。已增加多意图/多旗标重试与回退;仍失败时请换 ICC 或更新 Pillow,把完整错误信息发 Issue。
Q:基础模式与带 ICC 差别?
A:基础模式快,但不内嵌印刷 ICC,色彩仅作粗映射;正式出片请选 ECI/FOGRA/PSO 等并保证 profiles/ 文件存在。
Q:能加自己的 ICC 吗?
A:可以。在页面 上传自定义 ICC 或把 .icc 放进 profiles/ 后刷新列表。
Q:outputs 会占满硬盘吗?
A:转换结果会累积在 outputs/,可手工删除,不影响程序。
Q:为什么要先杀 5000 端口再启?
A:避免旧 python app.py 未退出,你改了代码却仍在用旧进程,条带/接口行为不更新。
本附录保留与实现对照的细项,正文其它章节保持摘要叙述;实现以 app.py 为准,此处便于查表、审阅与版本对比(含原先较长的 ICC 说明表与色温/通道公式)。
| profile_id | 分组 | 标签 | 对应 ICC 文件名 | 说明 |
|---|---|---|---|---|
basic |
通用 | — | (无,不加载 ICC) | 简单数学公式,无色彩管理,速度最快,色彩略偏黄 |
iso_v2 |
国际标准 | 国内通用 | ISOcoated_v2_eci.icc |
ISO 12647-2:2004 铜版纸国际标准,国内大多数印厂的参考基准 |
iso_v2_300 |
国际标准 | 国内推荐 | ISOcoated_v2_300_eci.icc |
ISO Coated v2 限墨 300% 版本,适合高密度铜版纸,国内印厂交付首选 |
pso_v3 |
国际标准 | 最新标准 | PSOcoated_v3.icc |
ISO 12647-2:2013 最新欧洲标准,色域更宽、暗部更丰富,替代 FOGRA39 |
fogra39 |
欧洲 | 经典 | CoatedFOGRA39.icc |
ISO 12647-2:2004/Amd1 欧洲铜版纸经典标准,色彩稳定,兼容性最广 |
fogra27 |
欧洲 | — | CoatedFOGRA27.icc |
旧版欧洲铜版纸标准,色域稍宽,适合兼容老工作流 |
pso_uncoated |
非涂布纸 | 非涂布纸 | PSO_Uncoated_ISO12647_eci.icc |
非涂布纸(胶版纸、书写纸)标准,TAC 260%,适合书籍、文件印刷 |
iso_uncoated |
非涂布纸 | 新闻纸 | ISOuncoatedyellowish.icc |
偏黄调非涂布纸标准,适合新闻纸、低克重印刷,TAC 240% |
lwc |
非涂布纸 | 杂志纸 | PSO_LWC_Improved_eci.icc |
轻量涂布纸(杂志纸)标准,介于铜版纸与胶版纸之间 |
japan_color |
日本 | 动漫/插画 | JapanColor2001Coated.icc |
日本铜版纸标准,冷色还原准,适合动漫/插画/机甲,Y 通道偏低 |
gracol |
北美 | 北美 | CoatedGRACoL2006.icc |
北美铜版纸标准(G7),黑色更深,适合北美印厂 |
swop |
北美 | — | USWebCoatedSWOP.icc |
北美网版印刷标准,Y 通道偏高偏黄,不建议用于精细作品 |
profiles/ 中其它 .icc / .icm 由界面以 custom:文件名 使用,不列入上表。文件需实际存在,列表中才会为「可用」。
在 ICC 转 CMYK 之前 执行。brightness / contrast / saturation / warmth 取值约 -100~+100(界面滑块范围以页面为准),未实现的项视为 0。
| 项 | 实现要点 |
|---|---|
| 亮度 | factor = 1 + brightness/100,ImageEnhance.Brightness 的 enhance(max(0, factor)) |
| 对比度 | factor = 1 + contrast/100,ImageEnhance.Contrast 同上 |
| 饱和度 | factor = 1 + saturation/100,ImageEnhance.Color 同上(与 Pillow 的 Color 增强一致) |
色温 warmth |
负值偏冷/减黄,正值偏暖。令 shift = warmth × 0.8(浮点),则 R' = clip(R + shift, 0, 255),B' = clip(B − shift × 0.6, 0, 255),G 不变;与物理白点重标定不同,为快捷观感调整 |
在 ICC 得到 CMYK 之后 应用。c_offset~k_offset 为 -30~+30(单位 %);tac 为总墨量上限(如 240~340,单位 %)。
- 通道偏移:每个偏移量
offset(%)对应整型增量int(offset × 2.55)(向零截断)加到该通道 0–255 上并裁剪。 - TAC:
tac_val = tac × 2.55;若C+M+Y+K > tac_val的像素,将四色同乘tac_val / (C+M+Y+K)以压到上限内。
(若全通道无偏移且 tac ≥ 340,函数会直接返回,不做像素运算。)
默认预补偿(LASER_DEFAULT_ADJ,用于「激光打印机·RGB」导出的未覆盖项):
| 键 | 值 |
|---|---|
| brightness | 7 |
| contrast | 5 |
| saturation | 10 |
| warmth | -3 |
| c/m/y/k_offset | 0 |
| tac | 300 |
条带「激光打印机」模拟(simulate_laser_print 使用的 _LASER_SIM,与胶印软打样刻意区分,不经 ICC 分色):
| 键 | 值 | 说明(摘自源码注释意涵) |
|---|---|---|
| brightness | 0.78 | Pillow 亮度增强因子 |
| saturation | 0.58 | Color 增强因子 |
| contrast | 1.14 | 对比度增强因子 |
| warm_r / warm_g / warm_b | 6 / 3 / -14 | 轻微暖纸、略压蓝,再裁剪到 0–255 |
| blur | 0.85 | GaussianBlur 半径,模拟办公机+纸的略糊 |
- 大图可先按
proc_limit限边再进 ICC,与全尺寸意匠策略一致。 - 若实现与本文附录有任何不一致,以
app.py当前代码为唯一权威;修订代码时可同步更新本附录表格。
本工具按「依原样」提供;印刷色彩以印厂实机打样为准。使用第三方 ICC 时请遵守其版权与许可要求。