Как заставить магию изображения преобразовывать вывод ppm в стандартный вывод

Я пишу некоторые процедуры обработки изображений. Мой класс изображений поддерживает чтение и запись изображений в формате ppm (P6). Чтобы использовать другие типы изображений, я хотел преобразовать их в стр. / Мин. Для этого мне нужно преобразовать, чтобы записать содержимое ppm в stdout, так как я читаю их с помощью конвейера (обратите внимание, что создание временных файлов недопустимо).

Прямо сейчас у меня есть этот код.

void Image::read(const char* file)
{
std::string cmd = std::string("convert \"") + file + std::string("\" -depth 16 -format ppm /dev/stdout");

std::cout << cmd << std::endl;

FILE* f = popen(cmd.c_str(), "r");
img_assert(f, "Could not start conversion process.");

try
{
read_ppm(f);
}
catch(...)
{
pclose(f);
img_assert(false, "Conversion failed.");
}

pclose(f);
}

Команда, которую использует попен, выглядит следующим образом.
convert "/home/chase/Desktop/m27.jpg" -depth 16 -format ppm /dev/stdout

Когда я запускаю это в терминале, я не получаю правильный вывод PPM, так как первая строка файлов не начинается с P6. Какова была бы правильная командная строка, чтобы сделать это?

0

Решение

Вы, вероятно, хотите:

convert input.jpg -depth 16 ppm:

который даст вам P6 двоичные данные или

convert input.jpg -depth 16 -compress none ppm:

который даст вам P3 Данные ASCII

2

Другие решения

Вы должны форсировать вывод режима ascii с опцией -compress none,
По умолчанию imagemagick генерируется в режиме raw (P6).

Поэтому эта строка должна выполнять работу (при условии, что остальная часть вашего кода работает):

std::string cmd = std::string("convert \"") + file + std::string("\" -depth 16 -compress none -format ppm /dev/stdout");

От доктор :

PNM — это семейство форматов, поддерживающих переносимые растровые изображения (PBM),
серые карты (PGM) и пиксельные карты (PPM). Формат файла не связан
с самой ПНМ. Если в качестве спецификатора формата вывода используется PNM, то
ImageMagick автоматически выбирает наиболее подходящий формат для
представлять изображение. По умолчанию записывается двоичная версия
форматы. Используйте -compress none, чтобы написать версию ASCII форматов.

1

По вопросам рекламы [email protected]