【问题标题】:How to make image magic convert output ppm to stdout如何使 imagemagick 将输出 ppm 转换为标准输出
【发布时间】:2016-01-17 00:45:53
【问题描述】:

我正在编写一些图像处理程序。我的图像类支持读取和写入 ppm (P6) 格式的图像。要使用其他类型的图像,我想通过图像魔术转换将它们转换为 ppm。为此,我需要转换以将 ppm 的内容写入标准输出,因为我正在使用管道读取它们(请注意,创建临时文件是不可接受的)。

现在我有这个代码。

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 开头的。执行此操作的正确命令行是什么?

【问题讨论】:

    标签: c++ image imagemagick ppm


    【解决方案1】:

    你可能想要:

    convert input.jpg -depth 16 ppm:
    

    这会给你P6二进制数据,或者

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

    这将为您提供P3 ASCII 数据

    【讨论】:

      【解决方案2】:

      您需要使用选项-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 版本。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-01-22
        • 1970-01-01
        • 2018-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-23
        • 1970-01-01
        相关资源
        最近更新 更多