🎨 支持传递GIF格式的LINK_IMAGE

This commit is contained in:
KimigaiiWuyi 2025-02-15 15:05:38 +08:00
parent d10d5c8acf
commit 59f43ff54c
3 changed files with 28 additions and 9 deletions

View File

@ -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}'

View File

@ -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] 图片处理完成!')

View File

@ -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')