Redimensionamento de Imagens com uma API Flask e AWS S3
- #AWS
- #Flask
- #Python
Introdução
No mundo digital de hoje, as imagens desempenham um papel crucial na comunicação visual. No entanto, imagens muito grandes podem causar lentidão no carregamento de páginas e desperdiçar espaço de armazenamento. Para solucionar esses problemas, desenvolvemos uma API utilizando Flask que permite redimensionar e otimizar imagens armazenadas no AWS S3. Este artigo descreve o processo de criação dessa API, suas funcionalidades e como utilizá-la.
Tecnologias Utilizadas
A API foi construída utilizando as seguintes tecnologias:
- Python 3.x: A linguagem de programação utilizada para desenvolver a API.
- Flask: Um microframework para Python que facilita a criação de APIs e aplicativos web.
- Boto3: A biblioteca oficial da AWS para Python, utilizada para interagir com o serviço S3.
- Pillow: Uma biblioteca de manipulação de imagens que permite redimensionar e otimizar imagens.
A seguir, temos o código completo da API:
from flask import Flask, request, jsonify
import boto3
from PIL import Image
from io import BytesIO
app = Flask(__name__)
s3 = boto3.client('s3')
def download_image_from_s3(bucket_name, image_key):
obj = s3.get_object(Bucket=bucket_name, Key=image_key)
return obj['Body'].read()
def resize_image(image_data, max_size=(800, 600)):
image = Image.open(BytesIO(image_data))
image.thumbnail(max_size)
buffer = BytesIO()
image.save(buffer, format="JPEG")
buffer.seek(0)
return buffer
def upload_image_to_s3(bucket_name, image_key, image_data):
s3.put_object(Bucket=bucket_name, Key=image_key, Body=image_data, ContentType='image/jpeg')
@app.route('/reduce-image-size', methods=['POST'])
def reduce_image_size():
data = request.get_json()
bucket_name = data['bucket_name']
image_key = data['image_key']
new_image_key = data['new_image_key']
max_size = tuple(data.get('max_size', (800, 600)))
original_image = download_image_from_s3(bucket_name, image_key)
resized_image = resize_image(original_image, max_size)
upload_image_to_s3(bucket_name, new_image_key, resized_image)
return jsonify({'message': 'Image resized and uploaded successfully!'}), 200
if __name__ == '__main__':
app.run(debug=True)
- download_image_from_s3: Faz o download da imagem do S3.
- resize_image: Redimensiona a imagem utilizando a biblioteca Pillow.
- upload_image_to_s3: Faz o upload da imagem redimensionada de volta ao S3.