fix: normalize image formats before gemini
This commit is contained in:
@@ -11,6 +11,7 @@ from urllib.parse import urlparse
|
|||||||
|
|
||||||
import httpx
|
import httpx
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
|
from PIL import Image
|
||||||
|
|
||||||
from db.customer_db import CustomerDatabase
|
from db.customer_db import CustomerDatabase
|
||||||
from db.image_tasks_db import TaskStatus, db as task_db
|
from db.image_tasks_db import TaskStatus, db as task_db
|
||||||
@@ -90,6 +91,22 @@ class AutoImagePipelineService:
|
|||||||
suffix = suffix or dest_path.suffix or ".bin"
|
suffix = suffix or dest_path.suffix or ".bin"
|
||||||
return dest_path.with_suffix(suffix)
|
return dest_path.with_suffix(suffix)
|
||||||
|
|
||||||
|
@staticmethod
|
||||||
|
def _normalize_image_for_gemini(image_path: Path) -> Path:
|
||||||
|
suffix = image_path.suffix.lower()
|
||||||
|
if suffix not in {".avif", ".webp"}:
|
||||||
|
return image_path
|
||||||
|
|
||||||
|
normalized_path = image_path.with_suffix(".jpg")
|
||||||
|
with Image.open(image_path) as img:
|
||||||
|
if img.mode not in ("RGB", "L"):
|
||||||
|
img = img.convert("RGB")
|
||||||
|
img.save(normalized_path, format="JPEG", quality=95)
|
||||||
|
logger.info(
|
||||||
|
f"[AutoImagePipeline] 已转换图片格式供Gemini使用: src={image_path} normalized={normalized_path}"
|
||||||
|
)
|
||||||
|
return normalized_path
|
||||||
|
|
||||||
async def _download_image(self, image_url: str, dest_path: Path) -> Path:
|
async def _download_image(self, image_url: str, dest_path: Path) -> Path:
|
||||||
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
dest_path.parent.mkdir(parents=True, exist_ok=True)
|
||||||
timeout = httpx.Timeout(60.0, connect=20.0)
|
timeout = httpx.Timeout(60.0, connect=20.0)
|
||||||
@@ -239,6 +256,7 @@ class AutoImagePipelineService:
|
|||||||
)
|
)
|
||||||
try:
|
try:
|
||||||
input_path = await self._download_image(image_url, input_path)
|
input_path = await self._download_image(image_url, input_path)
|
||||||
|
input_path = self._normalize_image_for_gemini(input_path)
|
||||||
success, message, data = await gemini_service.extract_pattern(
|
success, message, data = await gemini_service.extract_pattern(
|
||||||
str(input_path),
|
str(input_path),
|
||||||
str(output_path),
|
str(output_path),
|
||||||
|
|||||||
Reference in New Issue
Block a user