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

在PHP中使用ImageMagick生成base64图片

时间:2023-03-29 18:56:36 PHP

个人博客https://duanruilong.github.io/blog/本文原文地址https://duanruilong.github.io/blog/2018/09/05/%E5%9C%A8PHP%E9%87%8C%E5%BE%88%E5%A5%BD%E7%9A%84%E4%BD%BF%E7%94%A8ImageMagick/最近的PHP项目需要用到绘图和图片拼接效果,这里说一下开发过程中用到的一些点和踩过的一些坑。base64图片格式由ImageMagick生成,供前端使用。需要的一些知识点PHP图片转base64编码转base64图片转图片保存代码图片转base64编码/*图片转base64格式编码*/$img='uploads/about.png';$base64_img=base64EncodeImage($img);echo'';函数base64EncodeImage($image_file){$base64_image='';$image_info=getimagesize($image_file);$image_data=fread(fopen($image_file,'r'),filesize($image_file));$base64_image='数据:'。$image_info['mime'].';base64,'。chunk_split(base64_encode($image_data));return$base64_image;}base64图片转为图片保存/*base64格式编码转为图片保存到对应文件夹*/functionbase64_image_content($base64_image_content,$path){//匹配图片的格式if(preg_match('/^(data:\s*image\/(\w+);base64,)/',$base64_image_content,$result)){$type=$result[2];$new_file=$path."/".date('Ymd',time())."/";if(!file_exists($new_file)){//检查文件夹是否存在,不存在则创建,并赋予最高权限mkdir($new_file,0700);}$new_file=$new_file.time().".{$type}";如果(file_put_contents($new_file,base64_decode(str_replace($result[1],'',$base64_image_content)))){return'/'.$new_file;}else{返回错误;}}else{返回错误;}}echobase64_image_content($base64_img,"uploads/");base64Base64是一种用64个字符表示任意二进制数据的方法。Base64的原理很简单。首先,准备一个包含64个字符的数组:['A','B','C',...'a','b','c',...'0','1',...'+','/']然后,对二进制数据进行处理,每组3个字节,一共3x8=24bit,分为4组,每组正好6位。如果要编码的二进制数据不是3的倍数,最后会剩下1或2个字节。管理?base64用x00字节在最后补足,然后在编码的最后加上1或2=号,表示补了多少字节,解码时会自动去掉。jpg图像的大小小于png图像的大小。使用PHP的Imagick类对图片进行操作。Imagick具体操作(一)。创建一张底图,宽750px,高1046px,背景为白色,图片格式为jpg//初始化一个画板$img=newImagick();$img->newImage(750,1046,'白色','jpg');(2).如果我们已经知道需要合并的图片的链接地址,则在底图上添加需要的图片$item_img='https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg'第一步:实例化图片$imgtwo=newImagick($item_img);第二步:设置添加图片的大小$imgtwo->resizeImage(750,764,Imagick::FILTER_LANCZOS,1);关于resizeImage参数说明boolImagick::resizeImage(int$columns,int$rows,int$filter,float$blur[,bool$bestfit=false])参数:●columnsimagewidth●rowsimageheight●filterfilter,用于过滤图片,高斯过滤视情况而定●blurblur=1为模糊,blur=-1为锐化三步:与底图合并$img->compositeImage($imgtwo,$imgtwo->getImageCompose(),0,0);使用复合图像();boolImagick::compositeImage(Imagick$composite_object,int$composite,int$x,int$y[,int$channel=Imagick::CHANNEL_ALL])参数:●composite_object:合并图像的Imagick对象●composite:合并操作,定义操作常量,详见合并操作常量列表●x:相对于图像顶点左上位置(0,0)的横坐标●y:相对于左上位置(0)的纵坐标,0)图像顶点●channel:pass传入一个通道常量以启用通道模式。为了支持多通道,可以通过二元运算组合多个通道常量。这里可以得到合并后的图片1.添加一个header信息,可以直接在网页header("Content-Type:img/png")上查看图片;回声$img;2.可以将图片存放在指定目录下在指定目录下生成为img.png$file="./img.png";$img->writeImage($文件);以下是我的处理方式:header('Content-type:'.strtolower($img->getImageFormat()));$type=strtolower($img->getImageFormat());$dest_img='/data/tmp/'.md5(microtime(true)).'.'.$type;//要生成的图片的路径,图片的名字是随机生成的(3)。在图片上拼接文字并书写文字以添加店铺文字为例,逐步完成文字的书写。$shop_title='测试店';//添加商店文字$drawQr=newImagickDraw();//实例化ImagickDraw$drawQr->setFillColor(newImagickPixel('#999999'));//颜色$drawQr->setFontSize('24');//大小$drawQr->setFont('../../conf/Microsoftyahei.ttf');//字体$drawQr->setTextAlignment(Imagick::ALIGN_LEFT);//字体方向//ps:Imagick::ALIGN_RIGHT向右Imagick::ALIGN_LEFT向左Imagick::ALIGN_CENTER中间$drawQr->setTextEncoding("utf-8");//字体编码$drawQr->annotation(114,990,$shop_title);//绘制文本$img->drawImage($drawQr);//在地板上画图详细解释:1.实例化ImagickDraw类:$drawQr=newImagickDraw();2.设置字体颜色$drawQr->setFillColor(newImagickPixel('#999999'));3.设置字体大小$drawQr->setFontSize('24');4.设置字体格式$drawQr->setFont('../../conf/Microsoftyahei.ttf');5.设置字体方向$draw->setTextAlignment(Imagick::ALIGN_RIGHT);ps:Imagick::ALIGN_RIGHT向右Imagick::ALIGN_LEFT向左Imagick::ALIGN_CENTER中间6.设置字体编码$drawQr->setTextEncoding("utf-8");7.绘制文字$drawQr->annotation(114,990,$shop_title);8、在底图上写字体$img->drawImage($drawQr);把文字写在这个地方一些坑:没有设置字体格式时,汉字会解析错误(英文没有问题)(汉字解析失败)(如果设置了字体格式,会显示通常)(4)。图像base64将导出最终图像。我们组将以base64格式传给前端,进行如下操作将我们最后拼接的base64图片转换为输出$dest_img='/data/tmp/'.md5(microtime(true)).'.'.$类型;//待生成图片路径$Return=array();//*图像转换成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;返回$返回;$base64_image是base64格式的图片。需要注意的是,前端获取的base64数据中含有'\r\n'回车符,需要特殊处理才能正确显示图片。(最后的合并图)(调整拼接后的图片大小,得到不一样的图片)最后来一组单打詹!!!喜欢的话欢迎关注,开始