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

🪄 Com velocidade e precisão.


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


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

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";
  }
}

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/
w2j

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
}

Veja também:

Como Combinar Imagens com C++ e ImageMagick


magick cpp


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!