当前位置: 首页 > 后端技术 > PHP

使用ImageMagick---在PHP中转换非常好

时间:2023-03-29 19:25:08 PHP

【原链接】https://duanruilong.github.io...://duanruilong.github.io/blog/2018/09/18/%E5%9C%A8PHP%E9%87%8C%E5%BE%88%E5%A5%BD%E7%9A%84%E4%BD%BF%E7%94%A8ImageMagick-convert%E7%AF%87/)ImageMagick包括一组用于操作图像的命令行工具。之前ImageMagick对base64图片的实现逻辑可能会导致服务端溢出事故,所以下一篇文章会介绍另一种很好的实现方式---convert命令。使用命令格式的形式生成图像和大小裁剪数据格式的转换。基本命令和格式1.基本命令魔法:创建、编辑图像、转换图像格式、调整图像大小、模糊、裁剪、去除噪点、抖动(dither)、绘制、翻转、合并、resample等convert:相当于magick命令。identify:一个或多个图像文件的输出格式和特征信息,如分辨率、大小、维度、颜色空间等。mogrify:与magick功能相同,但无需指定输出文件,自动覆盖原始图像文件.composite:将一个图像或多个图像组合成一个新图像。蒙太奇:组合多个独立图像以创建合成图像。每个图像都可以用边框、透明度等属性进行装饰。比较:从数学和视觉上比较源图像和重建图像之间的差异。display:在任何X服务器上显示图像或图像序列。动画:在任何X服务器上显示图像序列。import:将任何可见窗口保存在X服务器上并将其导出为图像文件。可以捕捉单个窗口、整个屏幕或屏幕的任何矩形部分。召唤:解释和执行用MSL(魔法脚本语言)编写的脚本。流:一种轻量级工具,用于将图像或图像的一部分的一个或多个像素组件流式传输到存储设备。在处理大图像或原始像素组件时很有用。2.命令格式基本命令的使用遵循Unix风格的标准格式,如command[options]input_imageoutput_image转换图片商品。.pnggoods.jpg开始绘制生成图片一些预备参数1.输入参数$item_img='https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg';$item_title='测试字体';$shop_title='测试店铺';$shop_img='http://q.aiyongbao.com/item/web/images/qap_img/mobile/userAvatar.png';$qr_img='https://img.alicdn.com/tfscom/TB1uJDStYZnBKNjSZFKwu3GOVXa.png';$numid_share='0000000';$qr_title='长按识别二维码';//裁剪宝贝标题$drawtitone=mb_substr($item_title,0,13,'utf-8');$drawtittow=mb_substr($item_title,13,13,'utf-8');$drawtittree=mb_substr($item_title,26,13,'utf-8');$time_date=时间();//时间戳$workDir='/data/tmp/'.$numid_share.'_con'.$time_date;//目标路径---->在生成图片的过程中指定一个文件夹来保存图片2、先下载素材文件。这里需要拼接图片的链接,所以先下载到之前创建的文件夹中,因为这些素材图片只是为了最后的拼接,最后可以完全删除。$item_img_down=$workDir.'/itemimage.jpg';$shop_img_down=$workDir.'/shopimage.jpg';$qr_img_down=$workDir.'/qrimage.jpg';//下载宝贝\NetworkUtils主图::curlDownload($item_img,$item_img_down);//下载店铺图片\NetworkUtils::curlDownload($shop_img,$shop_img_down);//下载二维码\NetworkUtils::curlDownload($qr_img,$qr_img_down);\NetworkUtils::curlDownload($item_img,$item_img_down);下载$item_img,保存在目标路径文件夹下的$workDir.'/itemimage.jpg'路径下。3.指定字体和颜色$fontFamily='/usr/share/fonts/chinese/msyh.ttf';$fontColor='#333333';$fontColor_shoptitle='#999999';$fontColor_qrtitlt='#666666';4.创建一个底图创建一个750x1046的白色底图,我们可以在上面绘制文本//创建一个底图(并添加一些文本)$back_img=$workDir.'/bg.jpg';//要生成的图片路径---->可以看到$back_cmds="convert'xc:[750x1046!]'-backgroundwhite-font{$fontFamily}-draw'text580,994\"{$qr_title}\"'在服务器端-fill\"{$fontColor_qrtitlt}\"-pointsize20-draw'text114,990\"{$shop_title}\"'-font{$fontFamily}-pointsize22-fill'#999999'{$workDir}/bg.jpg";$result_back_cmds=\SystemCommon::runningCmd($back_cmds);这里需要注意文字绘制命令的顺序,否则会出现不生效的问题。-font{$fontFamily}-draw'text580,994\"{$qr_title}\"'-fill\"{$fontColor_qrtitlt}\"-pointsize20解释:xc:[100x40!]:设置画布大小的简写方法,在方括号中写上canvas的宽高,注意加!-fill'rgba(0,0,0,0)':设置文本的填充颜色text114,990:定位文本-font:指定字体-pointsize:指定文本的字体大小-draw:绘图选项,text声明绘制文字,0,0声明文字距离图片左上角的偏移值,绘制文字的格式为textx,y字符串,当然其他类型也可以绘制,比如Circle(circle)和折线(polyline)继续添加文字:$back_img_shoptitle=$workDir.'/btitle.jpg';//要生成图片的路径$back_cmds_shoptitle="convert-draw'text40,820\"{$drawtitone}\"'-font{$fontFamily}-pointsize32-fill\"{$fontColor}\"-draw'text40,866\"{$drawtittow}\"'-font{$fontFamily}-pointsize32-fill\"{$fontColor}\"-draw'text40,912\"{$drawtittree}\"'-font{$fontFamily}-pointsize32-fill\"{$fontColor}\"{$back_img}{$workDir}/btitle.jpg";$result_back_cmds_shoptitle=\SystemCommon::runningCmd($back_cmds_shoptitle);效果:(白色背景可能显示不太好)5.现在可以在之前获取的图片上拼接需要的图片//在底部图片上组合产品的主图$back_img_itemimg='/数据/tmp/'。md5(microtime(true)).'.jpg';//要生成图片的路径$geometryX="+".0;//定位$geometryY="+".0;//定位$customPicPos="northwest";$back_cmds_itemimg="convert{$back_img_shoptitle}{$workDir}/item_img_mag.jpg-gravity{$customPicPos}-geometry{$geometryX}{$geometryY}-composeover-composite-antialias-设置色彩空间sRGB-色彩空间sRGB{$workDir}/result.jpg";$result_back_cmds_itemimg=\SystemCommon::runningCmd($back_cmds_itemimg);说明:-geometry:设置文字在图片中的排列方式(类似CSSalign-items+justify-content),center表示水平和垂直居中,其他值也可以是:NorthWest,North,NorthEast,West,East,SouthWest,South,SouthEast,不分大小写。将图像组合成新图像这里就是把{$workDir}/item_img_mag.jpg路径的图片绘制到之前绘制的文字$back_img_shoptitle的图片上,最后保存图片的路径在{$workDir}/result.jpg下面我们继续操作图片//合并两个Dimensioncode$geometryXshop="+".40;$geometryYshop="+".950;$back_cmds_shopimg="convert{$workDir}/result.jpg{$workDir}/shop_img_mag.jpg-gravity{$customPicPos}-geometry{$geometryXshop}{$geometryYshop}-composeover-composite-antialias-setcolorspacesRGB-colorspacesRGB{$workDir}/result1.jpg";$result_back_cmds_shopimg=\SystemCommon::runningCmd($back_cmds_shopimg);//合并商店图标$geometryXqr="+".520;$geometryYqr="+".784;$back_cmds_qrimg="convert{$workDir}/result1.jpg{$workDir}/qr_img_mag.jpg-gravity{$customPicPos}-geometry{$geometryXqr}{$geometryYqr}-composeover-composite-antialias-setcolorspacesRGB-colorspacesRGB{$workDir}/result2.jpg";$result_back_cmds_qrimg=\SystemCommon::runningCmd($back_cmds_qrimg);效果:发现图片不是我们预期的效果,拼接我们也设置了图片的大小,但是没有用。在尝试了不同的方案后,我们决定先把图片放大到需要拼接的尺寸再进行拼接。6.放大拼接图尺寸,需要对多张拼接图进行操作//看来需要先放大主图$item_img_m="convert-resize'750x766!'{$item_img_down}{$workDir}/item_img_mag.jpg";$ite??m_img_mag=\SystemCommon::runningCmd($item_img_m);//看来二维码需要先放大$shop_img_m="convert-resize64x64{$shop_img_down}{$workDir}/shop_img_mag.jpg";$shop_img_mag=\SystemCommon::runningCmd($shop_img_m);//看来店铺图标需要先放大$qr_img_m="convert-resize200x200{$qr_img_down}{$workDir}/qr_img_mag.jpg";$qr_img_mag=\SystemCommon::runningCmd($qr_img_m);-resize扩展解释IamgeMagick提供了几个符号来定义缩放jpg!:不管图片的宽高,缩放到150x100的大小。>:只有宽高大于150x100的图片才会缩放到这个尺寸(根据比例取最大值),小于150x100的图片不做处理。<:与>功能相反,缩放比较不是我们需要的。仅转换-resize'750x766!'{$item_img_down}{$workDir}/item_img_mag.jpg固定尺寸后可以得到:7.将图片转成base64格式我们最后输出同样的base64格式到前端$stdout=trim($result_back_cmds_qrimg["stdout"]);$Return=array();if(empty($stdout)||strpos($result_back_cmds_qrimg["stderr"],"identify")!=false){//runningCmd执行成功$dest_img=$workDir.'/result2.jpg';///*图像转换成base64格式*/$base64_image='';$image_info=getimagesize($dest_img);$image_data=fread(fopen($dest_img,'r'),文件大小($dest_img));$base64_image='数据:'。$image_info['mime'].';base64,'.chunk_split(base64_encode($image_data));$Return['data']=$base64_image;$Return['dest_img']=$dest_img;$Return['类型']='成功';$返回['消息']=1;return$Return;}$Return['data']='';$Return['msg']=2;return$Return;$workDir.'/result2.jpg就是我们最后的拼接图,至于文件夹可以选择删除其他图片。我们只需要得到结果。(小姐姐的马赛克图)这次引入的convert命令是以解释整个方法的形式从马赛克的开始到最后生成最终的图片。希望对大家有所帮助。欢迎来到我的个人博客Blog