import io import os from urllib.parse import urlparse from PIL import Image from common.log import logger def fsize(file): if isinstance(file, io.BytesIO): return file.getbuffer().nbytes elif isinstance(file, str): return os.path.getsize(file) elif hasattr(file, "seek") and hasattr(file, "tell"): pos = file.tell() file.seek(0, os.SEEK_END) size = file.tell() file.seek(pos) return size else: raise TypeError("Unsupported type") def compress_imgfile(file, max_size): if fsize(file) <= max_size: return file file.seek(0) img = Image.open(file) rgb_image = img.convert("RGB") quality = 95 while True: out_buf = io.BytesIO() rgb_image.save(out_buf, "JPEG", quality=quality) if fsize(out_buf) <= max_size: return out_buf quality -= 5 def split_string_by_utf8_length(string, max_length, max_split=0): encoded = string.encode("utf-8") start, end = 0, 0 result = [] while end < len(encoded): if max_split > 0 and len(result) >= max_split: result.append(encoded[start:].decode("utf-8")) break end = min(start + max_length, len(encoded)) # 如果当前字节不是 UTF-8 编码的开始字节,则向前查找直到找到开始字节为止 while end < len(encoded) and (encoded[end] & 0b11000000) == 0b10000000: end -= 1 result.append(encoded[start:end].decode("utf-8")) start = end return result def get_path_suffix(path): path = urlparse(path).path return os.path.splitext(path)[-1].lstrip('.') def convert_webp_to_png(webp_image): from PIL import Image try: webp_image.seek(0) img = Image.open(webp_image).convert("RGBA") png_image = io.BytesIO() img.save(png_image, format="PNG") png_image.seek(0) return png_image except Exception as e: logger.error(f"Failed to convert WEBP to PNG: {e}") raise