简单用python开发一个图片缩小和去背景工具

前段时间突然想做表情包,大概流程是通过sd生成图片然后做成表情包发布在微信平台。在发布之前需要将图片背景抠成透明,为了方便批量操作,我打算搞个脚本进行一键抠图。

抠图功能Koutu.py

from PIL import Image  
import os
import shutil

# 图片文件夹路径
input_folder = 'xxx\\input'
# 处理后图片保存的文件夹路径
output_folder = 'xxx\\output'

# 如果输出文件夹不存在,则创建它
if not os.path.exists(output_folder):
os.makedirs(output_folder)

# 遍历文件夹中的所有图片文件
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')):
# 构建图片文件的完整路径
file_path = os.path.join(input_folder, filename)

# 打开图片
with Image.open(file_path) as img:
# 转换图片到RGBA模式,支持透明通道
rgba_img = img.convert("RGBA")
pixels = rgba_img.load()
width, height = img.size

# 遍历图片的每一个像素
for y in range(height):
for x in range(width):
r, g, b, a = pixels[x, y]
# 检查像素是否是白色(#ffffff)
if r == 255 and g == 255 and b == 255:
# 将白色像素的alpha通道设置为0,即透明
pixels[x, y] = (r, g, b, 0)

# 构建输出文件的完整路径
output_file_path = os.path.join(output_folder, filename)
# 保存修改后的图片到新的文件夹中
rgba_img.save(output_file_path, "PNG") # 使用PNG格式以保留透明通道
print(f"Processed {filename} and saved to {output_file_path}")

#print("Finished processing all images in the folder.")
#删除所有不需要的图片
def delete_images_in_folder(folder_path, extensions):
for filename in os.listdir(folder_path):
file_path = os.path.join(folder_path, filename)
if os.path.isfile(file_path):
_, ext = os.path.splitext(filename)
if ext.lower() in extensions:
try:
os.remove(file_path)
print(f"Deleted {file_path}")
except Exception as e:
print(f"Failed to delete {file_path}: {e}")

# 定义要删除的图片扩展名
image_extensions = {'.jpg', '.jpeg', '.png', '.bmp', '.gif', '.tiff'}

# 删除指定文件夹中的图片
delete_images_in_folder(r"D:\82462\Desktop\newFile\input", image_extensions)
delete_images_in_folder(r"D:\82462\Desktop\newFile", image_extensions)

做完抠图功能之后上传的时候发现微信有限制图片的格式大小,所以我又加上了一个缩放功能。

并且实现缩放完成后再将图片存入input文件夹内。以便后续抠图。

以下是代码。

缩放功能suofang.py

from PIL import Image  
import os

# 原始图片文件夹路径
input_folder = 'xxx\\newFile'
# 缩放后图片保存的文件夹路径
output_folder = 'xxx\\input'

# 如果输出文件夹不存在,则创建它
if not os.path.exists(output_folder):
os.makedirs(output_folder)

# 遍历文件夹中的所有图片文件
for filename in os.listdir(input_folder):
if filename.lower().endswith(('.png', '.jpg', '.jpeg', '.tiff', '.bmp', '.gif')):
# 构建图片文件的完整路径
file_path = os.path.join(input_folder, filename)

# 打开图片
with Image.open(file_path) as img:
# 缩放图片到240px*240px大小
resized_img = img.resize((240, 240), Image.BICUBIC)

# 构建输出文件的完整路径和文件名
output_file_path = os.path.join(output_folder, filename)

# 保存缩放后的图片到输出文件夹
resized_img.save(output_file_path)
print(f"Resized {filename} to 240x240px and saved to {output_file_path}")

print("所有图片保存在input文件夹中.")

最后做一个gui页面方便使用play.py

import tkinter as tk  
from tkinter import messagebox
import subprocess
def koutu():
# 指定脚本的路径
script_path = "D:\\82462\\Desktop\\newFile\\koutu.py"
try:
# 使用subprocess执行Python脚本
subprocess.run(["python", script_path], check=True)
#messagebox.showinfo("Success", "Script executed successfully!")
except subprocess.CalledProcessError as e:
# 如果脚本执行出错,显示错误信息
messagebox.showerror("Error", f"Script execution failed with error: {e}")
except Exception as e:
# 处理其他可能的异常
messagebox.showerror("Error", f"An unexpected error occurred: {e}")
def suofang():
# 指定脚本的路径
script_path = "D:\\82462\\Desktop\\newFile\\suofang.py"
try:
# 使用subprocess执行Python脚本
subprocess.run(["python", script_path], check=True)
#messagebox.showinfo("Success", "Script executed successfully!")
except subprocess.CalledProcessError as e:
# 如果脚本执行出错,显示错误信息
messagebox.showerror("Error", f"Script execution failed with error: {e}")
except Exception as e:
# 处理其他可能的异常
messagebox.showerror("Error", f"An unexpected error occurred: {e}")

root = tk.Tk()

root.title("我的脚本")

button1 = tk.Button(root, text="点击抠图", command=koutu)
button2 = tk.Button(root, text="点击缩放", command=suofang)
button2.pack()
button1.pack()

root.mainloop()

通过pyinstaller --onefile --windowed player.py打包我们的py代码。--onefile代表单文件,--windowed代表不显示控制台。打包完的文件在dist文件夹中。

操作:

首先在文件夹中放一张白色背景的图片

image-20240803174032204

双击打开脚本

image-20240803174123406

先缩放图片,图片会保存在input中,再点击抠图,就能完成了。

image-20240803174108286

扣完图长这样,我觉得还是挺清晰的。

image-20240803174130854

image-20240803174156003