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.org.cn/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