【问题标题】:Shear image, composite on another image, using PerlMagick剪切图像,在另一个图像上合成,使用 PerlMagick
【发布时间】:2019-12-25 12:41:00
【问题描述】:

我正在尝试剪切图像并将其放置在另一个图像上,例如蛋糕上的照片,我正在使用 Perl 并使用 Image::Magick Perl 库。 这是我能够生成的输出,我无法制作剪切图像的背景。这是我的代码:

#!/usr/bin/perl
use strict;
use warnings;
use Image::Magick;

my $im = Image::Magick->new;

$im->Read('cake.jpg');

$im->Scale('50%');

my $sh = Image::Magick->new;

$sh->Set( magick => 'png' );

$sh->Read('oo.jpg');

$sh->Resize(width => 580, height => 540);

$sh->Shear( geometry => '580x540+0+0', x => -40, y => -30, 'virtual-pixel' => 'Transparent');

$im->Composite( image => $sh, geometry => '+90+60');

$im->Write('test.jpg');

另外,我看过一些使用 AffineTransform 的帖子,但使用那些我无法实现剪切。

【问题讨论】:

  • 问题是什么?你想让背景透明吗?代替将虚拟像素设置为透明,将背景颜色设置为透明。
  • 是的,我希望背景是透明的,但是 Shear 方法不接受虚拟像素参数
  • 尝试将背景颜色而不是虚拟像素设置为透明。
  • Shear 方法不接受虚拟像素参数,Shear geometry=>geometry, x=>double, y=>double fill=>color name
  • 我一直在说,虚拟像素设置对剪切没有影响。它是需要设置的背景颜色。在调用剪切之前使用颜色名称参数或设置背景颜色属性。

标签: perl image-processing imagemagick affinetransform perlmagick


【解决方案1】:

我通过创建蒙版(通过反转 alpha 通道)解决了这个问题。这是代码,希望对某人有所帮助:

use strict;
use warnings;
use Image::Magick;

my $im = Image::Magick->new;

$im->Read('cake.jpg');

$im->Scale('50%');

my $sh = Image::Magick->new;

$im->Set( magick => 'png' );
$sh->Set( magick => 'png' );

$sh->Read('oo.jpg');
$sh->Scale('50%');

## create a copy
my $sh1 = $sh->Clone();

## set alpha
$sh->Set('alpha' => 'Transparent');

## shear first
my $x = $sh->Shear( geometry => '290x270+0+0', x => -40, y => -30, fill => undef);

## invert to get a mask
$sh->Negate(channel => 'Alpha');

## shear copy
$x = $sh1->Shear( geometry => '290x270+0+0', x => -40, y => -30);

## apply mask
$sh1->Composite( compose => 'CopyOpacity', image => $sh);

$im->Composite( image => $sh1, geometry => '+450+260', );

$im->Write('test.jpg');

最终图像:

【讨论】:

    猜你喜欢
    • 2014-03-08
    • 2011-02-03
    • 2021-03-16
    • 2012-08-19
    • 1970-01-01
    • 2021-10-04
    • 2020-11-15
    • 1970-01-01
    • 2021-03-28
    相关资源
    最近更新 更多