Tive um probleminha com tamanho de imagens no post passado, o Gustavo orientou a diminuir as imagens antes de postar no site, então vi nisso uma oportunidade de um post extra de como usar Python para redimensionar imagens. Serão usados termos e tópicos não abordados ainda mas acredito que o aprendizado deve seguir um rumo mais cheio de altos e baixos do que somente uma linha reta, pois ao ver termos mais avançados podemos até não entender muito no momento, mas quando vemos esse assunto novamente na base as coisas ficam mais claras. Vamos lá:
Criei uma pasta com nome "Images" e nela coloquei todas as imagens que usei no post passado ("1.1 - Python - IDLE, IDEs..."). Em seguida, abri o editor de texto (VSCodium) e comecei o código:
Começamos importando as classes específicas das bibliotecas que precisamos para realizar essa tarefa. "PIL" é uma biblioteca de Python usada para processamento de imagens. "glob" é uma biblioteca utilizada para pegamos "pathnames" de arquivos de extensões específicas. A classe "glob" é usada para procurar path names que dão match com a condição que pedimos e retorna uma lista com todos os items. Isso ficará mais claro mais pra frente.
Em seguida, crio uma variável que terá a base dos path names e outra variável que receberá a lista com os nomes dos arquivos de imagem:
Ou seja, minha variável "files" será uma lista com o nome de todos os arquivos que têm extensão .png, que foi a extensão usada para a criação das imagens inicialmente. E por meio de uma concatenação de strings eu ligo a string "Images/" com o nome do arquivo de extensão .png.
Podemos fazer um teste e rodar o código a seguir, e visualizar a variável "files" caso estejamos em um console interativo. O retorno aqui no meu computador foi uma lista com o nome de todas as imagens:
De posse da lista de imagens, basta usar a classe Image da biblioteca PIL para realizar a diminuição das imagens. Decidi reduzir a largura e a altura das imagens pela metade. Fazendo um laço "for", realizamos essa tarefa facilmente:
Cria-se uma variável "img" para cada arquivo iterado pelo laço "for" e a imagem é aberta por meio da função "open()".
Podemos obter o tamanho de cada imagem dando o comando "img.size". Como o tamanho da imagem é um array de dois valores, largura e altura, a classe retorna uma tupla, que é um container de Python, com os dois valores. Por meio de um desempacotamento de tuplas atribuímos o valor da largura à variável "width" e o valor da altura à variável "height".
Ainda fazendo o uso de desempacotamento de tuplas, crio uma nova largura e uma nova altura com as variáveis "new_width" e "new_height" e divido as larguras e alturas anteriores por dois (observação: aqui coloquei parênteses dos dois lados mas isso não é necessário, só foi preciso porque a imagem estava desconfigurando o código e foi a forma que achei de não desconfigurar).
Em seguida sobrescrevo a variável "img" usando a função "resize" com os novos valores de largura e altura arredondados (pois não se pode usar valores fracionados para largura e altura de imagem) e completo o comando usando um ANTIALIAS, que é a grosso modo uma suavização das bordas serrilhadas das imagens. Por fim, salvo a imagem com o mesmo nome de antes e seleciono o formato .png, que já era o formato original.
Obs: explicando melhor o desempacotamento de tuplas:
Se ficou complicado a forma de explicar vou abordar melhor o assunto quando falar de tuplas. Prosseguindo:
Como iterei sobre cada imagem e diminuí seu tamanho pela metade, o resultado é o seguinte:
Exemplo de imagem antes do processamento (valores de largura e altura de 1072 x 546):
E após o processamento (largura e altura de 536 x 273):
EDIT: Esqueci que a resolução de celular é bem menor que a de computador e no celular não dá pra visualizar a diferença, então fiz um novo redimensionamento diminuindo a imagem em 5x pra ficar mais visível em celulares, largura e altura 214 x 109:
Código completo:
Não se descabelem se ficou algo complicado. Como disse no início, foi um extra que decidi postar aqui mas quem seguir estudando vai ver que não tem nada complicado aí. Vamos abordar os assuntos necessários para o entendimento de cada etapa à medida que o conhecimento for passado aqui.
Quis mais demonstrar como pode ser útil o aprendizado de programação no dia a dia mesmo sem ser desenvolvedor. Com poucas linhas de código eu diminuí a resolução de 15 imagens pela metade em poucos segundos de processamento.
Qualquer dúvida podem perguntar aí.