1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > php|thinkphp程序合成图片+文字+图片大小调整+正方形转换圆角+去除白色边框

php|thinkphp程序合成图片+文字+图片大小调整+正方形转换圆角+去除白色边框

时间:2019-02-18 01:20:10

相关推荐

php|thinkphp程序合成图片+文字+图片大小调整+正方形转换圆角+去除白色边框

/**

* 图片合成工具类

* 说明:

* 拿过来不一定可以使用,需要自行调整每一步骤的参数,

* 处理步骤分开,调整大小--改变圆角--合成图片--添加文字

* 比较清晰,也可以封装到一个函数里面一步处理,可以自行补充

* 注意:字体用的微软雅黑,自行下载引入

* 图片测试调试阶段尽可能使用网络地址路径,

* 没有自行创建目录函数,也没有清楚废弃的图片资源,自行完善

所有处理方式来自网络收集,一下整理

*/

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;

}

}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。