2015-10-18 66 views
0

我正在寫一些圖像處理例程。我的圖像類支持以ppm(P6)格式讀取和寫入圖像。要使用其他類型的圖像,我想通過圖像魔術轉換將它們轉換爲ppm。爲此,我需要轉換爲將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開頭。什麼是適當的命令行來做到這一點?

回答

2

你可能想:

convert input.jpg -depth 16 ppm: 

,這將給你P6二進制數據,或

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

,這將給你P3 ASCII數據

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版本。

+0

感謝。我其實想要P6二進制格式。 – chasep255