2024年PHP开发者大会日本站

基本用法

Imagick 通过面向对象的接口使在PHP中进行图像处理变得极其容易。这是一个关于如何制作缩略图的快速示例

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

<?php

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

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

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

echo
$image;

?>

使用Imagick支持的SPL和其他面向对象特性,可以轻松调整目录中所有文件的大小(对于将大型数码相机图像批量调整大小以供网页查看很有用)。在这里我们使用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);

/* 使用Y偏移量-10将居中的“php”添加到画布(在椭圆内) */
$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
[email protected]
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