diff --git a/app/service/design_pre_processing/service.py b/app/service/design_pre_processing/service.py index 7a3974a..4c55997 100644 --- a/app/service/design_pre_processing/service.py +++ b/app/service/design_pre_processing/service.py @@ -58,7 +58,21 @@ class DesignPreprocessing: if len(image.shape) == 2: image = cv2.cvtColor(image, cv2.COLOR_GRAY2RGB) elif image.shape[2] == 4: # 如果是四通道 mask - image = image[:, :, :3] + # 分离RGB和Alpha通道 + bgr = image[:, :, :3] + alpha = image[:, :, 3] + + # 创建白色背景(也可改为其他颜色,如(255,255,255)就是白色) + background_color = (255, 255, 255) + background = np.full_like(bgr, background_color) + + # 将Alpha通道转换为掩码(0=透明,255=不透明) + alpha_mask = alpha / 255.0 # 归一化到0-1 + alpha_mask = np.expand_dims(alpha_mask, axis=-1) # 扩展维度,方便广播计算 + + # 混合背景和原图:透明区域显示背景色,不透明区域显示原图 + image = (bgr * alpha_mask + background * (1 - alpha_mask)).astype(np.uint8) + # 此时image已经是3通道RGB,无需再执行image = image[:, :, :3] obj["image_obj"] = image return image_list @@ -174,8 +188,9 @@ class DesignPreprocessing: scale = 0.4 if waist_width / scale >= image_width: add_width = int((waist_width / scale - image_width) / 2) - ret = cv2.copyMakeBorder(image['obj'], 0, 0, add_width, add_width, cv2.BORDER_CONSTANT, value=(256, 256, 256)) - image_bytes = cv2.imencode(".jpg", ret)[1].tobytes() + ret = cv2.copyMakeBorder(image['obj'], 0, 0, add_width, add_width, cv2.BORDER_CONSTANT, value=(255, 255, 255)) + img_rgba = cv2.cvtColor(ret, cv2.COLOR_RGB2RGBA) + image_bytes = cv2.imencode(".png", img_rgba)[1].tobytes() # image['show_image_url'] = f"{image['image_url'].split('/', 1)[0]}/{self.minio_client.put_object(image['image_url'].split('/', 1)[0], image['image_url'].split('/', 1)[1].replace('.', '-show.'), io.BytesIO(image_bytes), len(image_bytes), content_type='image/jpeg').object_name}" bucket_name = image['image_url'].split('/', 1)[0] object_name = image['image_url'].split('/', 1)[1].replace('.', '-show.')