Как заставить магию изображения преобразовывать вывод 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. Какова была бы правильная командная строка, чтобы сделать это?

2 ответа

Решение

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

convert input.jpg -depth 16 ppm:

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

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

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

Вы должны форсировать вывод режима 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. Если в качестве спецификатора формата вывода используется PNM, то ImageMagick автоматически выбирает наиболее подходящий формат для представления изображения. По умолчанию записывается двоичная версия форматов. Используйте -compress none, чтобы написать версию ASCII форматов.

Другие вопросы по тегам