File size: 1,635 Bytes
f3ca73d 6802cd9 9cd282f ec7e5e3 4d58dd6 ec7e5e3 9cd282f ec7e5e3 9cd282f ec7e5e3 9cd282f ec7e5e3 786baa3 ec7e5e3 04ebd2c ec7e5e3 04ebd2c 786baa3 ec7e5e3 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
from fastapi import APIRouter, Query, HTTPException
from fastapi.responses import StreamingResponse
from PIL import Image
import requests
from io import BytesIO
import base64
router = APIRouter()
def image_to_custom_string(img: Image.Image) -> str:
img = img.convert("RGB").resize((32, 32)) # Reduz pra facilitar
pixels = list(img.getdata())
# Representa cada pixel como R,G,B separado por vírgula e ponto-e-vírgula por pixel
pixel_data = ";".join([f"{r},{g},{b}" for r, g, b in pixels])
return pixel_data
def custom_string_to_image(data: str, size=(32, 32)) -> Image.Image:
pixels = [
tuple(map(int, pixel.split(",")))
for pixel in data.strip().split(";") if pixel
]
img = Image.new("RGB", size)
img.putdata(pixels)
return img
@router.get("/encode")
def encode_image(url: str = Query(..., description="URL da imagem")):
try:
response = requests.get(url)
image = Image.open(BytesIO(response.content))
encoded_string = image_to_custom_string(image)
return {"encoded": encoded_string}
except Exception as e:
raise HTTPException(status_code=400, detail=f"Erro ao processar imagem: {e}")
@router.get("/decode")
def decode_image(encoded: str = Query(..., description="String da imagem codificada")):
try:
image = custom_string_to_image(encoded)
buffer = BytesIO()
image.save(buffer, format="PNG")
buffer.seek(0)
return StreamingResponse(buffer, media_type="image/png")
except Exception as e:
raise HTTPException(status_code=400, detail=f"Erro ao decodificar imagem: {e}") |