Ответ 1
Из того, что я прочитал, GraphicsMagick более стабилен и быстрее. Я сделал несколько ненаучных тестов и обнаружил, что gm будет в два раза быстрее im (изменение размера).
Я сам оценил обе эти библиотеки. Помимо того, что говорит сравнение GraphicsMagick, я вижу, что ImageMagick все еще получает обновления, и кажется, что они почти идентичны.
Я просто хочу сделать базовое манипулирование изображениями на С++ (например, загрузка изображения, фильтры, отображение); есть ли какие-либо различия, которые я должен знать при выборе между этими библиотеками?
Из того, что я прочитал, GraphicsMagick более стабилен и быстрее. Я сделал несколько ненаучных тестов и обнаружил, что gm будет в два раза быстрее im (изменение размера).
Я нашел ImageMagick быть невероятно медленным для групповой обработки-4 изображений TIFF (B & изображения документов W), в основном из-за того, что он преобразует от 1 бит на пиксел до 8 и обратно, чтобы сделать любое изображение манипуляция. Группа GraphicsMagick переработала поддержку формата TIFF со своей версией 1.2, и намного быстрее обрабатывает эти типы изображений, чем исходный ImageMagick. Текущая версия GraphicsMagick стабильной версии составляет 1.3.5.
Я использую ImageMagick, когда скорость не является фактором. Однако на стороне сервера, где ежедневно обрабатываются десятки тысяч изображений, GraphicsMagick заметно быстрее - в некоторых случаях быстрее на 50% быстрее в тестах!
Как и во многих вещах в жизни, у разных людей разные представления о том, что лучше. Если вы спросите ландшафтного фотографа, который бродит под дождем в горах Шотландии, который является лучшей камерой в мире, он расскажет вам облегченную камеру с защитой от непогоды. Спросите студийного фотографа, и он скажет вам самое высокое разрешение с лучшей скоростью синхронизации вспышки. И если вы спросите спортивного фотографа, он скажет вам, у кого самый быстрый автофокус и самая высокая частота кадров. Так же и с ImageMagick и GraphicsMagick.
Отвечая на около 2000 вопросов StackOverflow по ImageMagick за последние 5+ года, я делаю следующие наблюдения...
По популярности...
С точки зрения производительности...
Я рад признать, что GraphicsMagick может быть быстрее для некоторых, но не для всех проблем. Тем не менее, если скорость является вашим наиболее важным фактором, я думаю, что вы, вероятно, должны использовать либо libvips
, либо параллельный код на современных многоядерных процессорах, либо библиотеки с большой SIMD-оптимизацией (или GPU-оптимизацией), такие как OpenCV.
С точки зрения возможностей и гибкости...
Здесь есть один очень явный победитель - ImageMagick. По моему опыту, в GraphicsMagick отсутствуют многие функции, присутствующие в ImageMagick, и я перечислю некоторые из них ниже в произвольном порядке.
Я свободно признаю, что я не так знаком с GraphicsMagick, как с ImageMagick, но я приложил все усилия, чтобы найти упоминание о функциях в самом последнем исходном коде GraphicsMagick. Итак, для Canny Edge Detector я выполнил следующую команду в исходном коде GM:
find . -type f -exec grep -i Canny {} \;
и ничего не нашел.
Это, кажется, полностью отсутствует в GM. См. -canny radiusxsigma{+lower-percent}{+upper-percent}
в IM.
Смотрите пример здесь и пример обнаружения краев на изображении Лены:
Это убойная особенность ImageMagick, которую мне очень не хватает при использовании GM. IM может загружать, создавать или клонировать целые серии изображений и применять различную обработку выборочно к конкретным изображениям, а также повторять, дублировать и переупорядочивать их очень просто и удобно. Трудно передать невероятную гибкость, которая дает вам краткий ответ.
Представьте, что вы хотите сделать что-то довольно простое, например загрузить изображение A и размыть его, загрузить изображение B и сделать его в оттенках серого, а затем поместить изображения рядом с изображением B слева. Это выглядит так с ImageMagick:
magick imageA.png -blur x3 \( imageB.png -colorspace gray \) +swap +append result.png
Вы даже не можете начать с GM, он будет жаловаться на скобки. Если вы удалите их, он будет жаловаться на изменение порядка изображений. Если вы удалите его, он применит преобразование градаций серого к обоим изображениям, потому что он не понимает скобки и поместит imageA слева.
Смотрите следующие команды последовательности в IM:
-swap
-clone
-duplicate
-delete
-insert
-reverse
IM имеет оператор -fx
который позволяет создавать и экспериментировать с невероятно сложной обработкой изображений. Вы можете оценить функцию для каждого пикселя изображения. Эта функция может быть столь же сложной, как вам нравится (сохранить его в файл, если вы хотите) и использовать все математические операции, трехкомпонентный стиль, if
заявления, ссылки на пиксели, даже в других изображениях и их яркости или насыщенности и так далее.
Вот пара примеров:
magick rose: -channel G -fx 'sin(pi*i/w)' -separate fx_sine_gradient.gif
magick -size 80x80 xc: -channel G -fx 'sin((i-w/2)*(j-h/2)/w)/2+.5' -separate fx_2d_gradient.gif
Ответ StackOverflow, который использует эту функцию, чтобы добиться значительного эффекта при обработке изображений с зеленым экраном (с хроматической клавишей), здесь.
Похоже, в GM нет упоминаний о прямом или обратном анализе Фурье, а также о поддержке большого динамического диапазона (см. Далее), которая обычно требуется для его поддержки. См. -fft
в IM.
Похоже, что в GM нет "Связанного анализа компонентов", также известного как "маркировка" и "Анализ BLOB-объектов". См. Возможность -connected-components connectivity
-connected -connected-components connectivity
для анализа 4- и анализа 8-связанных BLOB-объектов.
Только эта функция дала ответы 60+ - см. Здесь.
Похоже, что нет обнаружения линии Хаф в GM. Смотрите -hough-lines widспасибоheight{+threshold}
в IM.
Смотрите описание функции здесь и следующий пример обнаруженных линий:
Похоже, нет поддержки для вычисления моментов изображения (центроиды и более высокие порядки), а также перцептивного хеширования в GM. См. -moments
в IM.
Кажется, что нет никакой поддержки для морфологической обработки в GM. В IM есть сложная поддержка:
Посмотрите всю сложную обработку, которую вы можете сделать с помощью этого замечательного учебника.
По-видимому, не поддерживается контрастная ограниченная адаптивная выравнивание гистограммы в GM. См. -clahe widспасибоheight{%}{+}number-bins{+}clip-limit{!}
В IM.
По-видимому, в GM отсутствует поддержка изображений с высоким динамическим диапазоном - только 8, 16 и 32-разрядные целочисленные типы.
ImageMagick поддерживает множество типов свертки:
Ни один из них не упомянут в исходном коде GM.
Это бесценная функция, присутствующая в ImageMagick, которая позволяет записывать промежуточные результаты обработки в именованные фрагменты памяти во время обработки без дополнительных затрат на запись на диск. Например, вы можете подготовить текстуру или узор, а затем наложить их на изображение или подготовить маску, а затем изменить и применить ее позже в той же обработке, не переходя на диск.
Вот пример:
magick tree.gif -flip -write mpr:tree +delete -size 64x64 tile:mpr:tree mpr_tile.gif
IM поддерживает следующие цветовые пространства, которых нет в GM:
IM поддерживает Pango Text Markup Language, который похож на HTML и позволяет комментировать изображения с текстом, который изменяется:
середина предложения и многое, многое другое. Существует отличный пример здесь.
Эта неоценимая особенность позволяет библиотеке сжимать изображения JPEG по мере их чтения с диска, так что считываются только необходимые коэффициенты, что уменьшает количество операций ввода-вывода и минимизирует потребление памяти. Это может значительно повысить производительность при уменьшении масштаба изображений.
Смотрите пример здесь.
IM поддерживает -define jpeg:extent=400KB
запрашиваемую опцию для указания максимального размера файла при записи файлов JPEG, например -define jpeg:extent=400KB
.
IM поддерживает преобразование между декартовой и полярной координатами, см. -distort polar
и -distort depolar
.
С -statistic MxN
оператора -statistic MxN
ImageMagick может генерировать множество полезных видов статистики и эффектов. Например, вы можете установить для каждого пикселя изображения градиент (разницу между самым ярким и самым темным) его окрестности 5x3:
magick image.png -statistic gradient 5x3 result.png
Или вы можете установить для каждого пикселя медиану своего соседства 1x200:
magick image.png -statistic median 1x200 result.png
Смотрите пример применения здесь.
ImageMagick поддерживает последовательности изображений, поэтому, если у вас есть набор очень шумных изображений, снятых при высоком ISO, вы можете загрузить всю последовательность изображений и, например, взять медиану или среднее для всех изображений, чтобы уменьшить шум. Смотрите оператор -evaluate-sequence
. Я не имею в виду медиану в окрестности на одном изображении, я имею в виду нахождение медианы всех изображений в каждой позиции пикселя.
Вышеприведенный список ни в коем случае не является исчерпывающим списком, это всего лишь первые несколько вещей, которые пришли в голову, когда я подумал о различиях. Я даже не упомянул поддержку HEIC (формат Apple для изображений iPhone), все более распространенных форматов с высоким динамическим диапазоном, таких как EXR, или любых других. Фактически, если вы сравните форматы файлов, поддерживаемые двумя продуктами (gm convert -list format
и magick identify -list format
), вы обнаружите, что IM поддерживает 261 формат, а GM поддерживает 192.
Как я уже сказал, разные люди имеют разные мнения. Выберите тот, который вам нравится, и наслаждайтесь им.
Как всегда, я признателен Энтони Тиссену за его превосходное понимание и рассказ о ImageMagick на https://www.imagemagick.org/Usage/ Спасибо также Фреду Вайнхаусу за его примеры.
graphicsmagick был заброшен из imagemagick еще в 2002 году из-за споров между основателями-разработчиками. таким образом, они используют одну и ту же кодовую базу.
Ссылка: https://en.wikipedia.org/wiki/GraphicsMagick
GraphicsMagick
ImageMagick
Помимо скорости, imagemagick добавляет несколько инструментов cli в оболочку терминала, тогда как graphicsmagick - это единственный инструмент, который вы можете вызвать.
GraphicsMagick
gm <command> <options> <file>
ImageMagick
convert <options> <file>
compare <options> <file>
imho, я предпочитаю (на самом деле, только использую) graphicsmagick (gm), а не imagemagick, так как последний имеет большую вероятность столкновения имен инструментов, что вызывает множество проблем при выяснении того, почему определенные инструменты не работают, особенно во время задач автоматизации на стороне сервера. В итоге Graphicsmagick имеет гораздо более четкий дизайн.
Вообразите двоичный файл с именем convert в проекте, и будет ли он вызываться с помощью imagemagick convert или вашего собственного инструмента в проекте?
список инструментов imagemagick (включая конвертирование, сравнение, отображение): https://imagemagick.org/script/command-line-tools.php
список команд graphicsmagick: http://www.graphicsmagick.org/utilities.html
примечание: начиная с v7, как было отмечено Марком S, imagemagick теперь распространяется в виде одного двоичного файла и также поддерживает более старые команды v6.
простой тест потребления памяти можно найти здесь: https://coderwall.com/p/1l7h-a/imagemagick-bloat-graphicsmagick
GraphicsMagick зависит от 36 библиотек, тогда как ImageMagick требует 64. Ссылка: http://www.graphicsmagick.org/1.3/FAQ.html
GraphicsMagick был ранним форком от Imagemagick. Вы можете прочитать об истории Imagemagick и о переходе к GraphicsMagick по адресу https://imagemagick.org/script/history.php. Кажется, что Imagemagick продолжает развиваться, в то время как GraphicsMagick остается более или менее неизменным со времени разветвления.