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' 并且变形允许,则会调整目标图像以确保整个源 'image' 刚好适合最终的目标图像,并且会相应地调整大小和偏移。在许多情况下,源图像的虚拟偏移量也会在映射中被考虑在内。

如果 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.org.cn/Usage/distorts/找到 - PHP 手册没有提供太多(如果有的话)关于参数的详细信息。

当需要对图像进行平移旋转时,我发现这非常有用 - 即围绕图像中不是正方形中心的点旋转。这可以通过使用 distortImage 和 Imagick::DISTORTION_SCALEROTATETRANSLATE 来实现,如下所示

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