2017-04-23 29 views
0

這篇文章描述ImageMagick中使用FX特性的文章:http://www.imagemagick.org/Usage/transform/#fx如何在Magick ++中爲FX函數指定通道?

我需要使用FX和Magick ++(C++)。我如何指定我正在使用的頻道?例如:imagemagick命令行:

convert -size 64x64 xc:black -channel blue -fx '1/2' fx_navy.gif 

如何將其轉換爲Magick ++?我可以做這樣的事情:

Magick::Image img(Magick::Geometry(64, 64), Magick::Color("black")); 
img.fx("1/2"); 
img.write("fx_navy.gif"); 

< - 但它不僅爲藍色通道的所有通道。其實它會是灰色或類似的東西。如何指定頻道?

或者如何在Magick ++方面做這樣的事情?

convert -size 100x100 xc: +size xc:red xc:yellow xc:lime \ 
      -fx 'ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) ); 
       br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) ); 
       cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) ); 
       (u[1]*ar + u[2]*br + u[3]*cr)/(ar+br+cr)' \ 
      gradient_shepards.gif 

回答

2

Magick::Image.fx的第二個參數是通道選擇器。

Magick::Image img(Magick::Geometry(64, 64), Magick::Color("black")); 
img.fx("1/2", Magick::BlueChannel); 

對於第二個問題。您需要利用一些STL方法&技術。

#include <vector> 
#include <string> 
#include <Magick++.h> 



int main(int argc, const char * argv[]) { 
    std::vector<Magick::Image> imgList; 
    Magick::Image canvas(Magick::Geometry(100, 100), Magick::Color("NONE")); 
    imgList.push_back(canvas); 
    { 
     Magick::Image red(Magick::Geometry(100, 100), Magick::Color("RED")); 
     Magick::Image yellow(Magick::Geometry(100, 100), Magick::Color("YELLOW")); 
     Magick::Image lime(Magick::Geometry(100, 100), Magick::Color("LIME")); 

     imgList.push_back(red); 
     imgList.push_back(yellow); 
     imgList.push_back(lime); 
    } 
    std::string expression("ar=1/max(1, (i-50)*(i-50)+(j-10)*(j-10) );" 
          "br=1/max(1, (i-10)*(i-10)+(j-70)*(j-70) );" 
          "cr=1/max(1, (i-90)*(i-90)+(j-90)*(j-90) );" 
          "(u[1]*ar + u[2]*br + u[3]*cr)/(ar+br+cr)"); 
    Magick::fxImages(&canvas, imgList.begin(), imgList.end(), expression); 
    canvas.write("/tmp/output.png"); 
    return 0; 
} 

output.png

+0

哇。感謝您的詳細解答!如果我能的話,我會一次給你100張選票! :)它比官方教程更詳細! :) – JavaRunner

相關問題