ImageMagick C ++ API Вывод 16-битного оттенка серого png? - PullRequest
2 голосов
/ 11 октября 2011

Я ссылаюсь на ImageMagick через API Magick ++.Я пытаюсь взять данные uint16 и вывести их в виде 1-канального 16-битного PNG в оттенках серого 1024x768.Вывод, который я получаю из следующего - RGB8 PNG.Содержимое изображения правильное, кроме форматирования.

gray16_view_t u16view = ...;
uint16_t* data = interleaved_view_get_raw_data(u16view);
size_t length = sizeof(u16) * u16view.width() * u16view.height();
Magick::Blob u16Blob(data, length);
Magick::Geometry size(u16view.width(), u16view.height());
Magick::Image u16MagickImg(u16Blob, size, 16, "GRAY");
u16MagickImg.write("test-16bit.png");

Есть ли способ указать больше о формате вывода?

Некоторое обсуждение обработки PNG imagemagick здесь: http://www.imagemagick.org/Usage/formats/#png_formats Они перечисляют PNG8, PNG24 и PNG32 в качестве доступных форматов, но следующий раздел подразумевает, что

-define png:bit-depth 16 
-define png:color-type=0 

командная строка будет иметь желаемый результат

Ответы [ 2 ]

1 голос
/ 27 февраля 2014

Я попробовал defineSet, и он у меня не сработал, но затем сработало:

image.defineValue("png", "format", "png24");

Моя ситуация немного отличается, поэтому я использую другой спецификатор формата png и значение, в вашем случае здесь должно быть:

u16MagickImg.defineValue("png", "color-type", "0");
u16MagickImg.defineValue("png", "bit-depth", "16");

См. Список спецификаторов формата здесь: http://www.imagemagick.org/script/command-line-options.php#define

См. Информацию о значении методов defineValue и defineSet класса Image здесь: http://www.imagemagick.org/Magick++/Image.html

Цитаты оттуда:

defineValue: "Установить или получить строку определения, применяемую при кодировании или декодировании указанного формата. Значения определений зависят от формата. Формат определяется аргументом magick_, формат-специфический ключ обозначается как key_, а соответствующее значение указывается значением value_. См. метод defineSet (), если ключ должен быть полностью удален."defineSet:" Установите или получите флаг определения, применяемый прикодирование или декодирование указанного формата. Аналогичен методу defineValue (), за исключением того, что передача значения flag_ true 'создает значение-less определите с этим форматом и ключом.Передача значения flag_ 'false' удаляет все существующие определения соответствия.Метод возвращает «true», если соответствующий ключ существует, и «false», если соответствующий ключ не существует. "

Также некоторая важная информация из исходного файла png.c: если изображение не может быть записано без потерь сзапрошенная битовая глубина и цветовой тип, файл PNG не будет записан, будет выдано предупреждение, и кодер вернет MagickFalse.

Я не эксперт и не уверен, что он будет работать вВаш конкретный случай, но приведенный выше код действительно работает для меня в OS X ImageMagick 10.6.9.

Надеюсь, это поможет.

1 голос
/ 11 октября 2011
    u16MagickImg.quality(00);
    u16MagickImg.defineSet("png:color-type", "0");
    u16MagickImg.defineSet("png:bit-depth", "16");
...