Prompt line formatting breaks on import from stable diffusion image

从 Stable Diffusion 生成的 PNG 图片导入提示词时,Krita AI Diffusion 插件读取到的 Prompt 会丢失所有换行符,原因是 Qt 的 QImageReader 在读取 PNG 文本块时会自动剥离 \n。优先排查方向是确认你使用的 PNG 元数据读取路径是否经过

快速结论:从 Stable Diffusion 生成的 PNG 图片导入提示词时,Krita AI Diffusion 插件读取到的 Prompt 会丢失所有换行符,原因是 Qt 的 QImageReader 在读取 PNG 文本块时会自动剥离 \n。优先排查方向是确认你使用的 PNG 元数据读取路径是否经过 QImageReader。

适用环境:已确认在 Krita AI Diffusion 插件 1.52.1、Krita 5.2.x、Windows 11 环境下触发;报错与显卡、CUDA 或 Python 版本无直接关联。

最快修复方案:暂无确认的一步修复方案。开发者在 Issue 中表示 Qt 读写 PNG 元数据时剥离换行符是平台限制,目前没有好的解决方案,且该问题优先级较低。若急需恢复换行,可先手动在插件外编辑 Prompt 或使用支持保留换行的其他导入途径。

注意事项:开发者提到已有代码通过手动写入 PNG 元数据来规避写入端的换行问题,但导入端尚未有同类绕过方案;若社区提交 PR 且改动不大,开发者愿意合并,但目前没有已合并的修复版本。

问题场景

用户使用 Stable Diffusion WebUI(txt2img)生成图片后,将 PNG 文件导入 Krita AI Diffusion 插件以复用生成参数。插件从 PNG 元数据中读取 parameters 文本块并填充到 Prompt 输入框时,原本多行的提示词(例如包含多个 LoRA 触发词或用换行分隔的负面词条)全部被合并成单行,导致排版信息丢失。

报错原文

Prompt line formatting breaks on import from stable diffusion image

# 用户用 Python 复现的根因验证代码
from PyQt5.QtGui import QImageReader
from PIL import Image

path = "my-sd-image.png"
print(Image.open(path).info["parameters"].count("\n"))   # 24 — what's in the file
print(QImageReader(path).text("parameters").count("\n")) # 0  — what the plugin gets

原因分析

根据 Issue 讨论,问题根源是 Qt 的 QImageReader 在解析 PNG 文件中的文本块(tEXt 等 chunk)时,会主动剥离换行符 \n,导致插件在读取 parameters 元数据字段之前,换行信息就已经丢失。用户提供的验证代码明确证明了这一点:同样的 PNG 文件,用 PIL 读取时能统计到 24 个换行符,而经过 QImageReader 读取后换行符数量为 0。开发者补充说明,Qt 的图像读写器在写入 PNG 元数据时也存在同样的问题,目前没有好的通用解法;虽然项目已有手动写入 PNG 元数据以绕过写入端限制的代码,但导入端尚缺乏类似的替代实现。

环境排查

  • Krita AI Diffusion 插件版本:1.52.1(已确认触发)
  • Krita 版本:5.2.x(已确认触发)
  • 操作系统:Windows 11(已确认触发)
  • 复现依赖:PyQt5(QImageReader)、Pillow(PIL,用于对比验证元数据内容)
  • 注意:该问题与显卡型号、CUDA 版本、PyTorch 版本无关

解决步骤

  1. 验证是否确实存在换行丢失:用文本编辑器打开 SD 生成的 PNG 文件,或在 Python 中用 PIL 执行 Image.open(path).info["parameters"],确认源文件元数据中确实包含 \n 换行符。
  2. 用 Python 复现 Qt 的读取行为:按上述报错原文中的代码执行 QImageReader(path).text("parameters"),对比换行符数量是否为 0。如果为 0,则确认是 QImageReader 的剥离行为导致。
  3. 确认插件版本:如果你使用的插件版本正是 1.52.1,可升级到最新稳定版查看是否已包含修复;截至 Issue 关闭时(2026-08-19),开发者并未在讨论中提供已合并的修复方案。
  4. 临时规避(可优先尝试):在把图片放入 Krita 之前,先用脚本把 PNG 中的 parameters 元数据里的换行符替换为其他占位符(例如 ___BR___),导入插件后再在 Prompt 编辑框中手动替换回换行。该方法绕开了 QImageReader 的剥离逻辑,但需要额外操作。
  5. 若希望根治:可参考项目中已有的“手动写入 PNG 元数据”代码思路,为导入路径实现一个绕过 QImageReader 的读取函数,并提交 Pull Request 给上游。开发者在 Issue 中表示,如果代码量不大且不影响稳定性,愿意合并。

验证方法

将 PNG 导入 Krita AI Diffusion 后,检查 Prompt 输入框中原本的多行文本是否恢复为多行显示。更精确的验证方式是:对导入前后插件实际拿到的字符串执行换行符计数(例如在插件日志或调试输出中检查 \n 数量),确认与源文件元数据中的数量一致(用户示例中为 24)。

参考来源

Acly/krita-ai-diffusion #2565:Prompt line formatting breaks on import from stable diffusion image

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 19150

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注