QQ登录

只需要一步,快速开始

APP扫码登录

只需要一步,快速开始

手机号码,快捷登录

手机号码,快捷登录

查看: 1049|回复: 0

[PHP] 使用imagemagick 处理 图片剪切、压缩、合并、插入文本、背...

[复制链接]

等级头衔

积分成就    金币 : 2841
   泡泡 : 1516
   精华 : 6
   在线时间 : 1294 小时
   最后登录 : 2024-11-21

丰功伟绩

优秀达人突出贡献荣誉管理论坛元老

联系方式
发表于 2023-6-29 10:30:52 | 显示全部楼层 |阅读模式
php有一款插件叫做imagemagick,功能很强大,提供了图片的很多操作,图片剪切、压缩、合并、插入文本、背景色透明等。
" X) J' A' t) o9 a% u, g& r$ @首先要提醒一下大家,每次通过imageMagic处理图片都会new一个对象出来,当图片处理好之后最好是把这个对象给销毁,它会占用cpu和内存,如果你不在乎这些小细节的话就当做我没有说,接下来进入正题。
1 P, R8 W- G& H( o' N图片宽高压缩:
7 }# i. U& _/ Q# `1 a通过调用api中的 thumbnailImage 方法,可以实现图片宽高设置,这个操作不会影响图片的质量,是同大小压缩。7 ~, i3 {6 D/ d
  1. $codeLogo = new \Imagick( '图片路径' );
  2. $codeLogo->thumbnailImage( '图片高','图片宽');
  3. header("Content-Type: image/{$image->getImageFormat()}");
  4. echo codeLogo;
图片存储大小压缩:
  U1 x/ Q  s' s$ G- J, ^+ E/ j通过调用api中的 setImageCompressionQuality 方法,可以实现图片存储大小设置,缩放比例越小那么图片清晰度越差,但是图片存储大小会越小那么web加载的时候就越快,压缩率请根据实际情况进行调整。; Z6 g: W; D- a, Y( J5 |, ~4 w5 f1 q& A
  1. $code = new \Imagick( '图片路径' );
  2. $code->setImageCompressionQuality('缩放比例');
  3. header("Content-Type: image/{$image->getImageFormat()}");
  4. echo $image->getImageBlob( );
图片合并:+ K. G6 ^, A0 q* W! \
通过imageMagick可以实现多个图片合并到一张图片中,但是在合并的时候需要根据被覆盖图片的高和宽来确定覆盖图片的xy坐标,获取被覆盖图片的高和宽可以通过方法 getImageGeometry 来获取图片属性,然后得到高和宽,然后进行定位计算,下边的代码是将覆盖图片水平、垂直居中。2 \0 O) h3 G( M; U$ L3 K# i
  1. $code = new \Imagick( '被覆盖图片路径');
  2. $codePro = $code->getImageGeometry();
  3. $codeWidth = $codePro['width'];
  4. $codeHeight = $codePro['height'];
  5. $codeLogo = new \Imagick( '覆盖图片路径' );
  6. $codeLogo->thumbnailImage(300,300);
  7. $codeLogo->roundCorners( 300, 300 ); // radio 圆角处理
  8. $code->compositeImage( $codeLogo, \imagick::COMPOSITE_DEFAULT , ( $codeWidth - 300)/2, ( $codeHeight - 300 )/2 );
  9. header("Content-Type: image/{$image->getImageFormat()}");
  10. echo $image->getImageBlob( );
插入文本:
0 U' L7 [! ^7 \. }+ ^) f插入文本你需要指定字体文件和字体位置,之后将你的文字塞到图片上去,你可以通过imageMagick对你的文字进行大小、字体、颜色进行调整,并且当你塞到图片的时候可以通过 Imagick::GRAVITY_NORTH 直接将文字定位为水平居中。
6 O9 ^* U5 \9 _7 _% Y# d  d
  1. image = new \Imagick( '图片路径' );
  2. $draw = new \ImagickDraw();
  3. $draw->setFontSize( '字体大小' );
  4. $draw->setTextKerning( 1 ); // 设置文件间距
  5. $draw->setFont( '字体库路径' );
  6. $draw->setFontWeight( 100 ); // 字体粗体
  7. $draw->setFillColor( '#434343' ); // 字体颜色
  8. $draw->setFontFamily( "Palatino" );
  9. $draw->setGravity( \Imagick::GRAVITY_NORTH );
  10. $image->annotateImage( $draw, 0, 840, 0, '文本' ) ;
  11. header("Content-Type: image/{$image->getImageFormat()}");
  12. echo $image->getImageBlob( );
背景色透明:
6 V" E6 E% B0 c! |! q通过 transparentPaintImage 设置背景透明。这个函数有四个参数,按照顺序分别是 目标颜色,透明度,擦边值,是否全部渲染,主要说明一下目标颜色,这个参数需要是色调值 rgba(238, 238, 238),而不是 white、black 这样的字符串。7 R: v! ~, T2 b, p) y! I0 @! O
  1. $code = new \Imagick( '图片路径' );
  2. //设置输出的图片格式
  3. $code->setimageformat('png');
  4. //设置透明背景
  5. $code->transparentPaintImage(new \ImagickPixel( '目标颜色' ), 0, '10', 0);
  6. //直接输出到浏览器需要设置header,也可以将getImageBlob的内容加密成base64格式再返回给前端
  7. header("Content-Type: image/{$image->getImageFormat()}");
  8. echo $image->getImageBlob( );
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|paopaomj.COM ( 渝ICP备18007172号|渝公网安备50010502503914号 )

GMT+8, 2024-11-21 21:27

Powered by paopaomj X3.5 © 2016-2025 sitemap

快速回复 返回顶部 返回列表