Bom dia, boa tarde, boa noite!
Essa é a oitava parte da série sobre o projeto Video Creator, onde mostrarei como fiz o tratamento das imagens que serão utilizadas nos videos.
Se você entrou direto nesse post, te aconselho a começar por aqui, para entender exatamente do que se trata essa série.
Sobre essa parte
Aqui começamos a desenvolver o penúltimo robô, o rvideo.py, que será responsável por tratar as imagens e compilar o video.
Nesse post mostrarei o tratamento das imagens com uma ferramenta fantástica chamada ImageMagick.
Existe uma outra ferramenta fantástica que cheguei a testar, mas na hora acabei mantendo o ImageMagick por já estar um pouco mais familiarizado. Mas para quem quiser conhecer, segue o link da lib:
https://pypi.org/project/Pillow/
Requisitos:
Para realizar o tratamento das imagens, precisei do ImageMagick instalado, e de algumas outras libs:
import sys
sys.path.insert(0, './')
from PIL import Image
import os
import rcontent
A instrução sys.path.insert(0, './')
server para que eu consiga importar para o código, arquivos de outras pastas.
ImageMagick
Para começar, precisamos instalar o ImageMagick na máquina.
No site do programa você encontra toda a documentação necessária para você fazer o que quiser, além de exemplos e os links para download do programa.
No ubuntu precisei apenas digitar:
sudo apt-get install imagemagick
Tratamento das imagens:
Para o tratamento das imagens, encapsulei todo o código dentro da função prepare_images_downloaded()
. Ficou assim:
def prepare_images_downloaded():
logging.info("Preparing images downloaded to compile the video")
#os.chdir('./')
#path = "./content/images"
path = CONTENT_IMAGES_PATH
# removing existing composite images
os.system("rm -rf {}/*_composite*".format(path))
# create directory
video_content = rcontent.load()
for root, folders, files in os.walk('./content/images'):
for f in files:
f_split = f.split("_")
idx_sentence = int(f_split[0])
filename_original = os.path.join(root, f)
filename_composite = "{}/{}_composite.jpg".format(path, f_split[0])
filename_resized = "{}/{}_resized.jpg".format(path, f_split[0])
sentence = video_content['sentences'][idx_sentence]['text']
# creating comands
create_image_resized = "convert {} -resize '1280x720' {}".format(filename_original, filename_resized)
create_image_composite = "convert {} -background 'white' -blur '0x9' -resize '1920x1080^' -extent 1920x1080 \( {} -bordercolor white -border 10x10 \) -compose over -gravity center -composite {}".format(filename_original, filename_resized, filename_composite)
# creating images
os.system(create_image_resized)
os.system(create_image_composite)
# removing resized images
os.system("rm -rf {}/*_resized*".format(path))
# workaround to resolve the problems with grayscale image
img = Image.open(filename_composite)
rgbimg = Image.new(IMAGE_FORMATTER.get(img.format, 'RGB'), img.size)
rgbimg.paste(img)
rgbimg.save(filename_composite, format=img.format)
A função é bem simples, mas ela faz muita coisa legal.
Primeira ela elimina da pasta de imagens todas as imagens que contenham _composite
no nome.
Depois carrega o conteúdo do arquivo content.json para dentro do objeto video_content
.
Depois itera nas imagens da pasta com as imagens baixadas, e converte todas elas para o tamanho de 1280 x 720px.
Após, cria uma montagem esticando a imagem principal para cobrir todo o frame e cria o efeito embaçado. Depois coloca no centro da imagem a foto redimensionada anteriormente.
O resultado é bem legal 😀


Notem que no final da function, existe um trecho onde precisei utilizar a lib Pillow para tratar um problema de imagens em grayscale na hora de compilar o video.
Bom, agora que temos as imagens tratadas, hora de compilar o video!
Mostro como eu fiz no próximo post!
Abraço.