PHP Conference Japan 2024

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

提供任何对您的通道模式有效的通道常量。要应用于多个通道,请使用按位运算符组合 channeltype 常量。请参阅此 通道常量列表

返回值

成功时返回 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 条注释

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_* 常量。
elizapinchley at google dot com
3 年前
新版本中 Imagick 常量已发生更改。请阅读新的常量列表,例如这样。

<?php

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

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

?>
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;

?>
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