首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Magick++中为FX函数指定通道?

如何在Magick++中为FX函数指定通道?
EN

Stack Overflow用户
提问于 2017-04-23 15:15:56
回答 1查看 185关注 0票数 0

下面是描述在ImageMagick:http://www.imagemagick.org/Usage/transform/#fx中使用FX功能的文章

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

代码语言:javascript
复制
convert  -size 64x64 xc:black -channel blue -fx '1/2' fx_navy.gif

如何把它翻译成Magick++?我可以这样做:

代码语言:javascript
复制
Magick::Image img( Magick::Geometry( 64, 64 ), Magick::Color( "black" ) );
img.fx( "1/2" );
img.write( "fx_navy.gif" );

<--但它适用于所有频道,而不仅仅是蓝色频道。实际上它将是灰色或类似的东西。如何指定通道?

或者如何用Magick++来做这样的事情呢?

代码语言:javascript
复制
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
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-04-24 13:35:10

Magick::Image.fx的第二个参数是信道选择器。

代码语言:javascript
复制
Magick::Image img( Magick::Geometry( 64, 64 ), Magick::Color( "black" ) );
img.fx( "1/2", Magick::BlueChannel );

关于第二个问题。您需要利用一些STL方法和技术。

代码语言:javascript
复制
#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;
}

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43572881

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档