基本用法

Imagick 通过 OO 接口使 PHP 中的图像操作变得极其容易。以下是一个快速示例,演示如何制作缩略图

示例 #1 在 Imagick 中创建缩略图

<?php

header
('Content-type: image/jpeg');

$image = new Imagick('image.jpg');

// 如果宽度或高度参数为 0,
// 将保持纵横比
$image->thumbnailImage(100, 0);

echo
$image;

?>

使用 SPL 和 Imagick 支持的其他 OO 功能,可以轻松地调整目录中所有文件的尺寸(对于将大量数码相机图像批量调整尺寸以供网页浏览很有用)。在这里,我们使用 resize,因为我们可能想要保留某些元数据

示例 #2 制作目录中所有 JPG 文件的缩略图

<?php

$images
= new Imagick(glob('images/*.JPG'));

foreach(
$images as $image) {

// 提供 0 会强制 thumbnailImage 保持纵横比
$image->thumbnailImage(1024,0);

}

$images->writeImages();

?>

这是一个创建图像反射的示例。反射是通过翻转图像并在其上叠加渐变创建的。然后,原始图像和反射都叠加在画布上。

示例 #3 创建图像的反射

<?php
/* 读取图像 */
$im = new Imagick("test.png");

/* 创建图像缩略图 */
$im->thumbnailImage(200, null);

/* 为图像创建边框 */
$im->borderImage(new ImagickPixel("white"), 5, 5);

/* 克隆图像并翻转它 */
$reflection = $im->clone();
$reflection->flipImage();

/* 创建渐变。它将叠加在反射上 */
$gradient = new Imagick();

/* 渐变需要足够大以容纳图像和边框 */
$gradient->newPseudoImage($reflection->getImageWidth() + 10, $reflection->getImageHeight() + 10, "gradient:transparent-black");

/* 将渐变合成到反射上 */
$reflection->compositeImage($gradient, imagick::COMPOSITE_OVER, 0, 0);

/* 添加一些不透明度。需要 ImageMagick 6.2.9 或更高版本 */
$reflection->setImageOpacity( 0.3 );

/* 创建一个空的画布 */
$canvas = new Imagick();

/* 画布需要足够大以容纳两个图像 */
$width = $im->getImageWidth() + 40;
$height = ($im->getImageHeight() * 2) + 30;
$canvas->newImage($width, $height, new ImagickPixel("black"));
$canvas->setImageFormat("png");

/* 将原始图像和反射合成到画布上 */
$canvas->compositeImage($im, imagick::COMPOSITE_OVER, 20, 10);
$canvas->compositeImage($reflection, imagick::COMPOSITE_OVER, 20, $im->getImageHeight() + 10);

/* 输出图像*/
header("Content-Type: image/png");
echo
$canvas;
?>

上面的示例将输出类似于

Output of example : Creating a reflection of an image

此示例说明如何在绘制时使用填充模式。

示例 #4 用渐变填充文本

<?php

/* 创建一个新的 Imagick 对象 */
$im = new Imagick();

/* 创建新图像。这将用作填充图案 */
$im->newPseudoImage(50, 50, "gradient:red-black");

/* 创建 ImagickDraw 对象 */
$draw = new ImagickDraw();

/* 启动一个名为 "gradient" 的新图案 */
$draw->pushPattern('gradient', 0, 0, 50, 50);

/* 将渐变合成到图案上 */
$draw->composite(Imagick::COMPOSITE_OVER, 0, 0, 50, 50, $im);

/* 关闭图案 */
$draw->popPattern();

/* 使用名为 "gradient" 的图案作为填充 */
$draw->setFillPatternURL('#gradient');

/* 将字体大小设置为 52 */
$draw->setFontSize(52);

/* 添加一些文本 */
$draw->annotation(20, 50, "Hello World!");

/* 创建一个新的画布对象和一个白色图像 */
$canvas = new Imagick();
$canvas->newImage(350, 70, "white");

/* 将 ImagickDraw 绘制到画布上 */
$canvas->drawImage($draw);

/* 图像周围 1 像素黑色边框 */
$canvas->borderImage('black', 1, 1);

/* 将格式设置为 PNG */
$canvas->setImageFormat('png');

/* 输出图像 */
header("Content-Type: image/png");
echo
$canvas;
?>

上面的示例将输出类似于

Output of example : Filling text with gradient

处理动画 GIF 图像

示例 #5 读取 GIF 图像并调整所有帧的大小

<?php

/* 创建一个新的 Imagick 对象并读取 GIF */
$im = new Imagick("example.gif");

/* 调整所有帧的大小 */
foreach ($im as $frame) {
/* 50x50 帧 */
$frame->thumbnailImage(50, 50);

/* 将虚拟画布设置为正确的大小 */
$frame->setImagePage(50, 50, 0, 0);
}

/* 注意使用 writeImages 而不是 writeImage */
$im->writeImages("example_small.gif", true);
?>

使用椭圆形基元和自定义字体

示例 #6 创建一个 PHP 徽标

<?php
/* 设置宽度和高度,与真正的 PHP 徽标比例一致 */
$width = 400;
$height = 210;

/* 创建一个带有透明画布的 Imagick 对象 */
$img = new Imagick();
$img->newImage($width, $height, new ImagickPixel('transparent'));

/* 创建新的 ImagickDraw 实例用于绘制椭圆形 */
$draw = new ImagickDraw();
/* 设置椭圆形填充颜色为紫色 */
$draw->setFillColor('#777bb4');
/* 设置椭圆形尺寸 */
$draw->ellipse($width / 2, $height / 2, $width / 2, $height / 2, 0, 360);
/* 将椭圆形绘制到画布上 */
$img->drawImage($draw);

/* 将填充颜色从紫色重置为黑色用于文本(注意:我们正在重用 ImagickDraw 对象) */
$draw->setFillColor('black');
/* 设置白色描边边框 */
$draw->setStrokeColor('white');
/* 设置描边边框厚度 */
$draw->setStrokeWidth(2);
/* 设置字距(负值表示字母彼此更靠近) */
$draw->setTextKerning(-8);
/* 设置 PHP 徽标中使用的字体和字体大小 */
$draw->setFont('Handel Gothic.ttf');
$draw->setFontSize(150);
/* 水平垂直居中文本 */
$draw->setGravity(Imagick::GRAVITY_CENTER);

/* 将居中的 "php" 添加到画布上,Y 偏移量为 -10(在椭圆形内) */
$img->annotateImage($draw, 0, -10, 0, 'php');
$img->setImageFormat('png');

/* 设置 PNG 的适当标头并输出图像 */
header('Content-Type: image/png');
echo
$img;
?>

上面的示例将输出类似于

Output of example : Creating PHP logo with Imagick

添加说明

用户贡献的说明 2 个说明

36
vokseli
10 年前
在将数组传递给新的 Imagick 对象以加载多个图像时,请小心。这来自示例 #2。

<?php

$images
= new Imagick(glob('images/*.JPG'));

?>

如果 images 文件夹中包含大量图像,PHP 会消耗大量内存,因此不建议这样做。我个人认为,单独循环每个图像是一个更好的主意。

<?php

$image_files
= glob('images/*.JPG');

foreach (
$image_files as $image_file) {
$image = new Imagick($image_file);
// 对图像执行某些操作,等等...
}

?>

这样,一次只将单个图像放入内存中。
18
inoshadi at gmail dot com
10 年前
关于示例 #3 创建图像的反射
----------------------------------------------------
/* 克隆图像并翻转它 */
$reflection = $im->clone();
$reflection->flipImage();
----------------------------------------------------
它使用了 Imagick::clone 函数。

该函数已从 imagick 3.1.0 开始被弃用,建议使用 clone 关键字。

请改用以下代码
----------------------------------------------------
/* 克隆图像并翻转它 */
$reflection = clone $im;
$reflection->flipImage();
----------------------------------------------------

https://php.net/manual/en/imagick.clone.php
To Top