/**
* 图片合成工具类
* 说明:
* 拿过来不一定可以使用,需要自行调整每一步骤的参数,
* 处理步骤分开,调整大小--改变圆角--合成图片--添加文字
* 比较清晰,也可以封装到一个函数里面一步处理,可以自行补充
* 注意:字体用的微软雅黑,自行下载引入
* 图片测试调试阶段尽可能使用网络地址路径,
* 没有自行创建目录函数,也没有清楚废弃的图片资源,自行完善
所有处理方式来自网络收集,一下整理
*/
namespace Demo\Controller;
class ImageGenerationController {
//控制输出
public function demo()
{
//改变图像大小
$stage1 = $this->resize_image('user.png','http://www./你的图片地址', 150, 150);
if($stage1){
//更改头像为圆形
$stage2 = $this->yuanjiao($stage1,'./Uploads/card/thumb/'.$v['id'].'stage2.png');
if(!empty($stage2)){
//合成图片
$stage3 = $this->getimg2($stage2);
//添加文字
if(!empty($stage3)){
//array('x'=>250,'y'=>110,'fontsize'=>20,'ttf'=>'./msyh.ttf')
//完成
$stage4 = $this->addText($stage3, array($list['name'],$list['lawfirm']),array('x'=>250,'y'=>110,'fontsize'=>20));
}
}
}
}
/**
* 给图片添加文字
* @param string $strImg 图片文件名
* @param string $strText 字符串内容
* @param array $arrOpt ['r','g','b','x','y','fontsize','angle','savepath','ttf']
*/
public function addText($retrue_id,$strImg, $strText, $arrOpt = array()){
$intR = isset($arrOpt['r']) ? $arrOpt['r'] : 255;
$intG = isset($arrOpt['g']) ? $arrOpt['g'] : 255;
$intB = isset($arrOpt['b']) ? $arrOpt['b'] : 255;
$intX = isset($arrOpt['x']) ? $arrOpt['x'] : 24;
$intY = isset($arrOpt['y']) ? $arrOpt['y'] : 24;
$intSize = isset($arrOpt['fontsize']) ? $arrOpt['fontsize'] : 14;
$intAngle = isset($arrOpt['angle']) ? $arrOpt['angle'] : 0;
$strSave = isset($arrOpt['savepath']) ? $arrOpt['savepath'] : false;
$strFont = isset($arrOpt['ttf']) ? $arrOpt['ttf'] : './Public/qwadmin/css/msyh.ttf';
$im = imagecreatefromstring(file_get_contents($strImg));
$color = imagecolorallocate($im, $intR, $intG, $intB);
//第一行 (标题)
// imagettftext($im, $intSize, $intAngle, $intX, $intY, $color, $strFont, '|'.$strText);
// imagettftext($im, $intSize, $intAngle, $intX+1, $intY, $color, $strFont, '|'.$strText);
//第二行 (姓名)
imagettftext($im, 16, $intAngle, 250, 165, $color, $strFont, $strText[0]);
//第三行 (律所)
imagettftext($im, 16, $intAngle, 250, 200, $color, $strFont, $strText[1]);
// if (empty($strSave)) {
// header("Content-type: image/jpeg");
// imagejpeg($im);
// } else {
//imagejpeg($im, $strSave);
imagepng($im,'./Uploads/card/thumb/stage4.png');
// }
imagedestroy($im);
}
/**
* 两张图合成一张
* @param unknown $path_1 //默认背景图
* @param unknown $path_2
*/
private function getimg2($path_2){
$path_1 ='https://xxx你的背景图url地址';//一般是固定,根据业务自行调整
$image_1 = imagecreatefrompng($path_1);
$image_2 = imagecreatefrompng($path_2);
//创建一个和图1相同大小的真彩色画布(ps:只有这样才能保证后面copy图片的时候不会失真)
$image_3 = imageCreatetruecolor(imagesx($image_1),imagesy($image_1));
//为真彩色画布创建白色背景,再设置为透明
$color = imagecolorallocate($image_3, 1000, 1000, 1000);
//此处3个1000可以使背景设为白色,3个255可以使背景变成透明色
imagefill($image_3, 0, 0, $color);
imageColorTransparent($image_3, $color);
//首先将图1画布采样copy到真彩色画布中,不会失真
imagecopyresampled($image_3,$image_1,0,0,0,0,imagesx($image_1),imagesy($image_1),imagesx($image_1),imagesy($image_1));
//再将图2图片copy到已经具有图1图像的真彩色画布中,同样也不会失真
//imagecopymerge($image_3,$image_2, 0,0,0,0,imagesx($image_2),imagesy($image_2), 100);
return $this->imagecopymerge_alpha($image_3,$image_2,50,70,0,0,imagesx($image_2),imagesy($image_2), 0);
}
/**
* 去除png 白色描边的位置
* @param unknown $retrue_id
* @param unknown $dst_im
* @param unknown $src_im
* @param unknown $dst_x
* @param unknown $dst_y
* @param unknown $src_x
* @param unknown $src_y
* @param unknown $src_w
* @param unknown $src_h
* @param unknown $pct
* @return string
*/
private function imagecopymerge_alpha($dst_im, $src_im, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $pct){
$opacity=$pct;
$w = imagesx($src_im);
$h = imagesy($src_im);
$cut = imagecreatetruecolor($src_w, $src_h);
imagecopy($cut, $dst_im, 0, 0, $dst_x, $dst_y, $src_w, $src_h);
$opacity = 100-$opacity;
imagecopy($cut, $src_im, 0, 0, $src_x, $src_y, $src_w, $src_h);
imagecopymerge($dst_im, $cut, $dst_x, $dst_y, $src_x, $src_y, $src_w, $src_h, $opacity);
$imgpath = './Uploads/card/thumb/stage3.png';
imagepng($dst_im,$imgpath);
return $imgpath;
}
/**
* 设置正方形头像为圆形
* @param unknown $img 图像路径
* @param unknown $dest_path 存储路径
* @return unknown
* 出入来之,博客
*/
public function yuanjiao($img,$dest_path){
$src = imagecreatefromstring(file_get_contents($img)); //获取网络资源文件
$wh= getimagesize($img);
$w=$wh[0];
$h=$wh[1];
$w=min($w,$h);
$h= $w;
$newpic = imagecreatetruecolor($w,$h);
//建立的是一幅大小为 x和 y的黑色图像(默认为黑色),如想改变背景颜色则需要用填充颜色函数imagefill($img,0,0,$color);
// $img = imagecreatetruecolor(100,100); //创建真彩图像资源
// $color = imagecolorAllocate($img,200,200,200); //分配一个灰色
// imagefill($img,0,0,$color);
// 启用混色模式
imagealphablending($newpic,false); //设定图像的混色模式
//imagealphablending() 允许在真彩色图像上使用两种不同的绘画模式。
// 在混色(blending)模式下,alpha 通道色彩成分提供给所有的绘画函数,例如 imagesetpixel() 决定底层的颜色应在何种程度上被允许照射透过。作为结果,GD 自动将该点现有的颜色和画笔颜色混合,并将结果储存在图像中。结果的像素是不透明的。
// 在非混色模式下,画笔颜色连同其 alpha 通道信息一起被拷贝,替换掉目标像素。混色模式在画调色板图像时不可用。
// 如果 blendmode 为 TRUE,则启用混色模式,否则关闭。成功时返回 TRUE, 或者在失败时返回 FALSE。
$transparent = imagecolorallocatealpha($newpic, 255, 255, 255, 127);//边缘透明
//imagecolorallocatealpha(resource $image , int $red , int $green , int $blue, int $alpha )
// $image 图像资源,通过创造的图像功能,如,一返回imagecreatetruecolor()。
// $red 红色分量的价值。
// $green 价值的绿色成分。
// $blue 蓝色成分的价值。
// $alpha 一个介于0和127的价值。 0表示完全不透明,而127表示完全透明。
$r=$w/2;
for($x=0;$x<$w;$x++){
for($y=0;$y<$h;$y++){
$c = imagecolorat($src,$x,$y);
$_x = $x - $w/2;
$_y = $y - $h/2;
if((($_x*$_x) + ($_y*$_y)) < ($r*$r)){
imagesetpixel($newpic,$x,$y,$c);
}else{
imagesetpixel($newpic,$x,$y,$transparent);
//imagesetpixel() 在 image 图像中用 color 颜色在 x,y 坐标(图像左上角为 0,0)上画一个点。
}
}
}
//imagesavealpha() 设置标记以在保存 PNG 图像时保存完整的 alpha 通道信息(与单一透明色相反)
imagesavealpha($newpic, true);
// header('Content-Type: image/png');
$imgcc = imagepng($newpic, $dest_path);
imagedestroy($newpic);
imagedestroy($src);
return $dest_path;
}
/**
* 改变图片尺寸大小
* @param unknown $filename 文件名字
* @param unknown $tmpname 当前文件路径
* @param unknown $xmax 最大宽度
* @param unknown $ymax 最大高度
* @return unknown
*/
private function resize_image($filename, $tmpname, $xmax, $ymax)
{
$ext = explode(".", $filename);
$ext = $ext[count($ext)-1];
$im = false;
if($ext == "jpg" || $ext == "jpeg"){
$im = imagecreatefromjpeg($tmpname);
if($im == false){
//防止命名后缀错误,与实际图片的格式不一致
$im = imagecreatefrompng($tmpname);
}
}else if($ext == "png"){
$im = imagecreatefrompng($tmpname);
if($im == false){
//防止命名后缀错误,与实际图片的格式不一致
$im = imagecreatefromjpeg($tmpname);
}
}else if($ext == "gif"){
$im = imagecreatefromgif($tmpname);
}
$x = imagesx($im);
$y = imagesy($im);
if($x <= $xmax && $y <= $ymax){
return $im;
}
//处理........
if($x >= $y) {
$newx = $xmax;
$newy = $newx * $y / $x;
}
else {
$newy = $ymax;
$newx = $x / $y * $newy;
}
$im2 = imagecreatetruecolor($newx, $newy);
imagecopyresized($im2, $im, 0, 0, 0, 0, floor($newx), floor($newy), $x, $y);
//返回当前名字
$cc = imagepng($im2,'./Uploads/card/thumb/'.$filename);
imagedestroy($im2);
return './Uploads/card/thumb/'.$filename;
}
}