FajarHidaa commited on
Commit
fba6cd2
·
verified ·
1 Parent(s): 9a0bee7

Delete image_utils.py

Browse files
Files changed (1) hide show
  1. image_utils.py +0 -49
image_utils.py DELETED
@@ -1,49 +0,0 @@
1
- """
2
- image_utils.py
3
- --------------
4
- Kompres foto pengguna di memori sebelum dikirim ke Gemini.
5
- Tidak ada file baru yang ditulis. EXIF (termasuk GPS) terbuang saat disimpan ulang.
6
- """
7
-
8
- import base64
9
- import io
10
- import logging
11
- from typing import Optional, Tuple
12
-
13
- from PIL import Image, ImageOps
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- MAX_SIDE = 1024 # sisi terpanjang setelah resize
18
- JPEG_QUALITIES = (72, 60, 50) # turun bertahap sampai ukuran cukup kecil
19
- MAX_OUTPUT_BYTES = 260_000
20
- MAX_PIXELS = 40_000_000 # tolak gambar raksasa (decompression bomb)
21
- Image.MAX_IMAGE_PIXELS = MAX_PIXELS
22
-
23
-
24
- def compress_image_to_data_url(path: Optional[str]) -> Tuple[Optional[str], str]:
25
- """Return (data_url, error). Jika path kosong: (None, "")."""
26
- if not path:
27
- return None, ""
28
- try:
29
- with Image.open(path) as src:
30
- if src.width * src.height > MAX_PIXELS:
31
- return None, "Resolusi foto terlalu besar."
32
- src.draft("RGB", (MAX_SIDE * 2, MAX_SIDE * 2)) # percepat decode JPEG
33
- img = ImageOps.exif_transpose(src) # perbaiki rotasi dari HP
34
- img = img.convert("RGB")
35
- img.thumbnail((MAX_SIDE, MAX_SIDE), Image.Resampling.LANCZOS)
36
-
37
- data = b""
38
- for quality in JPEG_QUALITIES:
39
- buf = io.BytesIO()
40
- img.save(buf, "JPEG", quality=quality, optimize=True)
41
- data = buf.getvalue()
42
- if len(data) <= MAX_OUTPUT_BYTES:
43
- break
44
-
45
- b64 = base64.b64encode(data).decode("ascii")
46
- return f"data:image/jpeg;base64,{b64}", ""
47
- except Exception as exc:
48
- logger.warning("Image compress failed: %s", exc)
49
- return None, "Foto tidak dapat diproses."