import io import os from PIL import Image 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