图生图
在图生图中,使用Stablediffusion的pipeline来构建Webui应用,如果直接把参数传给pipeline是无效的。 __call__
参数中虽然有单独的weight和height这两个参数,但最终图像尺寸实际上是由传入图片的尺寸决定的,因此需要定义函数来做原始图片的尺寸变换,达到用参数来控制输出图像尺寸的目的,这可以通过resize
调整图片尺寸大小来实现。
# 图片宽度和高度按照比例调整
def fn_resize_ratio(original_image, ratio):
original_width, original_height = original_image.size
new_width, new_height = int(ratio * original_width), int(ratio * original_height)
while not new_width%8==0:
new_width += 1
while not new_height%8==0:
new_height += 1
# Resize the image
resized_image = original_image.resize((new_width, new_height))
return resized_image, new_width, new_height
# 图片宽度和高度按照不同尺寸调整
def fn_resize_fixed(original_image, new_width, new_height):
resized_image = original_image.resize((new_width, new_height))
return resized_image
上传一张初始图片
图片宽度和高度按照比例调整,缩放到1.2倍,高度和高度同步变成1232。
图片宽度和高度按照不同尺寸调整,可以看到图片被「压扁」了。
图像编辑
Gradio 4.0以上的版本提供了ImageEditor的组件,可以很方便实现图片的裁剪,涂改等,非常适合图像编辑目的。
ImageEditor是一个图像组件,可用于上传和编辑图像(作为输入)或显示图像(作为输出)。
但是上传后的图像不是一个PIL.Image对象,而是变成一个字典。包含background、layers 和composite。background是上传的原始图像,layers表述的是当前层的操作的痕迹,如裁剪或者涂改
图像编辑器
图像做了涂鸦,右侧输出为涂鸦的区域
图像编辑器的层数,默认是1。如果需要多个涂鸦层,可以点击「+」号增加。不同的layer之间不会互相影响。
# 提取图像编辑器的涂鸦区域和原图
def save_mask(inputs):
layers = inputs['layers']
# layers[0]表示第一张mask
mask = layers[0]
new_image = Image.new('RGBA', mask.size, color='white').paste(mask, mask=mask).convert('RGB')
return ImageOps.invert(new_image), inputs['background']