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

將一個影像以指定的偏移量合成到另一個影像上。組合演算法所需的任何額外引數都應該以 'compose:args' 作為第一個參數,資料作為第二個參數傳遞到 setImageArtifact 中。

參數

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 則註解

m dot roszka at textend dot net
16 年前
以下是一個關於如何將兩個影像合成到一個影像中的範例。Imagick 類別利用了 PHP5 中引入的例外處理模型,因此我們也會這麼做。讓我們假設,在我們的檔案系統中有一個目錄,其中包含我們的程式和我們要操作的兩個影像。

<?php
try
{
// 讓我們檢查是否可以執行魔術。
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