diff --git a/gsuid_core/segment.py b/gsuid_core/segment.py index 085a9ad..ff14402 100644 --- a/gsuid_core/segment.py +++ b/gsuid_core/segment.py @@ -255,7 +255,11 @@ async def _image_to_local_url(image: Union[bytes, str]) -> List[Message]: bio = BytesIO(image_bytes) _image = Image.open(bio) - name = f'{uuid.uuid1()}.jpg' + if _image.format == 'GIF': + suffix = '.gif' + else: + suffix = '.jpg' + name = f'{uuid.uuid1()}.{suffix}' path = image_res / name path.write_bytes(image_bytes) data = f'link://{pic_srv}/genshinuid/image/{name}' diff --git a/gsuid_core/utils/image/convert.py b/gsuid_core/utils/image/convert.py index 2f768d3..3011777 100644 --- a/gsuid_core/utils/image/convert.py +++ b/gsuid_core/utils/image/convert.py @@ -58,9 +58,18 @@ async def convert_img( logger.info('[GsCore] 处理图片中....') if isinstance(img, Image.Image): - img = img.convert('RGB') - result_buffer = BytesIO() - img.save(result_buffer, format='JPEG', quality=pic_quality) + if img.format == 'GIF': + result_buffer = BytesIO() + img.save(result_buffer, format='GIF') + else: + img = img.convert('RGB') + result_buffer = BytesIO() + img.save( + result_buffer, + format='JPEG', + quality=pic_quality, + ) + res = result_buffer.getvalue() if is_base64: res = 'base64://' + b64encode(res).decode() @@ -68,7 +77,7 @@ async def convert_img( elif isinstance(img, bytes): pass else: - async with aiofiles.open(img, 'rb') as fp: + async with aiofiles.open(Path(img), 'rb') as fp: img = await fp.read() logger.success('[GsCore] 图片处理完成!') diff --git a/gsuid_core/web_app.py b/gsuid_core/web_app.py index 5e73a1b..4e1c0f1 100644 --- a/gsuid_core/web_app.py +++ b/gsuid_core/web_app.py @@ -10,7 +10,7 @@ from bs4 import Tag, BeautifulSoup from starlette.requests import Request from fastapi.staticfiles import StaticFiles from fastapi import FastAPI, BackgroundTasks -from fastapi.responses import StreamingResponse +from fastapi.responses import Response, StreamingResponse from gsuid_core.sv import SL from gsuid_core.gss import gss @@ -413,10 +413,16 @@ app.mount( ) -@app.head('/genshinuid/image/{image_id}.jpg') -@app.get('/genshinuid/image/{image_id}.jpg') +@app.head('/genshinuid/image/{image_id}') +@app.get('/genshinuid/image/{image_id}') async def get_image(image_id: str, background_tasks: BackgroundTasks): - path = image_res / f'{image_id}.jpg' + path = image_res / image_id + if not path.exists() and '.' not in image_id: + path = image_res / f'{image_id}.jpg' + + if not path.exists(): + return Response(status_code=404) + image = Image.open(path).convert('RGB') image_bytes = BytesIO() image.save(image_bytes, format='JPEG')