feat 测试批量上传图片

fix
This commit is contained in:
zhouchengrong
2024-07-19 15:10:28 +08:00
parent b92b1f7d6e
commit ed908d0472
13 changed files with 160 additions and 48 deletions

View File

@@ -1,4 +1,8 @@
import concurrent.futures
import io
import cv2
from PIL import Image
from app.core.config import PRIORITY_DICT
from app.service.design.core.layer import Layer
@@ -6,6 +10,7 @@ from app.service.design.items import build_item
from app.service.design.utils.redis_utils import Redis
from app.service.design.utils.synthesis_item import synthesis, synthesis_single
from app.service.utils.decorator import RunTime
from app.service.utils.oss_client import oss_upload_image
def process_item(item, layers):
@@ -43,6 +48,7 @@ def final_progress(process_id):
@RunTime
def generate(request_data):
return_response = {}
return_png_mask = []
request_data = request_data.dict()
assert "process_id" in request_data.keys(), "Need process_id parameters"
@@ -55,14 +61,15 @@ def generate(request_data):
# 获取处理结果
for future in concurrent.futures.as_completed(futures):
obj = futures[future]
result = future.result()
return_response[obj] = result
return_response[obj] = future.result()[0]
return_png_mask.extend(future.result()[1])
final_progress(process_id)
upload_results = process_images(return_png_mask)
return return_response
def process_object(cfg, process_id, total):
uploaded_images = []
basic_info = cfg.get('basic')
items_response = {
'layers': []
@@ -83,6 +90,15 @@ def process_object(cfg, process_id, total):
layers = sorted(layers.layer, key=lambda s: s.get("priority", float('inf')))
else:
layers = sorted(layers.layer, key=lambda x: PRIORITY_DICT.get(x['name'], float('inf')))
# 上传所有图片
for layer in layers:
if 'image' in layer.keys() and layer['image'] is not None:
uploaded_images.append({'image_obj': layer['image'], 'image_url': layer['image_url']})
if 'pattern_image' in layer.keys() and layer['pattern_image'] is not None:
uploaded_images.append({'image_obj': layer['pattern_image'], 'image_url': layer['pattern_image_url']})
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']})
# 合成
items_response['synthesis_url'] = synthesis(layers, body_size)
@@ -131,4 +147,34 @@ def process_object(cfg, process_id, total):
items_response['synthesis_url'] = synthesis_single(item.result['front_image'], item.result['back_image'])
break
update_progress(process_id, total)
return items_response
return items_response, uploaded_images
@RunTime
def process_images(images):
with concurrent.futures.ThreadPoolExecutor() as executor:
results = list(executor.map(upload_images, images))
# results = []
# for image in images:
# results.append(upload_images(image))
return results
@RunTime
def upload_images(image_obj):
bucket_name = image_obj['image_url'].split("/", 1)[0]
object_name = image_obj['image_url'].split("/", 1)[1]
if isinstance(image_obj['image_obj'], Image.Image):
image_data = io.BytesIO()
image_obj['image_obj'].save(image_data, format='PNG')
image_data.seek(0)
image_bytes = image_data.read()
req = oss_upload_image(bucket=bucket_name, object_name=object_name, image_bytes=image_bytes)
return image_obj['image_url']
else:
mask_inverted = cv2.bitwise_not(image_obj['image_obj'])
# 将掩模的3通道转换为4通道白色部分不透明黑色部分透明
rgba_image = cv2.cvtColor(mask_inverted, cv2.COLOR_BGR2BGRA)
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])
return image_obj['image_url']