如何使图像魔术将输出ppm转换为标准输出

时间:2015-10-18 18:04:55

标签: c++ image imagemagick ppm

我正在写一些图像处理程序。我的图像类支持以ppm(P6)格式读取和写入图像。要使用其他类型的图像,我想通过图像魔术转换将它们转换为ppm。要做到这一点,我需要转换为将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);
}

popen使用的命令如下。 convert "/home/chase/Desktop/m27.jpg" -depth 16 -format ppm /dev/stdout

当我在终端中运行时,我没有得到正确的PPM输出,因为文件的第一行不是以P6开头的。执行此操作的正确命令行是什么?

2 个答案:

答案 0 :(得分:2)

你可能想要:

convert input.jpg -depth 16 ppm:

将为您提供P6二进制数据或

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

将为您提供P3 ASCII数据

答案 1 :(得分:1)

您需要使用选项-compress none强制执行ascii模式输出。 默认情况下,imagemagick以原始(P6)模式生成。

因此,这一行应该完成工作(假设你的其余代码有效):

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

来自doc

  

PNM是一系列支持便携式位图(PBM)的格式,   灰度图(PGM)和像素图(PPM)。没有关联的文件格式   与pnm本身。如果PNM用作输出格式说明符,那么   ImageMagick自动选择最合适的格式   代表图像。默认是写二进制版本的   格式。使用-compress none编写格式的ASCII版本。