/**
* @desc 合并身份证的正反面到同一张图片
* @author Jimmy
* @date 2016-12-33
* @param $imageSrc0 身份证正面
* @param $imageSrc1 身份证反面
* @param $desPath 合并后图片地址
* @return mixed
*/
public static function mergeImage($imageSrc0, $imageSrc1, $dirPath){
!file_exists($dirPath)&&mkdir($dirPath);
$imagePath0=self::rotateImage($imageSrc0,$dirPath);
$imagePath1=self::rotateImage($imageSrc1,$dirPath);
$size0=getimagesize($imagePath0);
$size1=getimagesize($imagePath1);
$image0_width=$size0[0];
$image0_height=$size0[1];
$image1_width=$size1[0];
$image1_height=$size1[1];
if($image0_width>$image1_width){
$canvas_width=$image0_width;
}else{
$canvas_width=$image1_width;
}
$canvas_height=$image0_height+$image1_height;
$im0=imagecreatefromjpeg($imagePath0);
$im1=imagecreatefromjpeg($imagePath1);
$canvas=imagecreatetruecolor($canvas_width,$canvas_height);
imagefill($canvas,0,0,imagecolorallocate($canvas,255,255,255));
$img0_x=($canvas_width-$image0_width)/2;
$img1_x=($canvas_width-$image1_width)/2;
imagecopyresampled($canvas,$im0,intval($img0_x),0,0,0,$image0_width,$image0_height, $image0_width,$image0_height);
imagecopyresampled($canvas,$im1,intval($img1_x),$image0_height,0,0,$image1_width,$image1_height, $image1_width,$image1_height);
$desPath = $dirPath. Uuid::createUuid().'.jpg';//这里只是使用写好的Uuid给图片取一个唯一的名字
file_exists($desPath)&&unlink($desPath);
imagejpeg($canvas,$desPath,100);
if($imagePath0!=$imageSrc0)file_exists($imagePath0)&&unlink($imagePath0);
if($imagePath1!=$imageSrc1)file_exists($imagePath1)&&unlink($imagePath1);
return $desPath;
} /**
* @desc 旋转长图片为宽图片
* @author Jimmy
* @date 2016-12-22
* @param $imagePath
* @return string
*/
public static function rotateImage($imagePath,$dirPath){
!file_exists($dirPath)&&mkdir($dirPath);
$size=getimagesize($imagePath);
if($size[0]<$size[1]){//图片需要旋转90度
$img=imagecreatefromjpeg($imagePath);
$rotate=imagerotate($img,90,0);
$desPath = dirname($dirPath). Uuid::createUuid().'.jpg';
imagejpeg($rotate,$desPath);
return $desPath;
}else{
return $imagePath;
}
}

注意:由于用户上传的身份证正反面有可能是横向的也有可能是竖向的,程序考虑了横图片(长度大于宽度)和竖图片(长度小于宽度)的不同情况,

遇到竖图片需要将之先旋转为横图片,这样才能让最后合成的图片都是横向的。

php将两张身份证图片合并到一张图的更多相关文章

  1. gulp-css-spriter 将css代码中的切片图片合并成雪碧图

    NPM地址:https://www.npmjs.com/package/gulp-css-spriter/ 配置gulpfile.js: var gulp = require('gulp'),     ...

  2. 读取多张MNIST图片与利用BaseEstimator基类创建分类器

    读取多张MNIST图片 在读取多张MNIST图片之前,我们先来看下读取单张图片如何实现 每张数字图片大小都为28 * 28的,需要将数据reshape成28 * 28的,采用最近邻插值,如下 def ...

  3. 图片合并成PDF,两个PDF的合并

    需求: 将多张手机照片合并成一个PDF,并于另一个成型PDF合并 过程: 使用全能扫描王处理一遍,拆剪掉多余部分,并提高亮度增加文字对比度 合并: 使用Faststone Capture合并图片即可. ...

  4. 【css样式生成 & 图片合并压缩工具】Sprite,你值得拥有

    好久好久没有更新博客了,越来越懒...话说懒也有懒的好处,懒的时候你可能会想着用些神马方法来帮你偷懒.没错,下面就给大家介绍个博主前不久开发的[css样式生成 & 图片合并压缩工具]Spirt ...

  5. Atitit 判断判断一张图片是否包含另一张小图片

    Atitit 判断判断一张图片是否包含另一张小图片 1. keyword1 2.  模板匹配是在图像中寻找目标的方法之一(切割+图像相似度计算)1 3. 匹配效果2 4. 图片相似度的算法(感知哈希算 ...

  6. [工具] GIF 动画每帧合并到一张 PNG

    功能:将 GIF 动画每帧合并到一张 PNG 需求:配合 ImageMagick 图像处理软件. 下载:[工具]Gif2Png_Aone_1.0.0.zip 使用方法: 请到 ImageMagick  ...

  7. java图片处理——多张图片合成一张Gif图片并播放或Gif拆分成多张图片

    1.多张jpg图合成gif动画 /** * 把多张jpg图片合成一张 * @param pic String[] 多个jpg文件名 包含路径 * @param newPic String 生成的gif ...

  8. js将用户上传gif动图分解成多张帧图片

    js将用户上传gif动图分解成多张帧图片 写在前面 工作中遇到一个这么一个需求:这是一个多图上传的场景,如果用户上传选择多张图片,则上传后直接展示多张图片,如果上传的图片是gif动图,则需要分解这张动 ...

  9. .net core微信群图片合并

    引用:SixLabors.ImageSharp,SixLabors.ImageSharp.Drawing,System.Drawing.Common /// <summary> /// 群 ...

随机推荐

  1. windows下安装Mongodb_4.0.6最新版及常用命令

    今天下载了最新版Mongodb进行安装,发现相比较于以前,方便了很多,直接下载: 一.下载地址:https://www.mongodb.com/download-center/enterprise 二 ...

  2. linux下ftp连接:530 Permission denied

    问题如下:[root@localhost apps]# ftp 10.xxx.xxx.xxxConnected to 10.xxx.xxx.xxx220 (vsFTPd 2.0.5)530 Pleas ...

  3. Python之元类详解

    一.引子 元类属于Python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也是自圆其说,点到为止,从队元类的控制上来看就破绽百出,逻辑混乱: 二.什么是元类 一切源自于一 ...

  4. SSH免密登录(并且免yes交互)

    问题描述:主机A使用ssh协议远程主机B,默认会开启口令认证,即输入主机B对应用户的登录密码,并且第一次登录时,主机A需验证是否接受来自主机B的公钥,输入"yes/no"完成交互. ...

  5. Netty源码分析第5章(ByteBuf)---->第5节: directArena分配缓冲区概述

    Netty源码分析第五章: ByteBuf 第五节: directArena分配缓冲区概述 上一小节简单分析了PooledByteBufAllocator中, 线程局部缓存和arean的相关逻辑, 这 ...

  6. 2019第十届蓝桥杯 E题 迷宫

    /*输入 30 50 01010101001011001001010110010110100100001000101010 00001000100000101010010000100000001001 ...

  7. Python模块xlwt对excel进行写入操作

    python常用模块目录 1.安装 $ pip install xlwt 2.创建表格和工作表单写入内容 例子: import xlwt # 创建一个workbook 设置编码 workbook = ...

  8. sar命令详解

    基础命令学习目录首页 原文链接:http://lovesoo.org/linux-sar-command-detailed.html sar(System Activity Reporter系统活动情 ...

  9. [BUAA OO]第三次博客作业

    OO第三次博客作业 1. 规格化设计的发展 我认为,规格化设计主要源自于软件设计的两次危机.第一次是由于大量存在的goto语句,让当时被广泛应用的面向过程式的编程语言臃肿不堪,在逻辑性上与工程规模上鱼 ...

  10. 跟踪调试Linux内核的启动过程

    跟踪调试Linux内核的启动过程---使用gdb 符钰婧 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/UST ...