2025年2月2日-qt程序
做了什么
试着添加了websocket适配,现在可以切换http和websocket。
优化了图片查看器。
感想
comfyui的api和我理解的不一样,我以为是有两套,一套http,一套websocket,实际上只有一套。传递大部分信息都是http,实时获取队列状态(以及一些插件,例如服务器状态实时监控)是走websocket。看了一圈,没有一个api是纯走websocket的(也没有必要都走websocket…)。
comfyui的api需要自定义工作流所有东西,这点有点麻烦。我希望的是有一个简洁明了的、效果足够好的、直接返回图片的接口。可配置项都用默认配置。
CheckpointLoaderSimple节点的模型需要自定义,万一服务器没有某个模型的话,有点难办,因为模型的效果我不知道。命名也可能不标准。
之后的工作
1、comfyui api 适配
现在的想法是提供一个简单但是有效的默认配置文件,单独拎出来,不要和其他api的放在一起。其中可以有一个简单的工作流,连接已经固定,只能修改其中参数。节点:
- 一个lora节点
- 一个遮罩节点
- 两个文本节点,即prompt 和 negative prompt
- 模型节点
- 尺寸,批次大小,即EmptyLatentImage
- 采样器节点,KSampler,可以配置采样器种类、种子、步数
- 一个上传图片、图生图的节点
- 其他不可配置的节点
应当通过一个单独的窗口提供可配置选项:
- lora名称选择
- 遮罩
- 是否有遮罩
- 遮罩图片上传
- 文本通过共用的TextEdit进行设置
- 模型选择
- 尺寸,批次大小
- 采样器种类、种子、步数
- 种子应当可以设置为随机
- 步数应当是一个滑动条
- 应当可以配置是文生图还是图生图
- 或者直接根据是否有参考图判断是文生图还是图生图
2、请求历史
应当有一个请求历史记录列表,数据存放在output文件夹的文件中。
应当可以通过一个独立的窗口查看请求历史,并打开对应的图片、查看对应的prompt。
问题在于要如何保证请求和output文件夹中文件的一一对应。假设存储历史请求的文件不会被修改,但是可能被删除,且output中的文件可能被修改。
初步想法是通过json保存请求数据及prompt、文件名,若文件不存在则不显示且提示文件已被移除,若存在则打开。
也可以以请求为一条记录,放在数据库中。
3、图片窗口改进
目前已经实现:
- 拖拽
- 滚动移动
- ctrl+滚动:缩放,且以鼠标为中心
- ctrl+0:查看全图
- ctrl+1:恢复默认大小
- 右键菜单:复制、打开路径、另存为
需要实现:
- 空格:关闭窗口
- 将以往的图片窗口合并,便于在程序中查看,而不是需要转到文件资源管理器里看。
- 例如,左边一个侧栏,显示缩略图,page up和page down移动选择,选中的图片将会在右边的label中显示。
- 可能的问题:内存占用过大
- 可能的解决方法:程序只加载缩略图和部分图片,切换图片时从硬盘实时读取
- 需要在内存中保存图片名称和缩略图
- 图片有一个生存期,一定时间后会释放该图片所占用内存。
- 有一个最大内存占用,占用过大的时候会按时间倒序释放内存。
- 这两项可以被配置
- 切换到一张图片的时候,将会直接放大缩略图,显示在label中。从本地读取完成之后用读到的高清图覆盖,否则提示文件不存在。
- 可能的问题:卡顿
- 因为和硬盘交互再写入内存慢于直接从内存加载
- 而且缩略图制作需要时间
- 为此,可能需要多线程
- 但是多线程会占用更多资源
- 可能的解决方法:程序只加载缩略图和部分图片,切换图片时从硬盘实时读取
- 或许可以将其和历史记录查看器合并
- 分为:本次画图 和 此前的画图
- 在内存中载入:
- 缩略图
- 图片名称
- prompt
- 在本地保存:
- 图片名称
- prompt
- “此前的画图” 启动时加载:
- 本地文件
- 对应的图片,用于计算得到缩略图,计算完成后释放
- 可能占用很多资源
- “本次画图” 启动时不加载任何东西,在收到响应的时候才加载缩略图,并自动保存请求到本地
4、本地数据使用数据库管理
大部分数据库,包括sqlite,可以保存blob数据,也就是说可以保存图片及其缩略图。且不会像文件一样被轻易修改。
这意味着可以把图片和文本数据(例如请求时间,prompt)统一管理。
程序中需要有批量导出、删除图片数据的功能。
但是配置文件应当是一个可以方便地修改的文件。
计划
- 先实现comfyui api适配
- 数据统一使用数据库保存
- 增加历史请求查看功能