如何使用 MagickWand 叠加两个图像?
How do you superimpose two images using MagickWand?
我只是在看 Raku 的 MagickWand 到 imagemagick 的界面:
https://modules.raku.org/dist/MagickWand
而且我看不出有什么方法可以叠加两个图像。有一个
MagickWand.append-在examples/01-hello.pl6中展示的魔杖
平铺图像,我看到代码中有一个蒙太奇方法
(用于创建移动的 gif 文件?),但我没有看到像 Flatten 这样的东西
我在 perl 的 Image::Magick.
中使用的方法
我有一些使用 MagickMergeImageLayers 的代码,我将 MagickWand 子类化并添加了一个方法来完成它(遵循 append-wands 方法中所做的)。
这是子类模块:
use MagickWand;
use NativeCall;
use MagickWand::NativeCall;
use MagickWand::NativeCall::DrawingWand;
use MagickWand::NativeCall::Image;
use MagickWand::NativeCall::Mogrify;
use MagickWand::NativeCall::PixelIterator;
use MagickWand::NativeCall::PixelWand;
use MagickWand::NativeCall::Property;
use MagickWand::NativeCall::Wand;
use MagickWand::NativeCall::WandView;
use MagickWand::NativeCall::Deprecated;
use MagickWand::Enums;
class MagickWand::Doomed is MagickWand {
submethod flatten-wands(+@wands) returns MagickWand {
die "List must be defined with at least two elements" unless @wands.defined && @wands.elems >= 2;
my $temp-wand = NewMagickWand; # this "wand" is a cpointer
MagickSetLastIterator($temp-wand);
for @wands -> $wand {
MagickAddImage($temp-wand, $wand.handle);
MagickSetLastIterator($temp-wand);
}
MagickSetFirstIterator($temp-wand);
# an integer expected as second argument but the value
# doesn't seem to do anything
my $cloned-wand = MagickMergeImageLayers( $temp-wand, 0 );
DestroyMagickWand( $temp-wand );
return MagickWand.new( handle => $cloned-wand );
}
}
使用上述内容的一些示例脚本代码:
use MagickWand::Doomed;
my @images; # stack of images to process ("wands", i.e. MagickWand objects)
my $bg = MagickWand::Doomed.new;
$bg.read( $input_image_file );
my ($w, $h) = ($bg.width, $bg.height);
$bg.label("conan_limits");
@images.push( $bg );
my $overlay = MagickWand::Doomed.new;
$overlay.create( $w, $h, 'transparent' );
$overlay.draw-line( 150, 120, 190, 70 );
$overlay.draw-line( 190, 70, 220, 120 );
$overlay.draw-line( 220, 120, 150, 120 );
$overlay.label("drawn");
@images.push( $overlay );
my $output_file = "$loc/flattened-output.png";
my $comparison = MagickWand::Doomed.flatten-wands( @images );
$comparison.write( $output_file );
# cleanup on exit
LEAVE {
for @images -> $image {
$image.cleanup if $image.defined;
}
}
我只是在看 Raku 的 MagickWand 到 imagemagick 的界面:
https://modules.raku.org/dist/MagickWand
而且我看不出有什么方法可以叠加两个图像。有一个 MagickWand.append-在examples/01-hello.pl6中展示的魔杖 平铺图像,我看到代码中有一个蒙太奇方法 (用于创建移动的 gif 文件?),但我没有看到像 Flatten 这样的东西 我在 perl 的 Image::Magick.
中使用的方法我有一些使用 MagickMergeImageLayers 的代码,我将 MagickWand 子类化并添加了一个方法来完成它(遵循 append-wands 方法中所做的)。
这是子类模块:
use MagickWand;
use NativeCall;
use MagickWand::NativeCall;
use MagickWand::NativeCall::DrawingWand;
use MagickWand::NativeCall::Image;
use MagickWand::NativeCall::Mogrify;
use MagickWand::NativeCall::PixelIterator;
use MagickWand::NativeCall::PixelWand;
use MagickWand::NativeCall::Property;
use MagickWand::NativeCall::Wand;
use MagickWand::NativeCall::WandView;
use MagickWand::NativeCall::Deprecated;
use MagickWand::Enums;
class MagickWand::Doomed is MagickWand {
submethod flatten-wands(+@wands) returns MagickWand {
die "List must be defined with at least two elements" unless @wands.defined && @wands.elems >= 2;
my $temp-wand = NewMagickWand; # this "wand" is a cpointer
MagickSetLastIterator($temp-wand);
for @wands -> $wand {
MagickAddImage($temp-wand, $wand.handle);
MagickSetLastIterator($temp-wand);
}
MagickSetFirstIterator($temp-wand);
# an integer expected as second argument but the value
# doesn't seem to do anything
my $cloned-wand = MagickMergeImageLayers( $temp-wand, 0 );
DestroyMagickWand( $temp-wand );
return MagickWand.new( handle => $cloned-wand );
}
}
使用上述内容的一些示例脚本代码:
use MagickWand::Doomed;
my @images; # stack of images to process ("wands", i.e. MagickWand objects)
my $bg = MagickWand::Doomed.new;
$bg.read( $input_image_file );
my ($w, $h) = ($bg.width, $bg.height);
$bg.label("conan_limits");
@images.push( $bg );
my $overlay = MagickWand::Doomed.new;
$overlay.create( $w, $h, 'transparent' );
$overlay.draw-line( 150, 120, 190, 70 );
$overlay.draw-line( 190, 70, 220, 120 );
$overlay.draw-line( 220, 120, 150, 120 );
$overlay.label("drawn");
@images.push( $overlay );
my $output_file = "$loc/flattened-output.png";
my $comparison = MagickWand::Doomed.flatten-wands( @images );
$comparison.write( $output_file );
# cleanup on exit
LEAVE {
for @images -> $image {
$image.cleanup if $image.defined;
}
}