Files
knuknX-ComfyUI-Image-Tools/batch_resize_loader.py
T
chengxuan.cx 21187a02e4 initialize
BatchImageResizeProcessor:load images from input path and resize it
SingleImagePathLoader:load single image from path
SingleImageUrlLoader:load single image from url
2023-12-07 17:01:42 +08:00

82 lines
3.7 KiB
Python

import os
import cv2
import numpy as np
from rembg import remove
def single_load_and_resize(input_image_path, output_image_path, target_width=512, target_height=768):
# 读取图片
image = cv2.imread(input_image_path, cv2.IMREAD_UNCHANGED)
original_height, original_width = image.shape[:2]
# 如果输入图片的高度超过768,则保持宽高比压缩图片到高度为768
# 计算缩放比例
scale = target_height / original_height
# 等比例缩放图片
new_width = int(original_width * scale)
new_height = target_height
image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_AREA)
# 压缩后的图片宽度处理
if new_width > target_width:
# 如果宽度超过512,从图片中间截取512宽度
start_x = (new_width - target_width) // 2
image = image[:, start_x:start_x + target_width]
elif new_width < target_width:
# 如果宽度小于512,用透明像素填充2侧到512
pad_left = (target_width - new_width) // 2
pad_right = target_width - new_width - pad_left
# 确保图像是BGRA格式
if len(image.shape) == 2: # 灰度图像需要转换为颜色图像才能填充透明像素
print(input_image_path+"image shape = 2")
image = cv2.cvtColor(image, cv2.COLOR_GRAY2BGRA)
elif image.shape[2] == 3: # RGB图像需要添加Alpha通道
print(input_image_path+"image shape[2] = 3")
image = cv2.cvtColor(image, cv2.COLOR_BGR2BGRA)
# 创建左右透明边框
alpha_channel_left = np.zeros((new_height, pad_left, 4), dtype=image.dtype)
alpha_channel_left[:, :, 3] = 255 # 设置Alpha通道为不透明
alpha_channel_right = np.zeros((new_height, pad_right, 4), dtype=image.dtype)
alpha_channel_right[:, :, 3] = 255 # 设置Alpha通道为不透明
# 水平堆叠图像和透明边框
image = np.hstack((alpha_channel_left, image, alpha_channel_right))
# 修复透明通道,使其为透明
image[:, :, 3] = 0
image[:, pad_left:pad_left + new_width, 3] = 255
# 去除背景
image = remove(image, bgcolor=(255, 255, 255, 255), alpha_matting_erode_size=1)
# 保存调整后的图片
cv2.imwrite(output_image_path, image)
def batch_load_and_resize(input_dir_path, output_dir_path, output_prefix, target_width=512, target_height=768):
count = 1
# 遍历输入文件夹下的所有文件,并将他们全部转换成png格式放到临时文件夹中
for filename in os.listdir(input_dir_path):
filepath = os.path.join(input_dir_path, filename)
tmppath = os.path.join(input_dir_path, 'tmp')
if not os.path.exists(tmppath):
os.makedirs(tmppath)
# 检查文件是否是图片文件
if os.path.isfile(filepath) and filename.lower().endswith(('.jpg', '.jpeg', '.png', '.gif', '.webp')):
# 打开图像
img = cv2.imread(filepath, cv2.IMREAD_UNCHANGED)
# 构建输出文件路径,将扩展名改为.png
output_filepath = os.path.join(tmppath, str(count) + '.png')
# 将图像保存为PNG格式
cv2.imwrite(output_filepath, img)
count = count + 1
# 遍历临时文件夹下的所有文件,调整他们的大小
count = 1
result_files = []
for filename in os.listdir(tmppath):
target_file = os.path.join(output_dir_path,output_prefix+"_"+str(count)+".png")
print(filename,"-->",target_file)
filepath = os.path.join(tmppath, filename)
single_load_and_resize(filepath,target_file,target_width,target_height)
count = count + 1
result_files.append(target_file)
return result_files