Skip to content

Script类定义可以在modules/scripts.py中找到。要创建自己的自定义脚本,请创建一个实现该类的Python脚本,并将其放入scripts文件夹中,可以使用下面的示例或文件夹中的其他脚本作为指南。

Script类有四个主要方法,下面详细描述了这些方法,并提供了一个简单的示例脚本,用于旋转和/或翻转生成的图像。

import modules.scripts as scripts
import gradio as gr
import os

from modules import images
from modules.processing import process_images, Processed
from modules.processing import Processed
from modules.shared import opts, cmd_opts, state


class Script(scripts.Script):  

# 脚本的标题。这将显示在下拉菜单中。
    def title(self):

        return "翻转/旋转输出"


# 通过返回值确定脚本应在下拉菜单中显示的时机。例如:
# 如果当前选项卡是img2img,则is_img2img为True;如果是txt2img,则为False。
# 因此,返回is_img2img以仅在img2img选项卡上显示脚本。

    def show(self, is_img2img):

        return is_img2img

脚本在UI中的显示方式。请参阅https://gradio.app/docs/#components了解可以使用的不同UI组件以及如何创建它们。

大多数UI组件可以返回一个值,例如复选框的布尔值。

返回的值将作为参数传递给run方法。

def ui(self, is_img2img): angle = gr.Slider(minimum=0.0, maximum=360.0, step=1, value=0, label="角度") hflip = gr.Checkbox(False, label="水平翻转") vflip = gr.Checkbox(False, label="垂直翻转") overwrite = gr.Checkbox(False, label="覆盖现有文件") return [angle, hflip, vflip, overwrite]

这是实现额外处理的地方。参数包括self,模型对象“p”(一个StableDiffusionProcessing类,参见processing.py)和ui方法返回的参数。

可以在这里定义自定义函数,并导入其他库以在处理中使用。返回值应该是一个Processed对象,这是process_images方法返回的内容。

def run(self, p, angle, hflip, vflip, overwrite):

# 函数接受Processed对象中的图像,以及来自UI的角度和两个布尔值,表示水平和垂直翻转,然后返回相应旋转和翻转的图像
def rotate_and_flip(im, angle, hflip, vflip):
    from PIL import Image

    raf = im

    if angle != 0:
        raf = raf.rotate(angle, expand=True)
    if hflip:
        raf = raf.transpose(Image.FLIP_LEFT_RIGHT)
    if vflip:
        raf = raf.transpose(Image.FLIP_TOP_BOTTOM)
    return raf


# 如果overwrite为false,则使用“basename”参数将旋转信息附加到文件名中,并保存在相同的目录中。
# 如果overwrite为true,则停止模型保存其输出,并保存旋转和翻转后的图像。
basename = ""
if(not overwrite):
    if angle != 0:
        basename += "旋转_" + str(angle)
    if hflip:
        basename += "_水平翻转"
    if vflip:
        basename += "_垂直翻转"
else:
    p.do_not_save_samples = True


proc = process_images(p)

# 旋转和翻转处理后的每个图像
# 使用images.py中的save_images方法保存它们。
for i in range(len(proc.images)):
proc.images[i] = rotate_and_flip(proc.images[i], angle, hflip, vflip)

images.save_image(proc.images[i], p.outpath_samples, basename,
proc.seed + i, proc.prompt, opts.samples_format, info=proc.info, p=p)

return proc
proc.images[i] = rotate_and_flip(proc.images[i], angle, hflip, vflip)

images.save_image(proc.images[i], p.outpath_samples, basename,
proc.seed + i, proc.prompt, opts.samples_format, info=proc.info, p=p)

return proc