我正在写一些图像处理程序。我的图像类支持以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开头的。执行此操作的正确命令行是什么?
答案 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版本。