PHP Conference Japan 2024

Imagick::distortImage

(PECL imagick 2 >= 2.0.1,PECL imagick 3)

Imagick::distortImage使用各種扭曲方法扭曲影像

說明

public Imagick::distortImage(int $method, array $arguments, bool $bestfit): bool

使用各種扭曲方法扭曲影像,方法是將來源影像的顏色查找映射到新的目標影像,目標影像的大小通常與來源影像相同,除非 'bestfit' 設定為 true

如果啟用 'bestfit',且扭曲允許,則會調整目標影像,以確保整個來源 '影像' 剛好適合最終的目標影像,目標影像將會相應地調整大小和偏移。此外,在許多情況下,來源影像的虛擬偏移將會納入映射考量。

如果 Imagick 是針對 ImageMagick 6.3.6 或更新版本編譯,則可以使用此方法。

參數

method

影像扭曲的方法。請參閱扭曲常數

arguments

此扭曲方法的引數

bestfit

嘗試調整目標大小以符合扭曲的來源

傳回值

成功時傳回 true

錯誤/例外

發生錯誤時擲回 ImagickException。

範例

範例 #1 使用 Imagick::distortImage()

扭曲影像並顯示在瀏覽器中。

<?php
/* 建立新物件 */
$im = new Imagick();

/* 建立新的棋盤格圖案 */
$im->newPseudoImage(100, 100, "pattern:checkerboard");

/* 將影像格式設定為 png */
$im->setImageFormat('png');

/* 以透明填滿新的可見區域 */
$im->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);

/* 啟用遮罩 */
$im->setImageMatte(true);

/* 扭曲的控制點 */
$controlPoints = array( 10, 10,
10, 5,

10, $im->getImageHeight() - 20,
10, $im->getImageHeight() - 5,

$im->getImageWidth() - 10, 10,
$im->getImageWidth() - 10, 20,

$im->getImageWidth() - 10, $im->getImageHeight() - 10,
$im->getImageWidth() - 10, $im->getImageHeight() - 30);

/* 執行扭曲 */
$im->distortImage(Imagick::DISTORTION_PERSPECTIVE, $controlPoints, true);

/* 輸出影像 */
header("Content-Type: image/png");
echo
$im;
?>

上述範例將會輸出類似以下的結果

Output of example : Using Imagick::distortImage()

另請參閱

新增註解

使用者貢獻的註解 4 則註解

DJ Mike
13 年前
仿射

<?php
$image
= new imagick( "opossum.jpg" );
$points = array(
0,0, 25,25,
100,0, 100,50
);
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_AFFINE, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo
$image;
?>

仿射投影

<?php
$image
= new imagick( "opossum.jpg" );
$points = array( 0.9,0.3,
-
0.2,0.7,
20,15 );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_AFFINEPROJECTION, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo
$image;
?>

弧形

<?php
$image
= new imagick( "opossum.jpg" );
$draw = new imagickdraw();
$degrees = array( 180 );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_ARC, $degrees, TRUE );
header( "Content-Type: image/jpeg" );
echo
$image;
?>

旋轉弧形

<?php
$image
= new imagick( "opossum.jpg" );
$draw = new imagickdraw();
$degrees = array( 180, 45, 100, 20 );
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_ARC, $degrees, TRUE );
header( "Content-Type: image/jpeg" );
echo
$image;
?>

雙線性

<?php
$image
= new imagick( "opossum.jpg" );
$points = array(
0,0, 25,25, # 左上角
176,0, 126,0, # 右上角
0,135, 0,105, # 右下角
176,135, 176,135 # 左下角
);
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_BILINEAR, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo
$image;
?>

透視

<?php
$image
= new imagick( "opossum.jpg" );
$points = array(
0,0, 25,25, # 左上角
176,0, 126,0, # 右上角
0,135, 0,105, # 右下角
176,135, 176,135 # 左下角
);
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( Imagick::DISTORTION_PERSPECTIVE, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo
$image;
?>

縮放旋轉平移

<?php
$image
= new imagick( "opossum.jpg" );
$points = array(
1.5, # 縮放 150%
150 # 旋轉
);
$image->setimagebackgroundcolor("#fad888");
$image->setImageVirtualPixelMethod( imagick::VIRTUALPIXELMETHOD_BACKGROUND );
$image->distortImage( imagick::DISTORTION_SCALEROTATETRANSLATE, $points, TRUE );
header( "Content-Type: image/jpeg" );
echo
$image;
?>
peter dot e dot lind at gmail dot com
9 年前
值得注意的是,關於扭曲以及參數的詳細資訊可以在 https://imagemagick.dev.org.tw/Usage/distorts/ 找到 - PHP 手冊對於參數沒有提供太多(如果有)的詳細說明。

當我需要在影像上執行平移旋轉時,發現這個方法非常有用 - 也就是繞著影像中非中心點的點旋轉。這可以使用帶有 Imagick::DISTORTION_SCALEROTATETRANSLATE 的 distortImage 來實現,如下所示:

<?php

$imagick
= new Imagick('/path/to/image');
$args = array(
20, # 要繞著旋轉的 x 點
20, # 要繞著旋轉的 y 點
1, # 縮放比例 - 1 表示不縮放
90, # 旋轉角度
);

$imagick->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_TRANSPARENT);
$imagick->distortImage(Imagick::DISTORTION_SCALEROTATETRANSLATE, $args, true);

?>

請注意,此類型的扭曲變形會根據您想執行的操作,接收 1 到 7 個參數,這裡有很大的彈性。
Abe
3 年前
DISTORTION_PERSPECTIVE 的控制點是 x0, y0, x1, y1 座標對,其中 x0/y0 是原始點,而 x1/y1 是目標點。

例如,對於四點透視變形:

<?php

$im
= new imagick( $fn);

$w=$im->getImageWidth();
$h=$im->getImageHeight();
$im->setImageFormat('png');

$controlPoints = array(
$tLx, $tLy, 0, 0, // 左上角
$tRx, $tRy, $w, 0, // 右上角
$bRx, $bRy, $w, $h, // 右下角
$bLx, $bLy, 0, $h // 左下角
);

/* 執行扭曲變形 */
$im->distortImage(Imagick::DISTORTION_PERSPECTIVE, $controlPoints, false);

// 輸出影像
$output = $im->getimageblob();
$outputtype = $im->getFormat();

header("Content-type: $outputtype");
echo
$output;

?>
ashokmca.g at gmail dot com
13 年前
使用 distortImage 製作帶有陰影的滑動影像

<?php

$slideValue
= 150;

// 建立新物件
$im = new Imagick("grnhrs.jpg");

// 調整大小
$im->thumbnailImage(500,400);

// 設定影像格式為 png
$im->setImageFormat('png');

// 複製目前的物件
$shadow = $im->clone();

// 設定影像背景顏色為黑色(這是陰影的顏色)
$shadow->setImageBackgroundColor( new ImagickPixel( 'black' ) );

// 建立陰影
$shadow->shadowImage( 80, 10, 5, 5 );

// 使用透明填充影像的背景區域
//VIRTUALPIXELMETHOD_TRANSPARENT
$im->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_ TRANSPARENT);

// 啟用遮罩
$im->setImageMatte(true);

// 變形的控制點
$controlPoints = array( 0, 0,
$slideValue, 0,

0, $im->getImageHeight(),
0, $im->getImageHeight(),

$im->getImageWidth(), 0,
$im->getImageWidth(), 0,

$im->getImageWidth(), $im->getImageHeight(),
$im->getImageWidth()-$slideValue, $im->getImageHeight());

// 執行變形
$im->distortImage(Imagick::DISTORTION_PERSPECTIVEPROJECTION, $controlPoints, true);

// 在陰影影像中執行變形
$shadow->distortImage(Imagick::DISTORTION_PERSPECTIVEPROJECTION, $controlPoints, true);

// Imagick::shadowImage 只建立陰影。
// 這就是為什麼原始影像要覆蓋在它之上
$shadow->compositeImage( $im, Imagick::COMPOSITE_OVER, 0, 0 );

/* 輸出影像 */
header("Content-Type: image/png");
echo
$shadow;

?>
To Top