PHP Conference Japan 2024

Imagick::clipPathImage

(PECL imagick 2,PECL imagick 3)

Imagick::clipPathImage沿著 8BIM 設定檔中的具名路徑進行裁剪

描述

public Imagick::clipPathImage(string $pathname, bool $inside): bool

沿著 8BIM 設定檔中的具名路徑(如果存在)進行裁剪。後續的操作會在路徑內生效。如果前面加上 #,則可以使用數字,以處理編號的路徑,例如「#1」表示使用第一個路徑。

參數

pathname

路徑的名稱

inside

如果為 true,後續操作會在裁剪路徑內生效。否則,後續操作會在裁剪路徑外生效。

回傳值

成功時回傳 true

錯誤/例外

發生錯誤時擲回 ImagickException。

新增註記

使用者貢獻的註記 1 則註記

1
Coleman Nitroy
16 年前
我發現 Imagick::clipPathImage 和 Imagic::clipImage 的運作方式與我預期的不同。我以為它們只會裁剪路徑,然後丟棄額外的資料,這樣就完成了。但事實並非如此。

以下是我如何使用裁剪路徑的方式

<?php
$img
= new Imagick("/Path/To/Test/Image.psd");
$geometry = $img->getImageGeometry();

// 使用第一個路徑作為裁剪路徑
$img->clipPathImage("#1", false);

// 以顏色填滿裁剪的部分
$draw = new ImagickDraw();
$draw->setFillColor("#000000");
$draw->color(0,0, imagick::PAINT_RESET);
$img->drawImage($draw);

// 將裁剪的影像與舊影像合成。將合成的顏色設定為您希望外部部分的任何顏色。
$composite = new Imagick($path);
$composite->newImage( $geometry['width'], $geometry['height'], new ImagickPixel("white"), 'png');
$composite->compositeImage($img, imagick::COMPOSITE_COPY, 0, 0);
?>

然後對產生的影像進行任何大小調整或建立縮圖,都會忽略先前所有的指令,所以我「儲存」它並從新的 Imagick 物件開始

<?php
// 複製影像以「儲存」裁剪
$clipped = new Imagick();
$clipped->readImageBlob($composite->getImageBlob());
?>

我確定有更簡單的方法,但我花了很長時間才弄對,而且還有一些障礙需要克服,所以我希望它可以幫助正在摸索的人。

這相當於所有 convert 的操作

$ convert Test.psd -fill white -colorspace rgb -draw "color 0 0 reset" -clip -colorspace rgb -draw "Image Copy 0,0 0,0 'Test.psd'" OutputFile.png
To Top