首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MagickWand叠加两个图像?

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

Stack Overflow用户
提问于 2020-10-26 00:28:06
回答 1查看 224关注 0票数 7

我只是在看Raku的MagickWand界面来访问imagemagick:

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

我看不到任何方法来叠加两个图像。examples/01-hello.pl6中演示了一个MagickWand.append-wands,它可以平铺图像,我看到代码中有一个剪辑方法(用于创建移动gif?),但我没有看到任何类似于我在perl的Image::Magick中使用的Flatten方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-30 08:22:14

我已经使用MagickMergeImageLayers编写了一些代码,我继承了MagickWand并添加了一个方法来完成这项工作(下面是在append-wands方法中所做的事情)。

下面是子类模块:

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

使用上述代码的一些示例脚本代码:

代码语言:javascript
复制
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;  
  }
}
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64526060

复制
相关文章

相似问题

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