ImageMagick是一个免费的创建、编辑、合成图片的软件。它可以读取、转换、写入多种格式的图片。图片切割、颜色替换、各种效果的应用,图片的旋转、组合,文本,直线,多边形,椭圆,曲线,附加到图片伸展旋转。
安装ImageMagick 1.window
拓展的版本需要和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中可以同时存在多张图像,比如:
newImage(新建图像) addImage(添加图像) clone关键词(克隆图像) hasNextImage和hasPreviousImage(是否还有其他图像) getIteratorIndex和setIteratorIndex(setImageIndex)和resetIterator和setLastIterator appendImages,追加一整个ImageMagick对象 getNumberImages,获取图像的数量
Imagick通过destroy()/clear()方法释放内存
相关函数 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 文字绘制 <?php /* Create some objects */ \)image = new Imagick(); \(draw = new ImagickDraw(); \)pixel = new ImagickPixel(‘white’); /* New image / \(image->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;
示例
1.4 添加、减少噪点 // 方法示例 bool Imagick::addNoiseImage ( \(noise_type, \)channel ) // 添加噪点 \(image->addNoiseImage(3, imagick::CHANNEL_DEFAULT); // 减少噪点 \)image->despeckleImage();
图片噪点
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 图像组合 <?php /* 创建对象 */ \(im = new Imagick("10.png"); \)im2 = new Imagick(“20.png”); // \(im2->setImageCompose(2); 设置图片合并的模式,类似前端canvas的globalposition属性 \)im->compositeImage(\(im2,\)im2->getImageCompose(),0,0);
1.10 绘制ImagickDraw对象 <?php \(string = "Hello world!"; \)im = new Imagick(); \(draw = new ImagickDraw(); \)draw->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 去除图像多余的透明部分 <?php // 创建一个新的 ImageMagick 对象 \(imagick = new Imagick('transparent_image.png'); // 设置背景颜色为透明 \)imagick->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.设置字体样式 <?php /* 设置字体描边 / \(draw->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.设置文本的对齐方式 <?php // 对齐方式代表指定的原点在文字的位置 // 左对齐 \)draw->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.相关函数
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为每个图像创建过大的色彩映射,从而占用过多的内存。
- cpu占用过高 imagick 的多线程模式有一個 bug,他会导致多核心的 cpu 使用率瞬间飙升到 100%。所以一定要使用它的单线程程模式才行。
重新编译 ImageMagick 最新版,增加了参数: –disable-openmp ,cpu负载就下来了。