微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用MagickWand叠加两个图像?

如何解决如何使用MagickWand叠加两个图像?

我只是看着Raku的imagemagick的MagickWand界面:

https://modules.raku.org/dist/MagickWand

我看不到任何叠加两个图像的方法。有一个 在示例01-hello.pl6中演示了MagickWand.append-wands 拼贴图像,我看到代码中有一个蒙太奇方法 (用于创建移动的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,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;  
  }
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。