
Há muito tempo atrás eu havia feito um script que bastava eu entrar em uma pasta e rodar um comando e, mesmo entre vários arquivos, convertia imagens WEBP para JPG.
No entanto, além de presenciar algumas vezes, falhas na conversão, houve uma vez que eu tinha uma pasta com muitos .webp e notei uma leve lentidão.
Então, decidi refazer o código em C++.
Antes de mais nada, você precisa possuir instalado o ImageMagick Dev(API .h) na sua máquina, para isso rode:
Exemplo em sistemas que possuem o APT:
sudo apt install imagemagick graphicsmagick-libmagick-dev-compatAgora crie o arquivo C++, exemplo: main.cpp e cole esse código dentro.
O código por si só é auto exeplicável, ou seja, lista os arquivos
.webpe converte para.jpge após isso, remove os.webp, se não houver nenhum arquivo.webpno diretório que você estiver rodando o binário, emite um aviso.
#include <Magick++.h>
#include <filesystem>
#include <iostream>
namespace fs = std::filesystem;
int main(int argc, char **argv){
(void)argc;
Magick::InitializeMagick(*argv);
bool found = false;
for(const auto &entry : fs::directory_iterator(fs::current_path())){
if(entry.is_regular_file() && entry.path().extension() == ".webp"){
found = true;
std::string input = entry.path().string();
fs::path out_path = entry.path();
out_path.replace_extension(".jpg");
std::string output = out_path.string();
try{
Magick::Image img(input);
img.write(output);
fs::remove(entry.path());
}catch(Magick::Exception &e){
std::cerr << input << ": " << e.what() << "\n";
return EXIT_FAILURE;
}
}
}
if(!found){
// Não há imagens para converter.
std::cout << "There are no images to convert.\n";
}
}Compile, como -ffast-math, dará ainda mais velocidade na execução do binário:
g++ -ffast-math -o w2j $(Magick++-config --cxxflags --cppflags) main.cpp $(Magick++-config --ldflags --libs)Depois disso é só instalar:
sudo install -v w2j /usr/local/bin/Depois é só usar, exemplo:
cd pasta/com/varios/webp/
w2jE todos os arquivos WEBP serão convertidos para JPG e automaticamente deletados ao fim.
Só por curiosidade, o script GNU Bash que fazia isso era esse:
w2jpg(){
shopt -s nullglob
local files=( *.webp )
(( ${#files[@]} == 0 )) && {
echo "Não há imagens para converter."
return
}
for f in "${files[@]}"; do
convert "$f" "${f%.webp}.jpg"
done
rm -- *.webp
}