feat 结果图宽度自适应

fix
This commit is contained in:
zhouchengrong
2024-08-02 11:17:07 +08:00
parent 1bb1e1d649
commit 7254f3ae31
2 changed files with 27 additions and 7 deletions

View File

@@ -97,9 +97,9 @@ def process_object(cfg, process_id, total):
# uploaded_images.append({'image_obj': layer['pattern_image'], 'image_url': layer['pattern_image_url'], 'image_type': 'pattern_image'}) # uploaded_images.append({'image_obj': layer['pattern_image'], 'image_url': layer['pattern_image_url'], 'image_type': 'pattern_image'})
# if 'mask' in layer.keys() and layer['mask'] is not None and layer['mask_url'] is not None: # if 'mask' in layer.keys() and layer['mask'] is not None and layer['mask_url'] is not None:
# uploaded_images.append({'image_obj': layer['mask'], 'image_url': layer['mask_url'], 'image_type': 'mask'}) # uploaded_images.append({'image_obj': layer['mask'], 'image_url': layer['mask_url'], 'image_type': 'mask'})
layers, new_size = update_base_size_priority(layers, body_size)
# 合成 # 合成
items_response['synthesis_url'] = synthesis(layers, body_size, basic_info) items_response['synthesis_url'] = synthesis(layers, new_size, basic_info)
for lay in layers: for lay in layers:
items_response['layers'].append({ items_response['layers'].append({
@@ -177,3 +177,19 @@ def upload_images(image_obj):
rgba_image[rgba_image[:, :, 0] == 0] = [0, 0, 0, 0] rgba_image[rgba_image[:, :, 0] == 0] = [0, 0, 0, 0]
req = oss_upload_image(bucket=bucket_name, object_name=object_name, image_bytes=cv2.imencode('.png', rgba_image)[1]) req = oss_upload_image(bucket=bucket_name, object_name=object_name, image_bytes=cv2.imencode('.png', rgba_image)[1])
return image_obj['image_url'] return image_obj['image_url']
def update_base_size_priority(layers, size):
# 计算透明背景图片的宽度
min_x = min(info['position'][1] for info in layers)
x_list = []
for info in layers:
if info['image'] is not None:
x_list.append(info['position'][1] + info['image'].width)
max_x = max(x_list)
new_width = max_x - min_x
new_height = 700
# 更新坐标
for info in layers:
info['position'] = (info['position'][0], info['position'][1] - min_x)
return layers, (new_width, new_height)

View File

@@ -63,14 +63,18 @@ def synthesis(data, size, basic_info):
# 创建底图 # 创建底图
base_image = Image.new('RGBA', size, (0, 0, 0, 0)) base_image = Image.new('RGBA', size, (0, 0, 0, 0))
try: try:
all_mask_shape = (size[1], size[0]) all_mask_shape = (size[1], size[0])
body_mask = None body_mask = None
for d in data: for d in data:
if d['name'] == 'body': if d['name'] == 'body':
body_mask = np.array(d['image'].split()[3]) # 创建一个新的宽高透明图像, 把模特贴上去获取mask
left_shoulder = basic_info['body_point_test']['shoulder_left'] transparent_image = Image.new("RGBA", size, (0, 0, 0, 0))
right_shoulder = basic_info['body_point_test']['shoulder_right'] transparent_image.paste(d['image'], (d['position'][1], d['position'][0]), d['image']) # 此处可变数组会被paste篡改值所以使用下标获取position
body_mask = np.array(transparent_image.split()[3])
# 根据新的坐标获取新的肩点
left_shoulder = [x + y for x, y in zip(basic_info['body_point_test']['shoulder_left'], [d['position'][1], d['position'][0]])]
right_shoulder = [x + y for x, y in zip(basic_info['body_point_test']['shoulder_right'], [d['position'][1], d['position'][0]])]
body_mask[:min(left_shoulder[1], right_shoulder[1]), left_shoulder[0]:right_shoulder[0]] = 255 body_mask[:min(left_shoulder[1], right_shoulder[1]), left_shoulder[0]:right_shoulder[0]] = 255
_, binary_body_mask = cv2.threshold(body_mask, 127, 255, cv2.THRESH_BINARY) _, binary_body_mask = cv2.threshold(body_mask, 127, 255, cv2.THRESH_BINARY)
top_outer_mask = np.array(binary_body_mask) top_outer_mask = np.array(binary_body_mask)
@@ -118,7 +122,7 @@ def synthesis(data, size, basic_info):
mask_data = np.where(all_mask > 0, 255, 0).astype(np.uint8) mask_data = np.where(all_mask > 0, 255, 0).astype(np.uint8)
mask_alpha = Image.fromarray(mask_data) mask_alpha = Image.fromarray(mask_data)
cropped_image = Image.composite(test_image, Image.new("RGBA", test_image.size, (255, 255, 255, 0)), mask_alpha) cropped_image = Image.composite(test_image, Image.new("RGBA", test_image.size, (255, 255, 255, 0)), mask_alpha)
base_image.paste(test_image, (0, 0), cropped_image) base_image.paste(test_image, (0, 0), cropped_image) # test_image 已经按照坐标贴到最大宽值的图片上 坐着这里坐标为00
else: else:
base_image.paste(layer['image'], (layer['position'][1], layer['position'][0]), layer['image']) base_image.paste(layer['image'], (layer['position'][1], layer['position'][0]), layer['image'])