|
import io |
|
import os |
|
from urllib.parse import urlparse |
|
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)) |
|
|
|
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('.') |
|
|