2016-01-07 72 views
0

我正在嘗試將模糊蒙版的ImageMagick命令轉換爲Magick ++ API。Magick ++ blur mask

ImageMagick的

convert -size 720x478 xc: -sparse-color Barycentric '0,0 black 0,%h white' -function polynomial 4,-4,1 -level 0,50% mask.jpg 

Magick ++

Magick::Image mask(Magick::Geometry(720,478), Magick::Color("white")); 

double args[6]; 
args[0] = 0; 
args[1] = 0; 
args[2] = 0; 
args[3] = 0; 
args[4] = mask.rows(); 
args[5] = MaxRGB; 

mask.sparseColor(Magick::DefaultChannels, Magick::BarycentricColorInterpolate, 6, args); 

args[0] = 4; 
args[1] = -4; 
args[2] = 1; 
args[3] = 0; 
args[4] = 0; 
args[5] = 0; 

mask.quantumOperator(Magick::DefaultChannels, Magick::PolynomialFunction, 
    3,args); 

parseLevel(image, "0,50%", args); // contains code from mogrify.c for parsing the leveling string 

mask.level(args[0], args[1], args[2], ' '); 

結果我得到的只是一個白色圖像,而正確的面具形象應該是這樣的:

enter image description here

有人可以告訴我我的錯誤嗎?

回答

0

因此,原來我是在sparseColor()功能,給予了錯誤的ChannelTypeDefaultChannels枚舉包含RGBChannelsOpacityChannelIndexChannel。我不得不通過按位操作將後兩者從DefaultChannels枚舉中排除。正如@ThorngardSO指出的,ARGS大小也需要10

代碼

double args[10]; 

// -sparse-color Barycentric '0,0 black 0,%h white' 

args[0] = 0;   // x = 0 
args[1] = 0;   // y = 0 
args[2] = 0;   // black (R) 
args[3] = 0;   // black (G) 
args[4] = 0;   // black (B) 
args[5] = 0;   // x = 0 
args[6] = mask.rows(); // y = %h 
args[7] = MaxRGB;  // white (R) 
args[8] = MaxRGB;  // white (G) 
args[9] = MaxRGB;  // white (B) 

mask.sparseColor((Magick::DefaultChannels & ~OpacityChannel) & ~IndexChannel, Magick::BarycentricColorInterpolate, 10, args); 
1

Mhm,我沒有使用imagemagick的經驗,但很快看着文檔和你的例子,我有一個預感:也許默認的圖像類型是rgb,並且你需要三個float/double參數你的稀疏顏色調用。這樣的:

Magick::Image mask(Magick::Geometry(720,478), Magick::Color("white")); 

double args[10]; 

// -sparse-color Barycentric '0,0 black 0,%h white' 

args[0] = 0;   // x = 0 
args[1] = 0;   // y = 0 
args[2] = 0;   // black (R) 
args[3] = 0;   // black (G) 
args[4] = 0;   // black (B) 
args[5] = 0;   // x = 0 
args[6] = mask.rows(); // y = %h 
args[7] = MaxRGB;  // white (R) 
args[8] = MaxRGB;  // white (G) 
args[9] = MaxRGB;  // white (B) 

mask.sparseColor(Magick::DefaultChannels, Magick::BarycentricColorInterpolate, 10, args); 
+0

我已經嘗試過12個自變量,x,y和R,G,B,A,但我得到了與以前相同的結果。有10個參數會拋出無效參數的異常。 – zindarod

+0

好的,對不起。那麼剩下的一切就是最後一個建議:把你的例子分解成最小的部分,找出罪魁禍首的功能。 IOW:如果你註釋掉了quantumOperator()和level(),結果掩碼看起來是否合理?如果是,請再次添加quantumOperator()。等等... – ThorngardSO