大家好,在当今的数字化时代,产品图片在电子商务和市场营销中发挥着至关重要的作用。然而,为在线平台准备产品图片可能是一项耗时的任务,本文将分享一个Python脚本,用于自动化产品图片的图像处理工作流程。通过使用Python Imaging Library(PIL)
和rembg
库,可以实现删除图片背景,裁剪图片以适应产品尺寸,调整图片大小,并创建具有特定大小和颜色的新画布。
脚本概述
今天本文要讨论的脚本遵循以下步骤:
使用rembg
库删除图片背景。
裁剪图片,仅包含产品尺寸。
调整裁剪后的图片到指定的大小,同时保持宽高比。
创建具有指定大小和颜色的新画布。
将调整大小后的产品图片粘贴到新画布上。
安装和使用
要运行脚本,需要安装PIL(Pillow)
库和rembg
库。你可以使用pip
安装它们:
pip install pillow rembg
要使用该脚本,请按照以下步骤操作:
将你的产品图片放置在指定的文件夹和子文件夹中。
在脚本中更新folder_dir
变量,以使其指向包含你的产品图片的文件夹。
使用Python解释器运行脚本。
脚本将处理文件夹及其子文件夹中的所有产品图片,应用前面提到的图像处理步骤。处理后的图像将进行保存,并在原始文件名后附加“_Processed
”后缀。
函数解释
append_id(filename)
def append_id(filename):
p = Path(filename)
return "{0}_{2}{1}".format(Path.joinpath(p.parent, p.stem), ".png", "Processed")
此函数会在输出图像文件名附加一个ID。它以原始文件名作为输入,并返回附加了“_Processed
”后缀的修改后的文件名。这有助于区分处理后的图像和原始图像。
autocrop_image(img, border=0)
def autocrop_image(img, border=0):
bbox = img.getbbox()
img = img.crop(bbox)
(scale, height) = img.size
scale += border * 2
height += border * 2
cropped_image = Image.new("RGBA", (scale, height), (0, 0, 0, 0))
cropped_image.paste(img, (border, border))
return cropped_image
此函数通过删除任何不必要的空白或背景来自动裁剪图像,它接受一个输入图像img
和一个可选border
参数(默认为0),该参数用于在裁剪后的图像周围添加额外的填充。其使用img.getbbox()
计算图像的边界框,将图像裁剪为边界框的内容,然后创建一个适当大小的新图像以容纳裁剪后的图像和边框,最后将裁剪后的图像粘贴到新图像上,并返回裁剪后的图像结果。
resize_image(img, myScale)
def resize_image(img, myScale):
img_width, img_height = img.size
if img_height > img_width:
hpercent = (myScale/float(img_height))
wsize = int((float(img_width)*float(hpercent)))
resized_img = img.resize((wsize, myScale), Image.Resampling.LANCZOS)
if img_width > img_height:
wpercent = (myScale/float(img_width))
hsize = int((float(img_height)*float(wpercent)))
resized_img = img.resize((myScale, hsize), Image.Resampling.LANCZOS)
return resized_img
此函数可在保持宽高比的同时缩放图像,接受输入图像img
和所需缩放比例myScale
。首先函数根据比较图像的高度和宽度来确定图像是纵向还是横向,然后使用所需的比例计算出相应的调整大小的尺寸,最后使用img.resize()
根据计算出的尺寸调整图像大小,并返回调整大小后的图像。
resize_canvas(img, canvas_width, canvas_height)
def resize_canvas(img, canvas_width, canvas_height):
old_width, old_height = img.size
x1 = int(math.floor((canvas_width - old_width) / 2))
y1 = int(math.floor((canvas_height - old_height) / 2))
mode = img.mode
if len(mode) == 1:
new_background = (255)
if len(mode) == 3:
new_background = (255, 255, 255)
if len(mode) == 4:
new_background = (255, 255, 255, 255)
newImage = Image.new(mode, (canvas_width, canvas_height), new_background)
newImage.alpha_composite(
img, ((canvas_width - old_width) // 2, (canvas_height - old_height) // 2))
return newImage
此函数可调整画布大小并将图像放置于其中,它接受输入图像img
、画布宽度canvas_width
和画布高度canvas_height
。该函数根据画布尺寸与图像尺寸之间的差异,计算出将图像居中放置于画布上所需的位置,然后创建一个具有指定画布尺寸和根据图像模式确定的适当背景色的新图像。最后在计算出的位置将输入图像粘贴到新图像上,并返回调整画布尺寸后的图像。
process_files(folder_dir)
def process_files(folder_dir):
for entry in os.scandir(folder_dir):
if entry.is_file() and entry.name.lower().endswith(image_extensions):
image_path = entry.path
img = Image.open(image_path)
output_path = append_id(image_path)
removedBGimage = remove(img, True)
croppedImage = autocrop_image(removedBGimage, 0)
resizedImage = resize_image(croppedImage, 700)
combinedImage = resize_canvas(resizedImage, 1000, 1000)
combinedImage.save(output_path)
elif entry.is_dir():
process_files(entry.path)
此函数可处理指定文件夹及其子文件夹中的文件,以folder_dir
作为输入,函数使用os.scandir()
迭代遍历文件夹中的每个条目。如果条目是一个文件并且具有受支持的图像扩展名,它使用Image.open()
打开该图像,然后通过调用append_id()
函数生成输出路径,使用rembg
库中的remove()
函数删除图像背景,自动裁剪图像,调整图像大小,创建新画布,并将处理后的图像保存到输出路径。如果条目是一个目录,则它递归调用process_files()
函数以处理子目录中的文件。
本文探讨了一个Python脚本,用于自动化产品图片的图像处理。通过充分利用PIL
和rembg
的功能,可以删除图像背景、裁剪图像、调整图像大小并创建新画布,以获得精美和专业的外观。通过自动化这一工作流程,可以节省准备产品图片用于各种电子商务和市场营销平台的时间和精力。