67 lines
1.8 KiB
Python
Executable File
67 lines
1.8 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
# ollie:parallel read
|
|
# ollie:tier cold
|
|
# args_json: {"type":"object","required":["path"],"properties":{"path":{"type":"string","description":"Absolute path to image file"},"region":{"type":"string","description":"Region to capture: x,y,w,h"},"scale":{"type":"number","description":"Scale factor"}}}
|
|
# ollie:prompt
|
|
# ## image_read
|
|
#
|
|
# Read an image file. Returns an image content block for the model.
|
|
#
|
|
# ```
|
|
# image_read(path="<ABSOLUTE_IMAGE_PATH>")
|
|
# ```
|
|
# ollie:end
|
|
|
|
import sys
|
|
import os
|
|
import base64
|
|
import json
|
|
import mimetypes
|
|
|
|
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
|
|
from _lib.args import parse_args
|
|
|
|
args = parse_args()
|
|
file_path = args.require("path")
|
|
|
|
if not os.path.isabs(file_path):
|
|
print("STATUS=error")
|
|
print("error: path must be absolute")
|
|
sys.exit(1)
|
|
|
|
if not os.path.exists(file_path):
|
|
print("STATUS=not_found")
|
|
sys.exit(0)
|
|
|
|
mime, _ = mimetypes.guess_type(file_path)
|
|
if not mime:
|
|
mime = 'application/octet-stream'
|
|
|
|
with open(file_path, 'rb') as f:
|
|
data = f.read()
|
|
|
|
MAX_SIZE = 128 * 1024
|
|
|
|
if mime == 'image/png' and len(data) > MAX_SIZE:
|
|
from PIL import Image
|
|
import io
|
|
img = Image.open(io.BytesIO(data))
|
|
for scale in [1.0, 0.75, 0.5, 0.35, 0.25]:
|
|
buf = io.BytesIO()
|
|
if scale < 1.0:
|
|
new_size = (int(img.width * scale), int(img.height * scale))
|
|
resized = img.resize(new_size, Image.LANCZOS)
|
|
else:
|
|
resized = img
|
|
resized.save(buf, format='PNG', optimize=True)
|
|
data = buf.getvalue()
|
|
if len(data) <= MAX_SIZE:
|
|
break
|
|
|
|
b64 = base64.b64encode(data).decode('ascii')
|
|
|
|
print(json.dumps({"isError": False, "content": [
|
|
{"type": "image", "media_type": mime, "data": b64},
|
|
{"type": "text", "text": f"[image: {os.path.basename(file_path)} {len(data)} bytes {mime}]"}
|
|
]}))
|