php图像处理--ImageMagick

2021-03-19

能够用于读取,转换,写入多种不同格式的图像,包含 DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG, 和 TIFF;Imagemagick需要ghostscript来执行PDF操作

安装ImageMagick:http://www.imagemagick.org/  ImageMagick >= 6.2.4

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

  1. 常量
  2. Imagick类
    1. 创建图像对象
    2. 清除资源
    3. 读取图像
    4. 图像写入
    5. 添加隐藏图像
    6. 图像模糊
    7. 图像锐化
    8. 图像裁剪
    9. 图片放大/缩小
    10. 图像旋转
    11. 图像变化
    12. 图像滤镜
    13. 图像干扰
    14. 图像边缘调整
    15. 图像边框
    16. 图像合成
    17. 设置图像信息
    18. 获取图像信息
    19. 图像加解密
    20. 图像颜色
    21. 渲染绘画
    22. 获取图像流
  3. ImagickPixel颜色类
    1. 构造颜色对象
    2. 设置/获取颜色
    3. 清除颜色资源
  4. ImagickDraw绘画类
    1. 创建绘画对象
    2. 清除/释放资源
    3. 设置绘画笔触
    4. 绘制点、线、多边形
    5. 绘制圆
    6. 使用点连续绘制
    7. 绘制文本
    8. 绘制填充
    9. 渲染图像

常量

//黑色
imagick::COLOR_BLACK

//蓝色
imagick::COLOR_BLUE

//青色
imagick::COLOR_CYAN

//绿色
imagick::COLOR_GREEN

//红色
imagick::COLOR_RED

//黄色
imagick::COLOR_YELLOW

//洋红色
imagick::COLOR_MAGENTA

Imagick类

创建图像对象

// 创建图片$files的Imagick实例,$files是array时Imagick为一组图片的实例
new Imagick($files);

// 创建一个宽$columns高$rows,图像内容为$pseudoString的图像实例
$imagick = new Imagick();
$imagick->newPseudoImage($columns, $rows, $pseudoString);

清除资源

//清除与Imagick对象关联的所有资源
$imagick->clear():bool

读取图像

$imagick = new Imagick();

// 读取文件$filename创建图像
$imagick->readImage($filename);

// 读取文件资源$filehandle创建图像
$imagick->readImageFile($filehandle);

图像写入

// 将图像写入文件$filename,文件类型根据文件后缀自读取或指定文件类型与文件名(jpg:test.png)
$imagick->writeImage($filename);

// 将图像写入文件资源$filehandle
$imagick->writeImageFile($filehandle);

// 将设定的单张或多张图像写入文件$filename中,$adjoin为true时依次创建已文件名$filename为主以数字累加的文件,为false时图像将保存在一个文件中
$imagick->writeImages($filename, $adjoin);

添加隐藏图像

// 在图像上添加隐藏图像$watermark_wand,$offset为隐藏图像的开始位置
$imagick->steganoImage($watermark_wand, $offset);

图像模糊

// 为图像添加自适应模糊滤镜,自适应模糊在图像边缘效果降低,$radius为模糊半径,$sigma为标准偏差,单位像素
$imagick->adaptiveBlurImage($radius, $sigma);

// 为图像添加模糊滤镜,$radius为模糊半径,$sigma为标准偏差,单位像素
$imagick->blurImage($radius, $sigma);

// 为图像添加模拟运动模糊,$radius为模糊半径,$sigma为标准偏差,单位像素,$angle为应用效果角度,$radius应大于$sigma;使用高斯算法
$imagick->motionBlurImage($radius, $sigma, $angle);

图像锐化

// 自适应锐化图像,$radius为模糊半径,$sigma为标准偏差,单位像素;$radius为0时自动选择
$imagick->adaptiveSharpenImage($radius, $sigma);

// 锐化图像,$radius为模糊半径,$sigma为标准偏差;使用高斯算法
$imagick->sharpenImage($radius, $sigma);

图像裁剪

// 将原图像从坐标$x,$y开始截取宽$width高$height的图像
$imagick->cropImage($width, $height, $x, $y);

// 将原图像截取宽$x_shear高$y_shear的平行四边形图像,其余部分填充$background颜色
$imagick->shearImage($background, $x_shear, $y_shear);

// 删除图像区域坐标$x,$y宽$width高$height的部分并折叠图像以占据删除的部分
$imagick->chopImage($width, $height, $x, $y);

// 截取图像,新图像从坐标$x,$y开始宽为$width高为$height
$imagick->extentImage($width, $height, $x, $y);

图片放大/缩小

// 图像将自适应的变换为宽$columns高$rows的图像
// 将尺寸调整为仅比之前的图像尺寸略小的尺寸时效果最佳
$imagick->adaptiveResizeImage($columns, $rows);

// 将图像大小改为$columns,$rows;$bestfit为true时宽高将按比例缩小,直到宽高其中一项达到指定大小
$imagick->thumbnailImage($columns, $rows, $bestfit = false);

// 将图片放大或缩小到指定尺寸$width,$height
$imagick->cropThumbnailImage($width, $height);

// 使用液体缩放方法缩放图像(接缝雕刻技术)到指定尺寸$width,$height
// $delta_x表示接缝可以在x轴上移动多少。传递0会使接缝变直。
// $rigidity为非直缝引入偏斜。此参数通常为0
$imagick->liquidRescaleImage($width, $height, $delta_x, $rigidity);

// 将图像按比例放大两倍
$imagick->magnifyImage();

// 将图像按比例缩小一半
$imagick->minifyImage();

// 使用滤镜将图像缩放到尺寸$columns,$rows
// $filter为过滤常数
// $blur大于1时为模糊,小于1时为锐利
$imagick->resizeImage($columns, $rows, $filter, $blur);

// 将图像缩小到尺寸$cols,$rows,其中一个参数为0时将根据另一个参数的比例同比缩放
$imagick->scaleImage($cols, $rows);

图像旋转

// 将图像按照反射中心x轴垂直镜像
$imagick->flipImage();

// 将图像按照反射中心y轴垂直镜像
$imagick->flopImage();

// 将图像旋转$degrees度,空余位置填充$background颜色
$imagick->rotateImage($background, $degrees);

// 将图像垂直镜像
$imagick->transposeImage();

// 将图像水平镜像
$imagick->transverseImage();

图像变化

// 将图像移动$x,$y,移出的部分将在另一侧移入
$imagick->rollImage($x, $y);

// 将图像$radius半径的块中的每个像素随机替换
$imagick->spreadImage($radius);

// 将图像根据中心将元素旋转$degrees度
$imagick->swirlImage($degrees);

图像滤镜

// 将图像应用波形滤镜;波的振幅$amplitude,波浪的长度$length
$imagick->waveImage($amplitude = 100, $length = 300);

// 模拟图像阴影
$imagick->ShadowImage($opacity, $sigma, $x, $y);

// 模拟月光场景
$imagick->blueShiftImage($factor= 1.5);

// 模拟木炭画,高斯半径为$radius,高斯标准偏差为$sigma,单位像素
$imagick->charcoalImage($radius, $sigma);

// 模拟油画;圆形邻域的半径$radius
// 每个像素都替换为在半径定义的圆形区域中出现的最频繁的颜色。
$imagick->oilPaintImage($radius);

// 模拟宝丽来图片;$properties为ImagickDraw实例,$angle为角度
$imagick->polaroidImage($properties, $angle);

// 模拟铅笔素描,高斯半径为$radius,高斯标准偏差为$sigma,单位像素,$angle为角度
$imagick->sketchImage($radius, $sigma, $angle);

// 对图像施加特殊效果,增加曝光度$threshold(0到QuantumRange)
$imagick->solarizeImage($threshold);

图像干扰

//向图像添加随机噪声
Imagick::addNoiseImage(int $noise_type ,int $channel= Imagick::CHANNEL_DEFAULT):bool
	noise_type 噪声的类型

图像边缘调整

// 删除图像边缘像素
$imagick->shaveImage($columns, $rows);

// 移除图像中背景颜色的边缘颜色$fuzz,$fuzz应与背景颜色较小的偏差
$imagick->trimImage($fuzz);

// 保留图像边缘的同时减少图片中的斑点噪声
$imagick->despeckleImage();

图像边框

// 给图像设置边框。边框宽$width高$height颜色$bordercolor
$imagick->borderImage($bordercolor, $width, $height);

图像合成

// 将图像$composite_object合并在本图像,从坐标$x,$y开始合并;$composite为合并常量在php文档中可查
$imagick->compositeImage($composite_object, $composite, $x, $y);

// 将图像$offset_wand与本图像合并为一左一右的图像,返回一张新图像,两张图像大小应当一致
$imagick->stereoImage($offset_wand);

设置图像信息

// 设置图像默认背景色为$background
$imagick->setBackgroundColor($background);

// 设置图像默认压缩类型为$background(Imagick::COMPRESSION_*常量)
$imagick->setBackgroundColor($background);

// 设置图像默认压缩质量为$quality(1-100:高到低)
$imagick->setCompressionQuality($quality);

// 设置图像压缩类型为$background(Imagick::COMPRESSION_*常量)
$imagick->setImageCompression($background);

// 设置图像压缩质量为$quality(1-100:高到低)
$imagick->setImageCompressionQuality($quality);

// 设置图像属性键为$name,值为$value
$imagick->setImageProperty($name, $value);

// 设置图像分辨率为$x_resolution,$y_resolution
$imagick->setImageResolution($x_resolution, $y_resolution);

获取图像信息

// 获取图像的高度
$imagick->getImageHeight();

// 获取图像的宽度
$imagick->getImageWidth();

// 获取图像的宽度
$imagick->getResource();

// 获取图像的匹配$pattern的关联属性,$include_values为false只返回属性名
$imagick->getImageProperties($pattern = '*', $include_values = true);

// 获取图像的宽高、大小、格式等等;$appendRawOutput为true时返回原始数据
$imagick->identifyImage($appendRawOutput = false);

图像加解密

// 将图像$imagick使用$passphrase密码加密
$imagick->encipherImage(111111);

// 将图像$imagick使用$passphrase密码解密,必须时使用encipherImage方法加密的才能解
$imagick->decipherImage(111111);

图像颜色

// 调整图像的亮度$brightness、饱和度$saturation、色调$hue;色调为当前位置开始的旋转百分比,50:逆时针旋转90度,150:顺时针旋转90度,0和200:旋转180度
$imagick->modulateImage($brightness, $saturation, $hue);

// 增强彩色图像的对比度
$imagick->normalizeImage();

// 使用非线性S形对比度算法调整图像的对比度;
// $sharpen为true增加对比度,为false减少对比度;$alpha为增加对比度的程度(1很小,5是很大的量,20是极端);$beta为渐变的中点所在的位置(0为白色;50为中灰;100为黑色)
// 此算法不会使高光或阴影饱和
$imagick->sigmoidalContrastImage($sharpen, $alpha, $beta);

// 从坐标$x,$y开始增加宽$width高$height的与图像背景颜色图像,使用前可以先使用setImageBackgroundColor()设置背景颜色
$imagick->spliceImage(100, 100, 0, 0);

渲染绘画

//把ImagickDraw对象$draw渲染到当前图片上
$imagick->drawImage($draw);

// 清除所有的绘画
$imagick->render($draw);

获取图像流

// 设置图像的格式
$Imagick->setImageFormat($format);

// 以字符串的形式返回图像,作为一个blob,blob格式根据setImageFormat设置
$Imagick->getImageBlob();

ImagickPixel颜色类

Imagick、ImagickDraw类中方法的颜色参数都可以使用此对象

构造颜色对象

// 初始化颜色对象
new ImagickPixel($color);

设置/获取颜色

// 设置颜色
$ImagickPixel->setColor($color);

// 设置颜色的色相$hue(0-1,0为红色),饱和度$saturation(0-1,1为完全饱和度)和亮度$luminosity(0-1,0黑色,1白色)
$ImagickPixel->setHSL($hue, $saturation, $luminosity);

// 获取颜色值的RGBA值的数组,A为透明度;
$ImagickPixel->getColor();

// 获取颜色字符串
$ImagickPixel->getColorAsString();

清除颜色资源

// 删除颜色,删除后不应再调用次对象实例
$ImagickPixel->destroy($hue, $saturation, $luminosity);

// 清除与此对象关联的资源
$ImagickPixel->clear();

ImagickDraw绘画类

绘画不会直接在图像上作画,绘画类只是存储了多个要在图像上进行绘制的图像、线条等等、需要调用$imagick->drawImage才能将图像绘制在图像上

创建绘画对象

// 创建绘画对象实例
new ImagickDraw();

// 克隆一个新的绘画对象实例
$ImagickDraw->clone();

清除/释放资源

// 获取堆栈中最后一个绘画对象实例,并将其从堆栈中删除
$ImagickDraw->pop();

// 清除绘画内容
$ImagickDraw->clear();

// 释放绘画对象
$ImagickDraw->destroy();

设置绘画笔触

// 设置绘画笔触不透明度为$opacity
$ImagickDraw->setStrokeAlpha($opacity);

// 设置绘画笔触轮廓是否抗锯齿,默认抗锯齿;$stroke_antialias为布尔值
$ImagickDraw->setStrokeAntialias($stroke_antialias);

// 设置绘画笔触颜色为$stroke_pixel(ImagickPixel对象)
$ImagickDraw->setStrokeColor($stroke_pixel);

// 设置绘画笔触宽度为$stroke_width
$ImagickDraw->setStrokeWidth($stroke_width);

绘制点、线、多边形

// 在坐标$x,$y绘制一个点
$ImagickDraw->point($x, $y);

// 根据$coordinates绘制折线;$coordinates示例:array(array('x'=> 3,'y'=> 4), array('x'=> 2, 'y'=> 6));一个数组为一个坐标点
$ImagickDraw->polyline($coordinates);

// 使用$coordinates绘制贝塞尔曲线,$coordinates示例:array(array('x'=> 3,'y'=> 4), array('x'=> 2, 'y'=> 6));一个数组为一个坐标点
$ImagickDraw->bezier($coordinates);

// 根据$coordinates绘制多边形;$coordinates示例:array(array('x'=> 3,'y'=> 4), array('x'=> 2, 'y'=> 6));一个数组为一个坐标点
$ImagickDraw->polygon($coordinates);

// 绘制一个左上角坐标为$x1,$y1,右下角坐标为$x2,$y2的矩形
$ImagickDraw->rectangle($x1, $y1, $x2, $y2);

// 绘制一个左上角坐标为$x1,$y1,右下角坐标为$x2,$y2的圆角矩形
$ImagickDraw->roundRectangle($x1, $y1, $x2, $y2, $rx, $ry);

绘制圆

// 绘制一个从图像坐标$sx,$sy开始到坐标$ex,$ey结束起始弧度为$sd结束弧度为$ed的圆弧
$ImagickDraw->arc($sx, $sy, $ex, $ey, $sd, $ed);

// 以图像坐标$sx,$sy为原点,宽$ex高$ey起始弧度为$sd结束弧度为$ed的椭圆
$ImagickDraw->ellipse($sx, $sy, $ex, $ey, $sd, $ed);

// 以图像坐标$ox,$oy为原点,周长坐标为$px,$py的圆
$ImagickDraw->circle($ox, $oy, $px, $py);

使用点连续绘制

//开启绘画
$ImagickDraw->pathStart();

// 从当前点绘制一条到绝对坐标为$x,$y的直线,结束点将作为下次绘画的起点
$ImagickDraw->pathLineToAbsolute($x, $y);

// 从当前点绘制一条到相对坐标为$x,$y的直线,结束点将作为下次绘画的起点
$ImagickDraw->pathLineToRelative($x);

// 从当前点绘制一条到绝对水平坐标为$x的水平直线,结束点将作为下次绘画的起点
$ImagickDraw->pathLineToHorizo​​ntalAbsolute($x);

// 从当前点绘制一条到相对水平坐标为$x的水平直线,结束点将作为下次绘画的起点
$ImagickDraw->pathLineToHorizo​​ntalRelative($x);

// 从当前点绘制一条到绝对垂直坐标为$y的垂直直线,结束点将作为下次绘画的起点
$ImagickDraw->pathLineToVerticalAbsolute($y);

// 从当前点绘制一条到相对垂直坐标为$y的垂直直线,结束点将作为下次绘画的起点
$ImagickDraw->pathLineToVerticalRelative($y);

// 在绝对坐标$x,$y处开始新的绘画,结束点将作为下次绘画的起点
$ImagickDraw->pathMoveToAbsolute($x, $y);

// 使用绝对坐标$x1,$y1作为控制点,绘制从当前点到坐标$x,$y的二次贝塞尔曲线;$x,$y将作为下次绘画的起点
$ImagickDraw->pathCurveToQuadraticBezierAbsolute($x1, $y1, $x, $y);

// 使用相对坐标$x1,$y1作为控制点,绘制从当前点到坐标$x,$y的二次贝塞尔曲线;$x,$y将作为下次绘画的起点
$ImagickDraw->pathCurveToQuadraticBezierRelative($x1, $y1, $x, $y);

// 使用绝对坐标$x1,$y1为起点控制点,$x2,$y2为终点控制点,绘制从当前点到坐标$x,$y的三次贝塞尔曲线;$x,$y将作为下次绘画的起点
$ImagickDraw->pathCurveToAbsolute($x1, $y1, $x2, $y2, $x, $y);

//结束绘画
$ImagickDraw->pathFinish();

绘制文本

// 设置图像绘制文字的字体文件$font_name
$ImagickDraw->setFont($font_name);

// 设置图像绘制文字的字体名称$font_family
$ImagickDraw->setFontFamily($font_family);

// 设置图像绘制文字的字体大小$pointsize磅
$ImagickDraw->setFontSize($pointsize);

// 设置图像绘制文字的字体样式(IMGTYPE_*常量)
$styles = [
    imagick::IMGTYPE_GRAYSCALE,            // 斜体
    imagick::IMGTYPE_GRAYSCALEMATTE,       // 斜体
];
$ImagickDraw->setFontStyle($style);

// 设置图像绘制文字的对齐方式(ALIGN_*常量)
$alignments = [
    imagick::ALIGN_UNDEFINED, //
    imagick::ALIGN_LEFT,      //
    imagick::ALIGN_CENTER,    //
    imagick::ALIGN_RIGHT,     //
];
$ImagickDraw->setTextAlignment($alignment);


// 设置图像绘制文字的背景颜色$under_color(ImagickPixel对象)
$ImagickDraw->setTextUnderColor($under_color);

// 设置图像绘制文字粗细$font_weight
$ImagickDraw->setFontWeight($font_weight);

// 设置图像绘制文字是否抗锯齿,默认抗锯齿;$font_weight为布尔值
$ImagickDraw->setTextAntialias($font_weight);

// 在图像的坐标$x,$y上绘制文字$text
$ImagickDraw->annotation($x, $y, $text);

绘制填充

// 设置绘制对象填充颜色或纹理的不透明度$opacity,完全不透明为1.0
$ImagickDraw->setFillOpacity($fillOpacity);

// 设置绘制对象填充颜色$fill_pixel(ImagickPixel对象)
$ImagickDraw->setFillColor($fill_pixel);

// 从坐标$x,$y开始填充$paintMethod
$paintMethods = [
    imagick::PAINT_POINT,        // 填充一个点
    imagick::PAINT_REPLACE,      // 填充背景颜色
];
$ImagickDraw->color($x, $y, $paintMethod);

渲染图像

// 使用合成运算符$compose(COMPOSITE_常量)将图像$compositeWand从位置$x,$y开始截取宽$width高$height的图像合成在当前图像
$ImagickDraw->composite($compose, $x, $y, $width, $height, $compositeWand);

// 将绘制命令渲染在图像上
$ImagickDraw->render();

 

{/if}