From c18f45e549bfc4d81b9e2ad17b0e50c2778ea6d4 Mon Sep 17 00:00:00 2001 From: zcr Date: Tue, 6 Jan 2026 12:00:58 +0800 Subject: [PATCH] =?UTF-8?q?feat=20:=20design=20=E5=8D=95=E5=93=81=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=20=E9=95=9C=E5=83=8F=E6=97=8B=E8=BD=AC=E5=8A=9F?= =?UTF-8?q?=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/service/design_fast/utils/organize.py | 4 +++ .../design_fast/utils/synthesis_item.py | 27 ++++++++++++++++++- docker-compose.yml | 14 +++++++++- logging_env.py | 15 +++++++---- 4 files changed, 53 insertions(+), 7 deletions(-) diff --git a/app/service/design_fast/utils/organize.py b/app/service/design_fast/utils/organize.py index 2e5ce49..f9dafd3 100644 --- a/app/service/design_fast/utils/organize.py +++ b/app/service/design_fast/utils/organize.py @@ -37,6 +37,8 @@ def organize_clothing(layer): pattern_image=layer['pattern_image'], # back_perspective_url=layer['back_perspective_url'] if 'back_perspective_url' in layer.keys() else "" + transpose=layer.get("transpose", None), + rotate=layer.get('rotate', 0), ) # 后片数据 back_layer = dict(priority=-layer.get("priority", 0) if layer.get("layer_order", False) else PRIORITY_DICT.get(f'{layer["name"].lower()}_back', None), @@ -54,6 +56,8 @@ def organize_clothing(layer): pattern_overall_image_url=layer['pattern_overall_image_url'], pattern_print_image_url=layer['pattern_print_image_url'], # back_perspective_url=layer['back_perspective_url'] if 'back_perspective_url' in layer.keys() else "" + transpose=layer.get("transpose", None), + rotate=layer.get('rotate', 0), ) return front_layer, back_layer diff --git a/app/service/design_fast/utils/synthesis_item.py b/app/service/design_fast/utils/synthesis_item.py index 29eff00..bb94f1c 100644 --- a/app/service/design_fast/utils/synthesis_item.py +++ b/app/service/design_fast/utils/synthesis_item.py @@ -151,9 +151,11 @@ def synthesis(data, size, basic_info): if layer['image'] is not None: if layer['name'] != "body": test_image = Image.new('RGBA', size, (0, 0, 0, 0)) - test_image.paste(layer['image'], (layer['adaptive_position'][1], layer['adaptive_position'][0]), layer['image']) + paste_img, position = transpose_rotate(layer, layer['image']) + test_image.paste(paste_img, position, paste_img) mask_data = np.where(all_mask > 0, 255, 0).astype(np.uint8) mask_alpha = Image.fromarray(mask_data) + mask_alpha.paste(paste_img.getchannel('A'), position, paste_img.getchannel('A')) 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) # test_image 已经按照坐标贴到最大宽值的图片上 坐着这里坐标为00 else: @@ -232,3 +234,26 @@ def update_base_size_priority(layers): for info in layers: info['adaptive_position'] = (info['position'][0], info['position'][1] - min_x) return layers, (new_width, new_height) + + +def transpose_rotate(layer, image): + transpose = layer.get('transpose', False) + rotate = layer.get('rotate', 0) + paste_x, paste_y = layer['adaptive_position'][1], layer['adaptive_position'][0] + if transpose: + flip = 0 if transpose == "left_right" else 1 + image = image.transpose(flip) + if rotate: + image = image.rotate(rotate, expand=True) + # 4. 计算粘贴位置以保持视觉中心一致 + # 原本 (15, 36) 是 288*288 的左上角,我们计算其中心点 + target_center_x = 15 + 288 // 2 + target_center_y = 36 + 288 // 2 + + # 获取旋转后图像的新尺寸 + new_w, new_h = image.size + + # 计算新的左上角坐标,使得旋转后的图像中心依然在原定的中心位置 + paste_x = target_center_x - new_w // 2 + paste_y = target_center_y - new_h // 2 + return image, (paste_x, paste_y) diff --git a/docker-compose.yml b/docker-compose.yml index 154252c..a0bd4de 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -10,4 +10,16 @@ services: - /etc/localtime:/etc/localtime:ro - ./seg_cache:/seg_cache ports: - - "10200:80" \ No newline at end of file + - "10200:80" + depends_on: + - redis + redis: + image: redis + container_name: aida_redis + restart: always + ports: + - "6400:6379" + volumes: + - ./redis/data:/data + - ./redis/conf/redis.conf:/etc/redis/redis.conf + command: redis-server /etc/redis/redis.conf --appendonly yes \ No newline at end of file diff --git a/logging_env.py b/logging_env.py index 9666e99..2285782 100644 --- a/logging_env.py +++ b/logging_env.py @@ -1,10 +1,15 @@ +import os + from app.core.config import settings LOGGER_CONFIG_DICT = { 'version': 1, 'disable_existing_loggers': False, 'formatters': { - 'simple': {'format': '%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s'} + 'simple': { + 'format': '%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s', + 'datefmt': '%Y-%m-%d %H:%M:%S' # 补充日期格式,日志更易读 + } }, 'handlers': { 'console': { @@ -17,7 +22,7 @@ LOGGER_CONFIG_DICT = { 'class': 'logging.handlers.RotatingFileHandler', 'level': 'INFO', 'formatter': 'simple', - 'filename': f'{settings.LOGS_PATH}info.log', + 'filename': os.path.join(settings.LOGS_PATH, 'info.log'), 'maxBytes': 10485760, 'backupCount': 50, 'encoding': 'utf8', @@ -26,7 +31,7 @@ LOGGER_CONFIG_DICT = { 'class': 'logging.handlers.RotatingFileHandler', 'level': 'ERROR', 'formatter': 'simple', - 'filename': f'{settings.LOGS_PATH}error.log', + 'filename': os.path.join(settings.LOGS_PATH, 'error.log'), 'maxBytes': 10485760, 'backupCount': 20, 'encoding': 'utf8', @@ -35,7 +40,7 @@ LOGGER_CONFIG_DICT = { 'class': 'logging.handlers.RotatingFileHandler', 'level': 'DEBUG', 'formatter': 'simple', - 'filename': f'{settings.LOGS_PATH}debug.log', + 'filename': os.path.join(settings.LOGS_PATH, 'debug.log'), 'maxBytes': 10485760, 'backupCount': 50, 'encoding': 'utf8', @@ -45,7 +50,7 @@ LOGGER_CONFIG_DICT = { 'my_module': {'level': 'INFO', 'handlers': ['console'], 'propagate': 'no'} }, 'root': { - 'level': 'INFO', + 'level': 'DEBUG', 'handlers': ['error_file_handler', 'info_file_handler', 'debug_file_handler', 'console'], }, }