Imagick::compositeImage

(PECL imagick 2, PECL imagick 3)

Imagick::compositeImage将一张图像合成到另一张图像上

描述

public Imagick::compositeImage(
    Imagick $composite_object,
    int $composite,
    int $x,
    int $y,
    int $channel = Imagick::CHANNEL_DEFAULT
): bool

将一张图像合成到另一张图像上的指定偏移处。合成算法需要的任何额外参数都应该传递给 setImageArtifact,第一个参数为 'compose:args',第二个参数为数据。

参数

composite_object

包含合成图像的 Imagick 对象

compose

合成操作符。参见 合成操作符常量

x

合成图像的列偏移量

y

合成图像的行偏移量

channel

提供任何对您的通道模式有效的通道常量。要应用到多个通道,请使用按位运算符组合通道类型常量。参考此列表中的 通道常量.

返回值

成功时返回 true

示例

示例 #1 使用 Imagick::compositeImage()

使用 'mathematics' 合成方法将两张图像合成在一起

<?php

// 等同于运行以下命令
// convert src1.png src2.png -compose mathematics -define compose:args="1,0,-0.5,0.5" -composite output.png

$src1 = new \Imagick("./src1.png");
$src2 = new \Imagick("./src2.png");

$src1->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$src1->setImageArtifact('compose:args', "1,0,-0.5,0.5");
$src1->compositeImage($src2, Imagick::COMPOSITE_MATHEMATICS, 0, 0);
$src1->writeImage("./output.png");

?>

参见

添加备注

用户贡献的备注 4 notes

6
m dot roszka at textend dot net
16 年前
以下是如何将两张图像合成到一张图像中的示例。Imagick 类利用了 PHP5 中引入的异常处理模型,因此我们也将这样做。假设我们有一个包含程序和我们要操作的两张图像的目录。

<?php
try
{
// 让我们检查是否可以执行 magick。
if (TRUE !== extension_loaded('imagick'))
{
throw new
Exception('Imagick 扩展未加载.');
}

// 此检查是前面检查的替代方法。
// 使用最适合您的方法。
if (TRUE !== class_exists('Imagick'))
{
throw new
Exception('Imagick 类不存在.');
}

// 让我们找出我们身在何处。
$dir = dirname(__FILE__);

// 让我们读取图像。
$glasses = new Imagick();
if (
FALSE === $glasses->readImage($dir . '/glasses.png'))
{
throw new
Exception();
}

$face = new Imagick();
if (
FALSE === $face->readImage($dir . '/face.jpg'))
{
throw new
Exception();
}

// 让我们戴上眼镜(距离脸部左侧 10 像素,顶部 20 像素)。
$face->compositeImage($glasses, Imagick::COMPOSITE_DEFAULT, 10, 20);

// 让我们合并所有图层(不是强制性的)。
$face->flattenImages();

// 我们不想覆盖 face.jpg。
$face->setImageFileName($dir . '/face_and_glasses.jpg');

// 让我们写入图像。
if (FALSE == $face->writeImage())
{
throw new
Exception();
}
}

catch (
Exception $e)
{
echo
'捕获异常: ' . $e->getMessage() . "\n";
}

exit(
0);
?>
关于 Imagick::COMPOSITE_DEFAULT 参数的补充说明。我们正在合成的图像分别是独立的图层。我们不仅可以按特定顺序放置它们,还可以选择它们相互干扰的方式。第二个参数就是 compositeImage 方法的第二个参数。它可以作为常量或该常量的整数值给出。您可以使用 PHP5 的反射 API 获取它们的列表。

<?php
Reflection
::export(new ReflectionClass('Imagick'));
?>

在“常量”部分中查找 COMPOSITE_* 常量。
2
elizapinchley at google dot com
3 年前
新版本中 Imagick 常量发生了变化。请阅读新的常量列表,例如:

<?php

$img
= new \Imagick();
$reflection_class = new ReflectionClass($img);

die(
var_dump($reflection_class->getConstants()));

?>
0
Iddles
13 年前
要将一张图像的 alpha 通道复制到另一张图像,您可以执行以下操作

<?php

$img1
= new Imagick( "image1.png" );
$img2 = new Imagick( "image2.png" );

$img1->compositeImage( $img2, imagick::COMPOSITE_COPYOPACITY, 0, 0 );

header('Content-type: image/png');
echo
$img1;

?>
0
giso at connectholland dot nl
14 年前
你可能需要在将两张图片叠加时设置相同的颜色空间

<?php
// 创建两个 Imagick 对象
$first = new Imagick('first.jpg');
$second = new Imagick('second.jpg');

// 将颜色空间设置为相同的值
$first->setImageColorspace($second->getImageColorspace() );

// 将第二张图片放在第一张图片上
$first->compositeImage($second, $second->getImageCompose(), 5, 5);

// 新图片保存为 final.jpg
$first->writeImage('final.jpg');
?>
To Top