个人博客 duanruilong.github.io/blog/

本文原地址duanruilong.github.io/blog/2018/0…

最近的PHP项目中,需要用到画图和图片拼接效果,这里是一些开发过程里用到的一些点还有就是一些踩过的坑。通过ImageMagick生成base64图片格式,为前端所使用。

一些需要的知识点

PHP将图片转base64编码以及base64图片转换为图片并保存代码

图片转base64编码


/*图片转换为 base64格式编码*/
$img = 'uploads/about.png';
$base64_img = base64EncodeImage($img);
echo '<img src="' . $base64_img . '" />';function base64EncodeImage ($image_file) {$base64_image = '';$image_info = getimagesize($image_file);$image_data = fread(fopen($image_file, 'r'), filesize($image_file));$base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));return $base64_image;
}
复制代码

base64图片转换为图片并保存

/*  base64格式编码转换为图片并保存对应文件夹 */
function base64_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}";if (file_put_contents($new_file, base64_decode(str_replace($result[1], '', $base64_image_content)))){return '/'.$new_file;}else{return false;}}else{return false;}
}echo base64_image_content($base64_img,"uploads/");
复制代码

base64

Base64是一种用64个字符来表示任意二进制数据的方法。 Base64的原理很简单,首先,准备一个包含64个字符的数组:

['A', 'B', 'C', ... 'a', 'b', 'c', ... '0', '1', ... '+', '/'] 然后,对二进制数据进行处理,每3个字节一组,一共是3x8=24bit,划为4组,每组正好6个bit

如果要编码的二进制数据不是3的倍数,最后会剩下1个或2个字节怎么办?Base64用\x00字节在末尾补足后,再在编码的末尾加上1个或2个=号,表示补了多少字节,解码的时候,会自动去掉。

使用jpg图片体积要比png小 使用PHP的Imagick类进行图像的操作

Imagick具体操作

(1).创建一个底图,宽750px,高1046px,白色背景,格式为jpg的图片

// 初始化一个画板$img =new Imagick();$img->newImage(750,1046,'white','jpg') ; 复制代码

(2).在底图上添加需求图片

前提是我们已经知道了需要合并的图片链接地址

$item_img='https://img.alicdn.com/bao/uploaded/i1/1750208593/TB1rgM3hhtnkeRjSZSgXXXAuXXa_!!0-item_pic.jpg'第一步:实例化图片
$imgtwo = new Imagick($item_img);第二步:设置添加图片的大小
$imgtwo->resizeImage(750,764,Imagick::FILTER_LANCZOS,1);关于resizeImage参数说明bool Imagick::resizeImage ( int $columns , int $rows , int $filter , float $blur [, bool $bestfit = false ] )参数:● columns 图片的宽度● rows 图片高度● filter 过滤器,用于过滤图片,有高斯filte根据情况而定● blur blur=1 为虚化, blur =-1 为锐化第三步:与底图合并
$img->compositeImage($imgtwo,$imgtwo->getImageCompose(),0,0);使用compositeImage();bool Imagick::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:通过传入一个通道常量,来开启通道模式。为了支持多个通道,可以通过二进制运算的操作来合并多个通道常量。到这里就可以得到一个合并的图片了
1、加一个header信息,可以直接在网页上查看图片header("Content-Type: img/png");echo $img;
2、可以把图片在指定目录中生成,在指定目录下生成为img.png$file="./img.png";$img->writeImage($file);我这里是这样处理:header ( 'Content-type: ' . strtolower ($img->getImageFormat ()) );$type = strtolower($img->getImageFormat());$dest_img='/data/tmp/' . md5(microtime(true)).'.'.$type;    //要生成的图片的路径,随机生成图片名称复制代码

(3).图片上拼接文字

写入文字以添加店铺文字为例,逐步完成文字的写入。

    $shop_title='测试店铺';// 添加店铺文字$drawQr = new ImagickDraw(); // 实例化ImagickDraw$drawQr -> setFillColor(new ImagickPixel('#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 = new ImagickDraw();
  • 2、设置字体颜色 $drawQr -> setFillColor(new ImagickPixel('#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)).'.'.$type; //要生成的图片的路径$Return = array();// *图片转换为 base64格式编码*$base64_image = '';$image_info = getimagesize($dest_img);$image_data = fread(fopen($dest_img, 'r'), filesize($dest_img));$base64_image = 'data:' . $image_info['mime'] . ';base64,' . chunk_split(base64_encode($image_data));$Return['data']=$base64_image;return  $Return;
复制代码

$base64_image就是base64格式的图片。

需要注意的是前端得到的额base64数据里包含有'\r\n'回车字符,需要特殊处理才可以正确显示图片。

(最后得到的合并图片)

(调整拼接图片大小得到不同的图片)

最后来一组单打詹!!!

觉得喜欢欢迎关注,start

转载于:https://juejin.im/post/5b994ffde51d450e9a2dfc8d

在PHP里使用 ImageMagick 生成 base64 图片相关推荐

  1. php - 使用 ImageMagick 生成 base64 图片(详细步骤及示例源代码教程)

    效果图 在 PHP 项目中,需要实现用到 "画图和图片" 拼接效果. 本文实现了 通过ImageMagick生成base64图片格式,为前端所使用. PHP将图片转base64编码 ...

  2. 解决canvas生成base64图片不清晰的问题

    在项目开发中使用到了canvas将图片文字合成一张海报,供用户长按下载至手机相册使用,但生成的图片到移动端时看上去很模糊,然后通过以下方式解决了问题: 这里我的项目中底图宽高比例是300/368,所以 ...

  3. H5页面使用html2canvas实现div生成为图片,保存到手机

    在做微信公众号H5页面时,需求要求html页面生成base64图片,并保存到手机相册中.之前没做过,在网上搜了相关的资料.了解到了html2canvas.js. html2canvas首先将页面生成c ...

  4. 根据公司名称生成base64 logo(python文字转图片)

    最近碰到了一个需求,需要根据公司的名称,生成一个临时的logo,并以base64图片的形式在网页上显示.这个问题拆解一下,可以分为如下两个问题: 显示什么?即公司名称中的哪一部分需要显示出来. 怎么显 ...

  5. python验证码,python将PIL生成的图片进行base64编码并返回给前端浏览器

    我用python的PIL生成了验证码图片,需要将图片返回给前端浏览器,有两种返回方式.一种是返回response,另一种是将图片进行base64编码后返回. 注意:PIL生成验证码图片时,需要传入fo ...

  6. php生成cmyk图片,用ImageMagick创建cmyk颜色的图片,在photoshop中显示的cmyk值不一样!...

    各位好!我在php里用ImageMagick创建cmyk颜色的图片,在photoshop中显示的cmyk值不一样!比如:在ImageMagick通过ImagickPixel设置的颜色为cmyk(0,0 ...

  7. 生成Base64编码格式的二维码图片(添加url地址图片logo)

    用到是google的zxing jar包maven仓库地址 <!-- https://mvnrepository.com/artifact/com.google.zxing/core --> ...

  8. 图片生成base64格式

    生成 .png文件的Base64文件 对于windows操作系统: 1. 打开命令提示. 2.将当前工作目录更改为存储 .png图片的文件夹. 3. 执行以下命令生成 Base64 表示: 示例的pn ...

  9. Java通过JfreeChart生成转Base64图片字符串(饼图、折线图、柱状图、折线图-多条、3D柱状图、气泡图、时序图、曲线图、区域图、分布图、联合分类图、双X轴图、K线图、柱状图-横向等图)

    工具类 CreatLineChart.java package DrawLine;import java.awt.BasicStroke; import java.awt.Color; import ...

最新文章

  1. 电脑服务器怎么打开网页,电脑的iis服务器打开网页的方法
  2. InheritParasitic.js
  3. UVA 1646 Edge Case
  4. 学生创客 开公司造3D打印机
  5. hdu 1069 Monkey and Banana (LIS)
  6. 【项目管理】PMO-为强大的收益实现演变
  7. linux 网卡配置不一致,linux环境下,双网卡配置不同网段后,路由问题
  8. 7-1 寻找大富翁 (25 分)(思路加详解+两种做法(一种优先队列,一种vector容器))
  9. 津津的储蓄计划(信息学奥赛一本通-T1074)
  10. phpcmsV9各种模板页面调用文章 hits 点击量和评论量 - 代码总结分类
  11. [HAOI2016]找相同字符
  12. 关于Clipboard剪切板获取值为NULL问题解决方法
  13. 广义逆高斯分布(Generalized Inverse Gaussian Distribution)及修正贝塞尔函数
  14. java毕业设计鸿鹄教育培训mybatis+源码+调试部署+系统+数据库+lw
  15. java微信公众号要求_java实现微信公众号登录,详细的步骤及有关实现代码
  16. python处理grd格式文件_Surfer的grd文件格式说明
  17. 【转】 Linux那些事儿之我是U盘(16)冰冻三尺非一日之寒
  18. linux4 系统下载,syslinux下载|
  19. Python3 根据关键字爬取百度图片
  20. 软件测试有哪些常用的SQL语句?

热门文章

  1. 口语学习Day5:今天聊聊美国路牌PED XING是什么?
  2. IAR EW6.30版本下建立STM32工程(芯片型号STM32F105VC)
  3. eclipse如何导出WAR包
  4. 常考数据结构与算法:反转字符串
  5. Spring Cloud Stream 使用延迟消息实现定时任务(RabbitMQ)
  6. 使用Transact-SQL进行数据导入导出方法详解
  7. [LeetCode] Binary Tree Postorder Traversal 二叉树的后序遍历
  8. 浏览器用xpath获取一直为空
  9. eigrp ospf 邻居建立过程比较
  10. shell在linux里摇摇晃晃