简介:php imagemagick 处理 图片剪切、压缩、合并、插入文本、背景色透明
php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切、压缩、合并、插入文本、背景色透明等。
首先要提醒一下大家,每次通过imageMagic处理图片都会new一个对象出来,当图片处理好之后最好是把这个对象给销毁,它会占用cpu和内存,如果你不在乎这些小细节的话就当做我没有说,接下来进入正题。
图片宽高压缩:
通过调用api中的 thumbnailImage 方法,可以实现图片宽高设置,这个操作不会影响图片的质量,是同大小压缩。
$codeLogo = new \Imagick( '图片路径' );
$codeLogo->thumbnailImage( '图片宽','图片高');
header("Content-Type: image/{$codeLogo->getImageFormat()}");
echo $codeLogo;
jpeg图片有时候附带方向信息,但是方向信息和实际的图片宽高相反,我们可以自己检查后进行旋转
$imagick = new \Imagick( 'Image_1726046018894.jpg');
// 读取EXIF方向信息
$exif = $imagick->getImageOrientation();
// 根据方向调整图片大小
switch ($exif) {
case Imagick::ORIENTATION_TOPRIGHT:
case Imagick::ORIENTATION_RIGHTTOP:
case Imagick::ORIENTATION_BOTTOMRIGHT:
case Imagick::ORIENTATION_RIGHTBOTTOM:
case Imagick::DISTORTION_UNDEFINED:
// 宽高反了的处理逻辑
$width = $imagick->getImageHeight();
$height = $imagick->getImageWidth();
break;
default:
// 正常情况下的宽和高
$width = $imagick->getImageWidth();
$height = $imagick->getImageHeight();
break;
}
// 如果需要,可以对图片进行旋转等操作
if ($exif != Imagick::ORIENTATION_TOPLEFT) {
$imagick->rotateImage(new ImagickPixel(), 90); // 这里可以使用对应的旋转角度
}
$imagick->thumbnailImage($width ,$height);
header("Content-Type: image/{$imagick->getImageFormat()}");
echo $imagick;
图片存储大小压缩:
通过调用api中的 setImageCompressionQuality 方法,可以实现图片存储大小设置,缩放比例越小那么图片清晰度越差,但是图片存储大小会越小那么web加载的时候就越快,压缩率请根据实际情况进行调整。
$image = new \Imagick( '图片路径' );
$image->setImageCompressionQuality('缩放比例');
header("Content-Type: image/{$image->getImageFormat()}");
echo $image->getImageBlob( );
图片合并:
通过imageMagick可以实现多个图片合并到一张图片中,但是在合并的时候需要根据被覆盖图片的高和宽来确定覆盖图片的xy坐标,获取被覆盖图片的高和宽可以通过方法 getImageGeometry 来获取图片属性,然后得到高和宽,然后进行定位计算,下边的代码是将覆盖图片水平、垂直居中。
$code = new \Imagick( '被覆盖图片路径');
$codePro = $code->getImageGeometry();
$codeWidth = $codePro['width'];
$codeHeight = $codePro['height'];
$image= new \Imagick( '覆盖图片路径' );
$image->thumbnailImage(300,300);
$image->roundCorners( 300, 300 ); // radio 圆角处理
$image->compositeImage( $image, \imagick::COMPOSITE_DEFAULT , ( $codeWidth - 300)/2, ( $codeHeight - 300 )/2 );
header("Content-Type: image/{$image->getImageFormat()}");
echo $image->getImageBlob( );
插入文本:
插入文本你需要指定字体文件和字体位置,之后将你的文字塞到图片上去,你可以通过imageMagick对你的文字进行大小、字体、颜色进行调整,并且当你塞到图片的时候可以通过 Imagick::GRAVITY_NORTH 直接将文字定位为水平居中
$image = new \Imagick( '图片路径' );
$draw = new \ImagickDraw();
$draw->setStrokeOpacity(1); //文字边框透明度,选填
$draw->setStrokeColor('#00f')//文字边框颜色,选填
$draw->setStrokeWidth(2);//文字边框大小,选填
$draw->setFontSize( '字体大小' );
$draw->setTextKerning( 1 ); // 设置文件间距
$draw->setFont( '字体库路径' );
$draw->setFontWeight( 100 ); // 字体粗体,需要根据字体文件看效果,不一定有用
$draw->setFillColor( '#434343' ); // 字体颜色
$draw->setGravity( \Imagick::GRAVITY_NORTH ); //对齐方式
$draw->annotation(x轴位置, y轴位置, "文本");
$imagick->drawImage($draw);
header("Content-Type: image/{$image->getImageFormat()}");
echo $image->getImageBlob( );
插入的文本如果不是英文,必须设置字体文件,否则乱码。
中文字体文件可以去找字网下载:https://www.zhaozi.cn/s/freefont/
背景色透明:
通过 transparentPaintImage 设置背景透明。这个函数有四个参数,按照顺序分别是 目标颜色,透明度,擦边值,是否全部渲染,主要说明一下目标颜色,这个参数需要是色调值 rgba(238, 238, 238),而不是 white、black 这样的字符串。
$code = new \Imagick( '图片路径' );
//设置输出的图片格式
$code->setimageformat('png');
//设置透明背景
$code->transparentPaintImage(new \ImagickPixel( '目标颜色' ), 0, '10', 0);
//直接输出到浏览器需要设置header,也可以将getImageBlob的内容加密成base64格式再返回给前端
header("Content-Type: image/{$image->getImageFormat()}");
echo $image->getImageBlob( );
有什么不对的可以在我的公众号留言