吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2152|回复: 11
收起左侧

[Python 原创] 自动填充PS选区

  [复制链接]
喵哈哈 发表于 2025-1-30 04:19
使用photoshop画画需要给线稿上色的时候,线条不闭合的情况下填充会越界,要么使用选区界定,要么修补线稿,或者直接用笔刷画都比较麻烦
写这个小工具可以把快速选择工具、魔棒、套索等直接填充颜色
1.gif
2.gif
image.png
代码:
[Python] 纯文本查看 复制代码
import win32com.client
import pythoncom
import PySimpleGUI as sg
from time import sleep
from threading import Thread

CONNECT_STAT = "未连接"
SWITCH_ON = False
STAY_TOP = False
FILL_MODE = 0
EXPAND = 0.0
SEL_BOUNDS = ""
CLOSE_THREAD = False
RE_CONNECT = False


def connect_ps():
    global CONNECT_STAT
    ps = None
    try:
        pythoncom.CoInitialize()
        ps = win32com.client.Dispatch("Photoshop.Application")
    except pythoncom.com_error as e:
        CONNECT_STAT = e.args[1]
    else:
        CONNECT_STAT = "已连接:" + ps.Application.Name + " " + ps.Version
    finally:
        return ps


def auto_fill():
    global SEL_BOUNDS, RE_CONNECT
    ps = connect_ps()
    while not CLOSE_THREAD:
        sleep(0.5)
        if RE_CONNECT:
            ps = connect_ps()
            RE_CONNECT = False
        # 主处理
        if ps and SWITCH_ON:
            try:
                # 获取填充对象
                match FILL_MODE:
                    case 0:
                        fill_mode = ps.ForegroundColor
                    case 1:
                        fill_mode = ps.BackgroundColor
                    case _:
                        fill_mode = ps.ForegroundColor
            except pythoncom.com_error as e:
                SEL_BOUNDS = e.args[1]
                continue
            try:
                sel = ps.ActiveDocument.Selection
            except pythoncom.com_error:
                SEL_BOUNDS = "错误:可能当前没有打开文件"
                continue
            try:
                # 检测选区是否存在
                bounds = sel.Bounds
            except pythoncom.com_error:
                SEL_BOUNDS = "未检测到选区"
                continue
            else:
                SEL_BOUNDS = str(bounds)
            if EXPAND:
                try:
                    # 扩展填充范围
                    expand_val = EXPAND
                    sel.Expand(expand_val)
                except pythoncom.com_error as e:
                    SEL_BOUNDS = e.args[1]
                    continue
            try:
                # 填充
                sel.Fill(fill_mode)
                sel.Deselect()
            except pythoncom.com_error as e:
                SEL_BOUNDS = e.args[1]
                continue
    pythoncom.CoUninitialize()


def create_window():
    sg.theme("DarkPurple")
    sg.SetOptions(font=("Microsoft YaHei", 10))
    layout = [
        [sg.Button("重连"), sg.Text(CONNECT_STAT, key="CONNECT_STAT")],
        [sg.HorizontalSeparator()],
        [sg.Button("启用"), sg.Button("禁用", disabled=True), sg.Text(SEL_BOUNDS, key="SEL_BOUNDS")],
        [sg.Radio("前景色", key="前景色", group_id=1, default=True),
         sg.Radio("背景色", key="背景色", group_id=1)],
        [sg.Text("越界填充:"),
         sg.Spin(list(range(51)), key="EXPAND", size=5), sg.Text("像素")],
        [sg.HorizontalSeparator()],
        [sg.Button("置顶", key="STAY_TOP"), sg.Push(), sg.Button("关闭")]
    ]
    window = sg.Window("PS选区填充", layout)
    return window


def main():
    global SWITCH_ON, FILL_MODE, STAY_TOP, CLOSE_THREAD, RE_CONNECT, EXPAND
    fill_thread = Thread(target=auto_fill, name="FillThread")
    fill_thread.start()
    window = create_window()
    while True:
        event, values = window.read(timeout=100)
        print(event, values)
        # 窗口事件处理
        match event:
            case "重连":
                RE_CONNECT = True
            case "启用":
                SWITCH_ON = True
                window["启用"].update(disabled=True)
                window["禁用"].update(disabled=False)
            case "禁用":
                SWITCH_ON = False
                window["启用"].update(disabled=False)
                window["禁用"].update(disabled=True)
            case "STAY_TOP":
                if STAY_TOP:
                    window["STAY_TOP"].update("置顶")
                    window.keep_on_top_clear()
                    STAY_TOP = False
                else:
                    window["STAY_TOP"].update("取消置顶")
                    window.keep_on_top_set()
                    STAY_TOP = True
            case None | "关闭":
                break
        # 窗口数值处理
        if values["前景色"]:
            FILL_MODE = 0
        if values["背景色"]:
            FILL_MODE = 1
        EXPAND = float(values["EXPAND"])
        # 更新文本
        window["CONNECT_STAT"].update(CONNECT_STAT)
        window["SEL_BOUNDS"].update(SEL_BOUNDS)
    CLOSE_THREAD = True
    fill_thread.join()
    window.close()


if __name__ == "__main__":
    main()

打包:
https://pan.baidu.com/s/1LbDJgnxuv4v29QAns038dQ?pwd=5q5n

免费评分

参与人数 6吾爱币 +11 热心值 +6 收起 理由
苏紫方璇 + 7 + 1 欢迎分析讨论交流,吾爱破解论坛有你更精彩!
红蓝黄 + 1 + 1 谢谢@Thanks!
aa20221101 + 1 + 1 热心回复!
helh0275 + 1 + 1 感谢发布原创作品,吾爱破解论坛因你更精彩!
yanglinman + 1 谢谢@Thanks!
Shenyx110 + 1 + 1 谢谢@Thanks!

查看全部评分

本帖被以下淘专辑推荐:

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

ZZZHe 发表于 2025-1-30 09:09
感谢分享
IDdongdong 发表于 2025-1-30 10:00
wsasecy 发表于 2025-1-30 12:19
sunyboy 发表于 2025-1-30 13:46
谢谢分享
512829889 发表于 2025-1-30 13:55
谢谢楼主分享!
ajt2520 发表于 2025-1-30 14:15
感谢,很实用的工具
samniboy 发表于 2025-1-30 14:43
感谢楼主分享~~
bannalaoguan 发表于 2025-1-30 17:55
很实用的小工具哦!谢谢楼主!
yinhuazuimeng 发表于 2025-1-31 00:48
有趣 看看新版本支不支持
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - 52pojie.cn ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2026-4-18 08:30

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表