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