Ошибка CImg: 'gm.exe' не распознается как внутренняя или внешняя команда,

Я новичок в программировании на C ++, сегодня я пытался сохранить изображение с помощью CImg. CImg - это библиотека обработки изображений шаблонов C ++.

Основной код, который я написал (пожалуйста, простите за любые синтаксические ошибки, поскольку часть моих кодов скопирована):

#include "CImg.h"// Include CImg library header.
#include <iostream>

using namespace cimg_library;
using namespace std;

const int screen_size = 800;

//-------------------------------------------------------------------------------
//  Main procedure
//-------------------------------------------------------------------------------
int main()
{

CImg<unsigned char> img(screen_size,screen_size,1,3,20);
CImgDisplay disp(img, "CImg Tutorial");   
//Some drawing using img.draw_circle( 10, 10, 60, RED);
img.save("result.jpg"); // save the image    
return 0;   
}

Но я не могу запустить свою программу, поскольку она говорит:

Invalid Parameter - 100%
'gm.exe' is not recognized as an internal or external command,
operable program or batch file.

This application has requested the Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

[CImg] *** CImgIOException *** [instance(800,800,1,3,02150020,non-shared)] CImg<unsigned char>::save_other() : Failed to save file 'result.jpg'. Format is not natively supported, and no external commands succeeded.
terminate called after throwing an instance of 'cimg_library::CImgIOException'
  what():  [instance(800,800,1,3,02150020,non-shared)] CImg<unsigned char>::save_other() : Failed to save file 'result.jpg'. Format is not natively supported, and no external commands succeeded.

Хотя я вижу изображение, я не могу его сохранить. Немного погуглив, я обнаружил, что люди говорят установить ImageMagick, я установил его, но без помощи. Некоторые участники форума рекомендуют компилировать с использованием libjpeg, libpng, libmagick ++. Но я не знаю, как скомпилировать эти библиотеки. Я использую плагин Eclipse CDT для написания проекта C ++. Помогите, пожалуйста .


person web2dev    schedule 11.09.2013    source источник


Ответы (3)


У меня была такая же ошибка, и мне помогла установка GraphicsMagick (не ImageMagick).

Я загрузил и установил GraphicsMagick-1.3.26-Q8-win64-dll.exe с ftp: //ftp.graphicsmagick.org/pub/GraphicsMagick/windows/. Вы можете выбрать другой, если вам нужно:

Обратите внимание, что версия QuantumDepth = 8 (Q8), которая предоставляет стандартные 24/32-битные пиксели, потребляет половину памяти и примерно на 30% меньше ЦП, чем версия QuantumDepth = 16 (Q16), которая обеспечивает 48/64-битные пиксели для цвета с высоким разрешением. . Версия Q8 подходит для обработки типичных фотографий, предназначенных для просмотра на экране компьютера. Если вы работаете с пленочными, научными или медицинскими изображениями, используете цветовые профили ICC или имеете дело с изображениями с ограниченным контрастом, то рекомендуется версия Q16.

Важно: во время установки не снимайте флажок «Обновить путь поиска исполняемого файла», который обновляет переменную среды% PATH%, делая gm.exe доступным из любого места.

В моем случае также требовалось установить Ghostscript, который настоятельно рекомендуется установить с помощью GraphicsMagick. Есть ссылка на x64 Ghostscript: https://sourceforge.net/projects/ghostscript/files/GPL%20Ghostscript/9.09/gs909w64.exe/download (я поместил его здесь, потому что ссылки с веб-сайтов GraphicMagick ведут только к 32-разрядной версии).

После этого у меня все заработало.

person Maxim Georgievskiy    schedule 20.08.2017
comment
Хотя ваш ответ будет работать, ответ от @bvalabas (stackoverflow.com/a/18735401/2836621), вероятно, обычно предпочтительнее , так как он включает только установку относительно легкого libjpeg, а не огромного полного дистрибутива ImageMagick. Кроме того, ghostscript обычно требуется только при чтении PDF файлов. - person Mark Setchell; 20.08.2017

Для некоторых форматов изображений (таких как .jpg, .png, .tif и практически все форматы, требующие сжатия данных), CImg попытается использовать внешний инструмент для их сохранения (например, convert из ImageMagick или gm из GraphicsMagick). Если у вас ничего не установлено, вы не сможете сохранять .jpg файлы, не связав свой код с библиотекой libjpeg, чтобы получить встроенную поддержку чтения / записи JPEG (тогда вам потребуется #define cimg_use_jpeg перед #include "CImg.h", чтобы сообщить библиотеке, что вы хотите использовать функции libjpeg).

Если вы хотите упростить задачу, я бы рекомендовал сохранить изображение в другом (несжатом) формате изображения, например .bmp или .ppm. Эти форматы изначально обрабатываются CImg и не требуют связывания с внешними библиотеками.

person bvalabas    schedule 11.09.2013
comment
Спасибо за ответ, сохранение в .bmp работает, но на самом деле нужно сохранить их как .jpg или .png. Я пробовал использовать #define cimg_use_jpeg до #include CImg.h Но я получаю jpeglib.h: Нет такого файла или каталога. Нужно ли мне загружать этот заголовок вручную? - person web2dev; 11.09.2013

Я знаю, что это старый вопрос, но я продолжал получать одну и ту же ошибку в одном проекте, а не в другом, и это единственное, что есть в Google.

Чтобы избавиться от него, вы должны сделать 2 вещи:

  1. Установите динамические библиотеки ImageMagick для вашей ОС и архитектуры (32/64). Ссылка

  2. Я использовал VisualStudio, и для набора символов должен быть установлен Unicode. Ошибка появится снова, когда я вернусь к набору многобайтовых символов. Я предполагаю, что это как-то связано с тем, как CImg обрабатывает строки и неправильно сравнивает их.

person Majiick    schedule 05.07.2016