42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
import os
|
|||
|
|
|
||
|
|
import django
|
||
|
|
from django_six_demo.settings import base_dir_name
|
||
|
|
|
||
|
|
os.environ.setdefault(key="DJANGO_SETTINGS_MODULE", value=f"{base_dir_name}.settings")
|
||
|
|
django.setup()
|
||
|
|
from pydantic import BaseModel, Field
|
||
|
|
from pathlib import Path
|
||
|
|
import base64
|
||
|
|
from PIL import Image
|
||
|
|
from typing import Union
|
||
|
|
|
||
|
|
|
||
|
|
class ImageToDataURI(BaseModel):
|
||
|
|
"""图片转 Data URI 工具类"""
|
||
|
|
|
||
|
|
data_uri: str = Field(description="Data URI 格式的图片数据")
|
||
|
|
|
||
|
|
@classmethod
|
||
|
|
def from_path(cls, file_path: Union[str, Path]) -> "ImageToDataURI":
|
||
|
|
"""从文件路径转换"""
|
||
|
|
path = Path(file_path)
|
||
|
|
if not path.exists():
|
||
|
|
raise FileNotFoundError(f"文件不存在: {path}")
|
||
|
|
|
||
|
|
# 读取原始字节
|
||
|
|
file_bytes = path.read_bytes()
|
||
|
|
|
||
|
|
# 获取 MIME 类型
|
||
|
|
img = Image.open(path)
|
||
|
|
mime_type = img.get_format_mimetype() or "image/png"
|
||
|
|
print(mime_type)
|
||
|
|
# 转 Base64 并拼接 Data URI
|
||
|
|
base64_str = base64.b64encode(file_bytes).decode("utf-8")
|
||
|
|
data_uri = f"data:{mime_type};base64,{base64_str}"
|
||
|
|
return data_uri
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
pass
|