后台框架为ThinkPHP。

需求分析,微信分享时需要设置图片尺寸为:400x400,但是系统抓取过来的图片大小为300x400。

一 丶遇到的问题

第一反应想到的是采用tp框架自带的Image类来进行实现

$image = new \Think\Image();
$image->open('./1.jpg');
// 按照原图的比例生成一个最大为150*150的缩略图并保存为thumb.jpg
$image->thumb(400, 400)->save('./thumb.jpg');

以上方法为tp框架自带的生成缩略图,如果图片尺寸较大,完全没问题,但是如果遇到博主一样的需求就会出现小问题

例: 一张尺寸为800x800的图片要生成400x400的缩略图,框架会等比例缩小原图进而生成缩略图。但是如果原图尺寸为200x200,要生成400x400的图片,缩略图依然会生成成功,但是新生成的图片上下左右会各留100px的黑底,显然,这并不能满足我们得需求。查看Image类发现并没有封装类似功能

二 丶解决方案

首先想到的即是GD库生成一张透明的背景图,然后因为目标图片尺寸大于原图尺寸,所以只需要将两张图片合并居中即可代码如下:

<?php/** * 图片合并 **/ //最多支持九张图片,// $pictureList  = array( //   'img1.png', //   'img2.png', //   'img3.png', //   'img4.png', //   'img5.png', //   'img6.png', //   'img7.png', //   'img8.png', //   'img9.png' //  ); $pictureList  = array( 'http://s3.mogucdn.com/p2/170212/88391240_5e48891jd46hk2i5alali7lljjahh_640x960.jpg_468x468.jpg');   $pictureList = array_slice($pictureList, 0, 9); // 只操作前9个图片 $bg_w = 400; // 背景图片宽度 $bg_h = 400; // 背景图片高度 $background = imagecreatetruecolor($bg_w,$bg_h); // 背景图片 $bgcolor = imagecolorallocate($background, 255, 255, 255); // 为真彩色画布创建白色背景,再设置为透明 imagefill($background, 0, 0, $bgcolor); imageColorTransparent($background, $bgcolor); $pic_count = count($pictureList); $lineArr = array(); // 需要换行的位置 $space_x = 3; $space_y = 3; $line_x = 0; switch($pic_count) { case 1: // 正中间 $start_x = 50; // 图片在背景中X的位置$start_y = 0; // 图片在背景中Y的位置 $pic_w = 300; // 宽度 可自行设置为需要的宽度$pic_h = 400; // 高度 可自行设置为需要的高度break;case 2: // 中间位置并排 $start_x = 2; $start_y = intval($bg_h/4) + 3; $pic_w = intval($bg_w/2) - 5; $pic_h = intval($bg_h/2) - 5; $space_x = 5; break; case 3: $start_x = 40;$start_y = 5;$pic_w = intval($bg_w/2) - 5;$pic_h = intval($bg_h/2) - 5;$lineArr = array(2); $line_x = 4; break; case 4: $start_x = 4; $start_y = 5;$pic_w = intval($bg_w/2) - 5;$pic_h = intval($bg_h/2) - 5;$lineArr = array(3); $line_x = 4; break; case 5: $start_x = 30;$start_y = 30;$pic_w = intval($bg_w/3) - 5;$pic_h = intval($bg_h/3) - 5;$lineArr = array(3); $line_x = 5; break; case 6: $start_x = 5;$start_y = 30; $pic_w = intval($bg_w/3) - 5;  $pic_h = intval($bg_h/3) - 5; $lineArr = array(4); $line_x = 5; break; case 7: $start_x = 53; $start_y = 5;$pic_w = intval($bg_w/3) - 5;$pic_h = intval($bg_h/3) - 5;$lineArr = array(2,5); $line_x = 5; break; case 8: $start_x = 30;$start_y = 5;$pic_w = intval($bg_w/3) - 5; $pic_h = intval($bg_h/3) - 5; $lineArr = array(3,6); $line_x = 5; break; case 9: $start_x = 5;$start_y = 5;$pic_w = intval($bg_w/3) - 5;$pic_h = intval($bg_h/3) - 5;$lineArr = array(4,7); $line_x = 5; break; } foreach( $pictureList as $k=>$pic_path ) { $kk = $k + 1; if ( in_array($kk, $lineArr) ) { $start_x = $line_x; $start_y = $start_y + $pic_h + $space_y; } $pathInfo = pathinfo($pic_path); switch( strtolower($pathInfo['extension']) ) {  case 'jpg': case 'jpeg': $imagecreatefromjpeg = 'imagecreatefromjpeg'; break; case 'png': $imagecreatefromjpeg = 'imagecreatefrompng'; break; case 'gif': default: $imagecreatefromjpeg = 'imagecreatefromstring'; $pic_path = file_get_contents($pic_path); break; } $resource = $imagecreatefromjpeg($pic_path); imagecopyresized($background,$resource,$start_x,$start_y,0,0,$pic_w,$pic_h,imagesx($resource),imagesy($resource)); // 最后两个参数为原始图片宽度和高度,倒数两个参数为copy时的图片宽度和高度 $start_x = $start_x + $pic_w + $space_x; } header("Content-type: image/jpg"); imagejpeg($background);$meargPic = imagegif($background, "img.png"); //销毁资源imagedestroy($meargPic);
?> 

效果图:

其中留白部分为透明背景色,即在不改变原图的情况下让原图尺寸变为400x400实现需求。如果想合并多张图片只需要把目标图片加入数组中即可

PHP合并两张(多张)图片相关推荐

  1. PIL实现两张图片合成一张,和图片加文字

    PIL实现两张图片合成一张,和图片加文字 文章目录: 一.PIL实现两张图片合成一张 1.方法一: 2.方法二 二.图片添加文字 首先说明一下: (小姐姐是谁,是my sweetheart ,请勿使用 ...

  2. MATLAB代码: 合并两张图

    MATLAB 合并两张图,要求大小相同的图,我这里合并两张相同的图. image = imread('docia_one.png') %读取图片 c = [image, image] %图像拼接到矩阵 ...

  3. opencv resize_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  4. opencv 取roi_利用OpenCV 识别两张相似的图片

    Background: 在我们项目中,用到U-net,我们对训练样本图片使用labelme进行标定,对标定生成的json文件labelme_json_to_dataset生成标注图像,由于小伙伴将生成 ...

  5. matlab两个曲线的名称怎么显示出来的,求MATLAB的高手,怎么把两张仿真曲线合并显示在一张图上?...

    求MATLAB的高手,怎么把两张仿真曲线合并显示在一张图上? 关注:194  答案:5  手机版 解决时间 2021-02-10 14:48 提问者终究是陌生了 2021-02-09 16:38 程序 ...

  6. select UNION ALL 合并两张表数据

    select UNION ALL 合并两张表数据 SELECT id,uid FROM table1 t1  UNION ALL SELECT id,uid FROM table2 t2 查出来的结果 ...

  7. oracle横向合并两张表,SQL中将两个表合并成一个新表 SQL如何合并两个表并生成一个新表?...

    sql把两个表合并成一个新表的语句应该怎么写SQL SERVER: select * into 表3 from ( select 字段列表1 from 表1 union all select 字段列表 ...

  8. php 图文合并,两个gif合并成一个gif动态图片的简易教程

    今天在网上看到有网友询问,如何将视频转gif图片.gif动画的制作,一时兴起也就自己试做并找到了不错的解决方法.相信有不少人也有过类似的疑问或对此感兴趣的吧,不防看看下面笔者整理出来的gif图片合并的 ...

  9. git只提交一张图片_即使只使用一张静止的图片,也能制作出带有动感天空的视频...

    我们经常会看到这样的视频,视频中的天空,白云多姿多彩,很漂亮,真羡慕作者拍摄的技巧和运气,其实,我们即使只使用一张静止的图片,也能制作出带有动感天空的视频,以剪映为例,一起来看看动感天空的视频是怎样制 ...

  10. 多张连续帧图片转为视频,万能转换工具!(Ubuntu系统下亲测有效!)

    大家好,我是AI菌.前几天,有小伙伴私信问我,怎样可以将多张连续的图片转为一个视频.作为程序员界暖男的我,怎么会坐视不管呢?今天我就来分享一个简单的方法,来解决连续帧转视频的问题! 一.安装menco ...

最新文章

  1. 当程序出Bug时,程序员最喜欢说的30句话
  2. CSS3 Animation(下)
  3. erlang节点互相ping,一个能ping通,另外一个不行。
  4. 【javascript】数据结构-链表
  5. Linux与Windows数据传输
  6. 防火墙contos6.8操作手册
  7. 创建路径_PS钢笔工具是建立路径的基本工具
  8. python class函数报错_如何掌握python中class函数用法?
  9. JSP技术-01-语法及运行原理
  10. git 取消merge_git 入门教程之备忘录[译]
  11. 企业家张振虎:18年,如何从一家小公司发展转型成新能源大集团
  12. C++ primer 练习题
  13. python中wordcloud函数不同形状云图_Python实现Wordcloud生成词云图的示例
  14. 傅里叶变换matlab学习笔记
  15. 电脑照片太大怎么压缩?照片怎么缩小kb?
  16. 这些才是Win10真正好用之处:瞬对Win7无爱
  17. 2019上半年深圳二手楼市热度如何?(链家数据爬取分析)
  18. 电脑感叹号,电脑网络出现感叹号怎么解决?Win7系统网络出现感叹号的解决方法...
  19. 用数据告诉你,哪位导演是漫威影片中的票房收割机?
  20. Python制作手游《和平精英》游戏资料查询助手

热门文章

  1. 软件测试周刊(第50期):归结起来,焦虑的原因就两条:想同时做很多事情,又想立即看到效果。
  2. windows电脑系统自带的画图工具如何实现自由拼图
  3. [4G5G专题-78]:流程 - 4G LTE 核心网的Attach流程
  4. Android源码 --- BroadCast源码分析
  5. 推荐中商品的热度时间衰减降权:牛顿冷却定律;贝叶斯平均
  6. c语言绝对值大小并输出原值,c语言中绝对值大小的比较
  7. Scratch制作飞翔的小喵小游戏
  8. jquery html() 获取自己
  9. 研究揭示肿瘤基因突变检测的复杂性
  10. python高清图片合成_Python用PIL合成图片