DEV Community

Cover image for Como converter várias imagens WEBP para JPG com C++ e ImageMagick
Marcos Oliveira
Marcos Oliveira

Posted on

Como converter várias imagens WEBP para JPG com C++ e ImageMagick

🪄 Com velocidade e precisão.


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++.


Código

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-compat
Enter fullscreen mode Exit fullscreen mode

Agora 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 .webp e converte para .jpg e após isso, remove os .webp, se não houver nenhum arquivo .webp no 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";
  }
}
Enter fullscreen mode Exit fullscreen mode

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)
Enter fullscreen mode Exit fullscreen mode

Depois disso é só instalar:

sudo install -v w2j /usr/local/bin/
Enter fullscreen mode Exit fullscreen mode

Depois é só usar, exemplo:

cd pasta/com/varios/webp/
w2j
Enter fullscreen mode Exit fullscreen mode

E 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
}
Enter fullscreen mode Exit fullscreen mode

Veja também:

Como Combinar Imagens com C++ e ImageMagick

Top comments (0)