如何在 Magick++ 中为 FX 功能指定通道?
How do I specify a channel for the FX function in Magick++?
这是描述 ImageMagick 中 FX 功能用法的文章:http://www.imagemagick.org/Usage/transform/#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
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;
}
这是描述 ImageMagick 中 FX 功能用法的文章:http://www.imagemagick.org/Usage/transform/#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
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;
}