PHP ImageMagick扩展有哪些函数?PHP ImageMagick扩展的使用方法

28,945次阅读
没有评论

共计 1838 个字符,预计需要花费 5 分钟才能阅读完成。

ImageMagick 是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。

官方网站:https://imagemagick.org/index.php

PHP 相关文档:https://www.php.net/manual/zh/book.imagick.php

安装 ImageMagick

相关文章:https://imagemagick.org/script/download.php

1.window

下载安装可执行文件即可:https://imagemagick.org/script/download.php#windows

下载安装扩展:https://pecl.php.net/package/imagick

拓展的版本需要和 PHP 版本相匹配,版本不匹配时扩展无法加载(32 位、64 位、兼容的 PHP 版本等)

2.linux

# 安装 ImageMagick
yum install ImageMagick
yum install ImageMagick-devel

# 自己编译,先下载代码
https://github.com/ImageMagick/ImageMagick

wget http://www.imagemagick.org/download/ImageMagick.tar.gz
tar zxvf ImageMagick-7.1.1-35.tar.gz
cd ImageMagick-7.1.1-35
./configure --prefix=/usr/local/ImageMagick/  --enable-shared --enable-threads=posix --with-system-zlib --enable-__cxa_atexit --disable-openmp
make && make install

# 安装拓展
pecl install imagick-3.6.0


# 手动安装
wget https://pecl.php.net/get/imagick-3.6.0.tgz -T 5
tar -zxf imagick-3.6.0.tgz
cd imagick-3.6.0
/www/server/php/74/bin/phpize

./configure --with-php-config=/www/server/php/74/bin/php-config --with-imagick=/usr/local/ImageMagick-7.1.0 --with-webp
 make && make install

ImageMagick-devel 是用于 ImageMagick 程序开发的静态库和头文件。

Imagick 介绍

在 Imagick 中可以同时存在多张图像,比如:

  1. newImage(新建图像)
  2. addImage(添加图像)
  3. clone 关键词(克隆图像)
  4. hasNextImage 和 hasPreviousImage(是否还有其他图像)
  5. getIteratorIndex 和 setIteratorIndex(setImageIndex)和 resetIterator 和 setLastIterator
  6. appendImages,追加一整个 ImageMagick 对象
  7. getNumberImages,获取图像的数量

Imagick 通过 destroy()/clear() 方法释放内存

相关函数

相关文档:https://phpimagick.com/

相关常量:https://www.php.net/manual/zh/imagick.constants.php

1.Imagick 类

Imagick 类涵盖了如何修改基于像素的图像的 Imagick 类的所有方法。

1.1 创建画布

// 创建一个新图片, 宽 500px, 高 300px, 黑色,格式为 png 的图片:// 也可以使用远程图片进行初始化
$img =new Imagick();
$img->newImage(500,300,'black','png');

1.2 获取图片的分辨率

// 通过图片路径进行初始化
$imgtwo = new Imagick($imageSrc);
$height=$img->getImageHeight();// 获取图片 1 高度
$width=$img->getImageWidth();// 获取图片 1 宽度
// 获取长宽的关联数组
$img->getImageGeometry();

1.3 文字绘制

newImage(800, 300, $pixel);

/* Black text */
$draw->setFillColor('green');

/* Font properties */
$draw->setFont('./a.ttf');
$draw->setFontSize(30);

/* Create text */
/* 可通过换行符实现文字写入时的换行 */
$image->annotateImage($draw, 30, 140, 0, '使用 php/windows 安装 ImageMagick 扩展');

/* Give image a format */
$image->setImageFormat('png');

/* Output the image with headers */
header('Content-type: image/png');
echo $image;
PHP ImageMagick 扩展有哪些函数?PHP ImageMagick 扩展的使用方法

示例

1.4 添加、减少噪点

相关函数:https://www.php.net/manual/zh/imagick.addnoiseimage.php

// 方法示例
bool Imagick::addNoiseImage ($noise_type, $channel)
// 添加噪点
$image->addNoiseImage(3, imagick::CHANNEL_DEFAULT); 
// 减少噪点
$image->despeckleImage(); 
PHP ImageMagick 扩展有哪些函数?PHP ImageMagick 扩展的使用方法

图片噪点

1.5 虚拟像素

// 设置虚拟像素方法
$imagick->setImageVirtualPixelMethod(Imagick::VIRTUALPIXELMETHOD_BACKGROUND);

// 获取虚拟像素方法
$imagick->getImageVirtualPixelMethod();

虚拟像素就是指显示屏上的物理像素点数和实际显示的像素点数是 1:N(N=2X2)的关系,它能显示的图像像素比显示屏的实际像素多是长宽像素各 2 倍。

1.6 读取图像

/*Imagick Object*/
$imagick = new Imagick();
$imagick->readImage('./10.png');

1.7 PDF 转图片

// 读取 PDF
$imagick->readImage('myfile.pdf);
// 读取 PDF 指定页
$imagick->readImage('myfile.pdf[0]');

$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(imagick::ALPHACHANNEL_REMOVE);
// 合并所有图层
$im->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);

1.8 缩小图像

// 缩小图像
$imagick = new Imagick();
$imagick->readImage('./file.png');
// 将图像的大小更改为给定的尺寸并删除所有关联的配置文件。长宽为 0 时,会按照比例自动缩放
// 指定第三个参数为 true 时,必须指定长宽,会按照比例来自动调整实际大小
$imagick->thumbnailImage(100, 0);

同时还可以使用 scaleImage:

$im = new Imagick('1600x1200.jpg');
$im->scaleImage(2000, 1500, true); // => 1600x1200
$im->scaleImage(1000, 500, true); // => 666x500

resizeImage 在缩放时,可以使用过滤器

1.9 图像组合

setImageCompose(2); 设置图片合并的模式,类似前端 canvas 的 globalposition 属性

$im->compositeImage($im2,$im2->getImageCompose(),0,0);

1.10 绘制 ImagickDraw 对象

setFillColor(new ImagickPixel('blue'));

$draw->setFontSize(28);

$metrix = $im->queryFontMetrics($draw, $string);

$draw->annotation(0,25,$string);

$im->newImage($metrix['textWidth'],$metrix['textHeight'], new ImagickPixel('white'));
$im->drawImage($draw);
$im->borderImage(new ImagickPixel('black'), 1, 1);
$im->setImageFormat('png');

$im->writeImage("./test.png");

1.11 去除图像多余的透明部分

setImageBackgroundColor('none');

// 找到最左、最右、最上和最下的非透明像素点
$imagick->trimImage(0);

// 获取裁剪后的图片的尺寸
$geometry = $imagick->getImageGeometry();
$width = $geometry['width'];
$height = $geometry['height'];

// 保存裁剪后的图片
$imagick->writeImage('cropped_image.png');
$imagick->clear();
$imagick->destroy();

echo "图片裁剪完成!";

其他方法

  • Imagick::getImageBlob、Imagick::getImagesBlob,获取图像的二进制数据。
  • Imagick::setImageBackgroundColor,设置图片背景颜色
  • Imagick::setImageType,设置图像类型(真彩色,调色板、灰度等)
  • Imagick::distortImage,用于扭曲图像
  • Imagick::getImageFormat,获取图像格式
  • Imagick::getImageMimeType,获取图像的 MiMe 类型
  • Imagick::chopImage() – 移除图像区域并进行修剪
  • Imagick::cropImage() – 截图图片的一块区域
  • Imagick::magnifyImage() – 按比例缩放图像 2 倍
  • Imagick::minifyImage() – 将图像按比例缩放到其一半大小
  • Imagick::resizeImage() – 缩放图像
  • Imagick::scaleImage() – 缩放图像的大小
  • Imagick::shaveImage() – 从图像边缘去除像素
  • Imagick::thumbnailImage() – 改变图像的大小
  • Imagick::trimImage() – 从图像中移除边缘
  • Imagick::setOption,设置图像的一些元属性
  • Imagick::destroy/clear(),删除对象有关的所有资源
  • Imagick::coalesceImages,合成一组图像,用于处理 GIF
  • Imagick::writeImage,写入文件

ImagickDraw

ImagickDraw 类允许通过 ImageMagick 绘制基于矢量的图像。

1. 设置字体样式 

setStrokeColor($strokeColor);
/* 设置字体颜色 */
$draw->setFillColor($fillColor);
/* 设置描边的颜色 */
$draw->setStrokeWidth(2);
/* 设置字体的大小 */
$draw->setFontSize(36);
/* 设置字体 */
$draw->setFont("../fonts/Arial.ttf");
/* 指定文字 */
$draw->annotation(50, 50, "Lorem Ipsum!");
/* 设置透明度 */
$draw->setFillOpacity(0.4);
/* 正常、斜体、偏斜 */
$draw->setFontStyle(Imagick::STYLE_OBLIQUE);
/* 设置字体的粗细 */
$draw->setFontWeight(900);
/* 设置上、下划线 */
$draw->setTextDecoration("Upperline")
/* 文字背景颜色 */
$draw->setTextUnderColor("#ffffff");
/* 文字字距 */
$draw->setTextKerning(1.2);

2. 设置文本的对齐方式

setTextAlignment(Imagick::ALIGN_LEFT);
$draw->annotation(250, 75, "Lorem Ipsum!");
// 居中
$draw->setTextAlignment(Imagick::ALIGN_CENTER);
$draw->annotation(250, 150, "Lorem Ipsum!");
// 右对齐
$draw->setTextAlignment(Imagick::ALIGN_RIGHT);
$draw->annotation(250, 225, "Lorem Ipsum!");

3. 相关函数

  1. setFillRule,类似前端 canvas 的 fill 规则。

问题记录

1. 内存占用过大

Imagick::setResourceLimit(Imagick::RESOURCETYPE_MEMORY, 256);

这行代码设置了 Imagick 可以使用的内存资源上限。Imagick::RESOURCETYPE_MEMORY 是一个常量,表示内存资源类型。第二个参数 256 表示将内存限制设置为 256MB。这意味着 Imagick 在处理图像时不会使用超过 256MB 的内存。如果处理的图像需要更多的内存,Imagick 可能会抛出资源限制异常。

Imagick::setResourceLimit(Imagick::RESOURCETYPE_MAP, 256);

这行代码设置了 Imagick 可以使用的映射资源上限。Imagick::RESOURCETYPE_MAP 是一个常量,表示映射资源类型,这通常与图像的色彩映射有关。映射资源用于存储图像的色彩映射信息,例如,当使用伪彩色(pseudocolor)或调色板(palette)图像时。将映射资源限制为 256MB 可以防止 Imagick 为每个图像创建过大的色彩映射,从而占用过多的内存。

2. cpu 占用过高

imagick 的多线程模式有一個 bug,他会导致多核心的 cpu 使用率瞬间飙升到 100%。所以一定要使用它的单线程程模式才行。

重新编译 ImageMagick 最新版,增加了参数:–disable-openmp,cpu 负载就下来了。

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于2024-09-10发表,共计1838字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)