Final_Assignment_Template / image_util.py
gdms's picture
Ajuste diretório download e chamada ao tratamento de arquivos
93b31b9
import base64
import mimetypes
import os
from urllib.parse import unquote, urlparse
import requests
from file_util import File_Util
class Image_Util:
"""
Manipulação de imagens
"""
@staticmethod
def encode_image_to_base64(image_path: str) -> str:
"""Codifica um arquivo de imagem (frame) para base64."""
try:
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')
except FileNotFoundError:
print(f"Erro: Arquivo não encontrado em {image_path}")
return None
except Exception as e:
print(f"Erro ao codificar imagem {image_path} para base64: {e}")
return None
@staticmethod
def get_image_extension_from_url(url: str) -> str:
"""
Retorna a extensão do arquivo de imagem com base na URL informada.
Args:
url: URL da imagem (pode conter parâmetros).
Returns:
Extensão do arquivo (ex: 'jpg', 'png') ou None se não for possível identificar.
"""
path = unquote(urlparse(url).path) # decodifica e extrai o caminho da URL
filename = os.path.basename(path)
# Tenta extrair extensão diretamente
_, ext = os.path.splitext(filename)
ext = ext.lower().lstrip('.') # remove o ponto
# Verifica se a extensão é de imagem conhecida
if ext in ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp', 'tiff']:
return ext
# Caso não haja extensão, tenta deduzir pelo tipo MIME
mime_type, _ = mimetypes.guess_type(url)
if mime_type and mime_type.startswith("image/"):
return mime_type.split("/")[1] # ex: 'image/png' → 'png'
return None
@staticmethod
def download_image_from_url(url: str, output_path: str, image_file_name: str) -> str:
"""
Baixa uma imagem a partir de uma URL.
Args:
url: url da imagem
output_path: local esperado para gravação da imagem
image_file_name: nome do arquivo que deve ser utilizado para download
"""
File_Util.create_or_clear_output_directory(output_path)
image_path = f'{output_path}/{image_file_name}.{Image_Util.get_image_extension_from_url(url)}'
response = requests.get(url, stream=True)
if response.status_code == 200:
if save_path is None:
save_path = os.path.basename(url.split("?")[0]) # remove query params, se houver
with open(save_path, 'wb') as f:
for chunk in response.iter_content(1024):
f.write(chunk)
return save_path
else:
raise Exception(f"Erro ao baixar imagem: {response.status_code} - {response.reason}")
return image_path