thinkphp 利用GD库在图片上写文字


<?php
/**
* Created by PhpStorm.
* User: Administrator
*/
namespace Home\Event; use \Think\Image;
use \Think\Upload;
class ImgEvent
{ private $THINK_IMAGE = null;
private $THINK_UPLOAD = null; public function __construct()
{
$this->THINK_IMAGE = new Image();
$this->THINK_UPLOAD = new Upload();
} /*
* 保存base64文件
* $img string base64类型的文件
* $type string 保存的文件类型
* app_user_head_img 用户头像
*
*
*/
public function saveImg_base64($img = null , $type = null)
{
//获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false;
// dump($imgConfig_savePath[$type]);
// dump($imgConfig_size); if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $img, $result) && $imgConfig_savePath[$type])
{ $img_ext = $result[2]; //图片后缀
$img_header = $result[1];//图片头信息
$new_file_name = date('Ymd').'/'.uniqid().'.'.$img_ext;
$origin_img_path = '';//原图的保存路径
$origin_img_save_flag = true;//
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
//先保存一份原图,然后其他尺寸的保存直接调用原图路径origin_img_path.
$origin_res = file_put_contents($v.$new_file_name, base64_decode(str_replace($img_header, '', $img)));
if (!$origin_res)
{
$origin_img_save_flag = false;
break;
}
else
{
$saveFlag = $new_file_name;
$origin_img_path = $v.$new_file_name;
$this->THINK_IMAGE->open($origin_img_path);
}
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$this->THINK_IMAGE->thumb($width, $height,3)->save($v.$new_file_name);
} }
} }
return $saveFlag;
} /*
* 保存file类型文件
*
*/
public function saveImg_file($img = null , $type = null)
{ //获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false; if ($img && $imgConfig_savePath[$type])
{ $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
$this->THINK_UPLOAD->rootPath = $v;
$this->THINK_UPLOAD->subName = date('Ymd');
$this->THINK_UPLOAD->saveName = array('uniqid','');
$saveRes = $this->THINK_UPLOAD->uploadOne($img);
if (!$saveRes)
{
$origin_img_save_flag = false;
}
else
{
$saveFlag = true;
$origin_img_path = $v.$saveRes['savepath'].$saveRes['savename'];
$this->THINK_IMAGE->open($origin_img_path);
$fileName = $saveRes['savepath'].$saveRes['savename'];
}
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$compress_img_path=$v.$fileName;
$saveFlag = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$fileName); if (!$saveFlag)
{
$saveFlag = false;
$origin_img_save_flag = false;
} } } } if($saveFlag)
{
#$saveFlag = $fileName;
$saveFlag = array('origin'=>get_current_Host().'/'.$origin_img_path,'compress'=>get_current_Host().'/'.$compress_img_path);
} }
return $saveFlag;
} public function save_file($img = null , $type = null)
{ //获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$saveFlag = false; if ($img && $imgConfig_savePath[$type]) { if (!is_dir($imgConfig_savePath[$type] . date('Ymd'))) {
mkdir($imgConfig_savePath[$type] . date('Ymd'), 0777, true);
}
$this->THINK_UPLOAD->rootPath = $imgConfig_savePath[$type];
$this->THINK_UPLOAD->subName = date('Ymd');
$this->THINK_UPLOAD->saveName = array('uniqid', '');
$saveRes = $this->THINK_UPLOAD->uploadOne($img);
if ($saveRes) {
$saveFlag = true;
$origin_img_path = $imgConfig_savePath[$type] . $saveRes['savepath'] . $saveRes['savename']; //$fileName = $saveRes['savepath'] . $saveRes['savename'];
}
} if($saveFlag)
{
$saveFlag = $origin_img_path;
return get_current_Host().'/'.$saveFlag;
}else
{
return $saveFlag;
} } /*
* 保存file类型文件,多文件
*
*/
public function saveImgs_files($imgs = null , $type = null)
{ //获取保存图片配置s
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false;
$imgResArr = array();//保存图片路径
$origin_img_path = array();//原图路径 if ($imgs && $imgConfig_savePath[$type])
{ $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
$this->THINK_UPLOAD->rootPath = $v;
$this->THINK_UPLOAD->subName = date('Ymd');
$this->THINK_UPLOAD->saveName = array('uniqid','');
$saveRes = $this->THINK_UPLOAD->upload($imgs); if ($saveRes)
{
$saveFlag = true;
foreach ($saveRes as $srK => $srV)
{
$origin_img_path[] = $v.$saveRes[$srK]['savepath'].$saveRes[$srK]['savename'];
$fileName = $saveRes[$srK]['savepath'].$saveRes[$srK]['savename'];
$imgResArr[] = $fileName;
} }
}
else
{
foreach($origin_img_path as $oipK => $oipV)
{
if ($saveFlag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$this->THINK_IMAGE->open($oipV);
$saveThumb = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$imgResArr[$oipK]);
if (!$saveThumb)
{
$saveFlag = false;
break;
}
}
} } } if ($saveFlag)
{
$saveFlag = $imgResArr;
}
}
return $saveFlag;
} /*
* 保存微信头像 - url
*
*/
public function save_WxImg($picUrl = '',$type = null)
{ $ch = curl_init($picUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0); //对body进行输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package = curl_exec($ch);
$httpInfo = curl_getinfo($ch);
curl_close($ch);
$media = array_merge(array('mediaBody' => $package), $httpInfo); //求出文件格式
preg_match('/\w\/(\w+)/i', $media["content_type"], $extmatches);
$fileExt = $extmatches[1]; $saveName = md5(microtime(true)).".{$fileExt}"; //获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false; if ($imgConfig_savePath[$type])
{ $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
file_put_contents($v.'/'.date('Ymd').'/'.$saveName,$media['mediaBody']); $origin_img_path = $v.'/'.date('Ymd').'/'.$saveName;
$this->THINK_IMAGE->open($origin_img_path);
$fileName = date('Ymd').'/'.$saveName;
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$saveFlag = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$fileName); if (!$saveFlag)
{
$saveFlag = false;
$origin_img_save_flag = false;
}
else
{
$saveFlag = $fileName;
}
} }
}
}
return $saveFlag; } /*
* 保存file类型文件
*
*/
public function saveImg_Wx($WxImg = array() , $type = null)
{ //获取保存图片配置
$imgConfig_savePath = C("img_save.save_path");
$imgConfig_size = C("img_save.size");
$saveFlag = false;
$imgResArr = array(); if ($WxImg && $imgConfig_savePath[$type])
{ foreach ($WxImg as $wiK => $wiV)
{ $wxImg = $this->getWxImg($wiV); $origin_img_save_flag = true;
foreach($imgConfig_savePath[$type] as $k => $v)
{ if(!is_dir($v.date('Ymd')))
{
mkdir($v.date('Ymd'),0777,true);
} if ($k == 'origin')
{
file_put_contents($v.'/'.date('Ymd').'/'.$wxImg['saveName'],$wxImg['imgMedia']['mediaBody']); $origin_img_path = $v.'/'.date('Ymd').'/'.$wxImg['saveName'];
$this->THINK_IMAGE->open($origin_img_path);
$fileName = date('Ymd').'/'.$wxImg['saveName'];
$imgResArr[] = $fileName;
}
else
{
if ($origin_img_save_flag)
{
$width = $imgConfig_size[$type][$k]['w'];
$height = $imgConfig_size[$type][$k]['h'];
$saveFlag = $this->THINK_IMAGE->thumb($width, $height,3)->save($v.$fileName); if (!$saveFlag)
{
$saveFlag = false;
$origin_img_save_flag = false;
}
else
{
$saveFlag = $fileName;
}
} }
}
} if($saveFlag)
{
$saveFlag = $imgResArr;
} }
return $saveFlag;
}
   /*
* 保存用户的推广图片 在图片上写字!!!!
*/
public function save_userShareImg($bg_img_path = '' , $head_img_path = '' , $qrCode_img_path = '' , $saveFile = '' , $userName = '' , $userDscp = '' , $font_path = '')
{ //设置头像图片为圆角
$head_img_radius = $this->radius_img($head_img_path,240);
//合并到背景图中
$this->mergeImage($bg_img_path,$head_img_radius,$saveFile,array('left' => 200, 'top' => 55, 'width' => 480, 'height' => 480));
//设置名称
$this->writeText($saveFile, $saveFile, $userName,255,255,255,1010,32,$font_path, array());
//设置二维码内容
$this->mergeImage($saveFile,$qrCode_img_path,$saveFile,array('left' => 255, 'top' => 684, 'width' => 250, 'height' => 245)); return $saveFile;
} /*
* 合并图片
*/
private function mergeImage($bg_img, $main_img, $saveFile, $param)
{ extract($param);
// list($bgWidth, $bgHeight) = getimagesize($bg_img);
$bgImg = $this->imagecreate($bg_img);
if (!is_resource($main_img))
{
list($mainWidth, $mainHeight) = getimagesize($main_img);
$mainImg = $this->imagecreate($main_img);
}
else
{
$mainImg = $main_img; $mainWidth = $width;
$mainHeight = $height;
}
imagecopyresized($bgImg, $mainImg, $left, $top, 0, 0, $width, $height, $mainWidth, $mainHeight);
// imagecopyresized($bgImg, $mainImg, $left, $top, 0, 0, $width, $height, $width,$height);
ob_start();
// output jpeg (or any other chosen) format & quality
imagejpeg($bgImg, NULL, 100);
$contents = ob_get_contents();
ob_end_clean();
imagedestroy($bgImg);
imagedestroy($mainImg);
$fh = fopen($saveFile, "w+");
fwrite($fh, $contents);
fclose($fh);
} /*
* 图片写文字
* $bg_img 背景图片
* $saveFile 保存图片路径
* $text 文字
* $fontColor 字体颜色
* $top 图片距离顶端高度
* $fontSize 字体大小
* $font 字体路径
* $param 传递的参数
*/
private function writeText($bg_img, $saveFile, $text, $colorR,$colorG,$colorB , $top , $fontSize , $font , $param = array())
{
list($bgWidth, $bgHeight) = getimagesize($bg_img);
$im = imagecreatefromjpeg($bg_img); $fontColor = imagecolorallocate($im, $colorR, $colorG, $colorB);//字的RGB颜色
$str = mb_convert_encoding($text, "html-entities", "utf-8");;//解决乱码问题 $fontBox = imagettfbbox($fontSize, 0, $font, $str);//文字水平居中实质
$width = imagesx($im);
imagettftext($im, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), $top, $fontColor, $font, $str); ob_start();
// output jpeg (or any other chosen) format & quality
imagejpeg($im, NULL, 100);
$contents = ob_get_contents();
ob_end_clean();
imagedestroy($im);
$fh = fopen($saveFile, "w+");
fwrite($fh, $contents);
fclose($fh);
} /**
* 处理圆角图片
* @param string $imgPath 源图片路径
* @param integer $radius 圆角半径长度默认为15,处理成圆型
* @return [type] [description]
*/
public function radius_img($imgPath = '', $radius = 65)
{
$ext = pathinfo($imgPath);
$src_img = null;
switch ($ext['extension']) {
case 'jpg':
$src_img = imagecreatefromjpeg($imgPath);
break;
case 'png':
$src_img = imagecreatefrompng($imgPath);
break;
default:
$src_img = imagecreatefromjpeg($imgPath);
break;
}
$wh = getimagesize($imgPath);
$w = $wh[0];
$h = $wh[1];
// $radius = $radius == 0 ? (min($w, $h) / 2) : $radius;
$img = imagecreatetruecolor($w, $h);
//这一句一定要有
imagesavealpha($img, true);
//拾取一个完全透明的颜色,最后一个参数127为全透明
$bg = imagecolorallocatealpha($img, 255, 255, 255, 127);
imagefill($img, 0, 0, $bg);
$r = $radius; //圆 角半径
for ($x = 0; $x < $w; $x++) {
for ($y = 0; $y < $h; $y++) {
$rgbColor = imagecolorat($src_img, $x, $y);
if (($x >= $radius && $x <= ($w - $radius)) || ($y >= $radius && $y <= ($h - $radius))) {
//不在四角的范围内,直接画
imagesetpixel($img, $x, $y, $rgbColor);
} else {
//在四角的范围内选择画
//上左
$y_x = $r; //圆心X坐标
$y_y = $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
//上右
$y_x = $w - $r; //圆心X坐标
$y_y = $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
//下左
$y_x = $r; //圆心X坐标
$y_y = $h - $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
//下右
$y_x = $w - $r; //圆心X坐标
$y_y = $h - $r; //圆心Y坐标
if (((($x - $y_x) * ($x - $y_x) + ($y - $y_y) * ($y - $y_y)) <= ($r * $r))) {
imagesetpixel($img, $x, $y, $rgbColor);
}
}
}
}
return $img;
} private function imagecreate($bg)
{
$bgImg = @imagecreatefromjpeg($bg);
if (FALSE == $bgImg) {
$bgImg = @imagecreatefrompng($bg);
}
if (FALSE == $bgImg) {
$bgImg = @imagecreatefromgif($bg);
}
return $bgImg;
} /*
* 下载微信服务器的图片
* media_id 微信的媒体id
* type 保存图片类型
* */
public function getWxImg($mediaId)
{
if(!class_exists('\JSSDK') && !class_exists('\WxPayConfig'))
{
vendor('wxsdkapi.jssdk');
vendor('wxpayapi.lib.WxPay#Config');
}
$res = new \JSSDK(C('WEIXINPAY_CONFIG.APPID'),C('WEIXINPAY_CONFIG.APPSECRET'));
$accessToken = $res->getAccessToken(); // $mediaId = 'cVqPIhDPPThUtayzS27GK6RN4-dseA6AZnTJxcg7_VaeuAaKcL53X32hmKxhgiSD';
// $accessToken = 'KHaopJY444kJ06LcH9ESj-73pkEfFTgIr3L45RURuUxv1KTjgXyFepJ-cTIF_oUyAKyYb5dK2r9L_wC-WDw2USqGQBMobC6DzPImuhPqxB8jxZ41CuLDtJiaEZk8Vf5kWSSjAAAAWW';
$picUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$accessToken&media_id=$mediaId"; $ch = curl_init($picUrl);
curl_setopt($ch, CURLOPT_HEADER, 0);
curl_setopt($ch, CURLOPT_NOBODY, 0); //对body进行输出。
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$package = curl_exec($ch);
$httpInfo = curl_getinfo($ch);
curl_close($ch);
$media = array_merge(array('mediaBody' => $package), $httpInfo); //求出文件格式
preg_match('/\w\/(\w+)/i', $media["content_type"], $extmatches);
$fileExt = $extmatches[1]; $saveName = md5(microtime(true)).".{$fileExt}"; $img = array('imgMedia'=>$media,'saveName'=>$saveName); return $img;
}
/*
* 下载微信服务器的图片
* media_id 微信的媒体id
* type 保存图片类型
* */
public function getWxImg2($mediaId,$file)
{
if(!class_exists('\JSSDK') && !class_exists('\WxPayConfig'))
{
vendor('wxsdkapi.jssdk');
vendor('wxpayapi.lib.WxPay#Config');
}
$res = new \JSSDK(C('WEIXINPAY_CONFIG.APPID'),C('WEIXINPAY_CONFIG.APPSECRET'));
$accessToken = $res->getAccessToken();
$picUrl = "http://file.api.weixin.qq.com/cgi-bin/media/get?access_token=$accessToken&media_id=$mediaId"; return httpcopy($picUrl,$file);
} }

调用方法:

/**
* 生成图片
* @param varchar tid 任务id
* @httpmethod POST
* @response 响应数据
* {
* "ResultType": "1000",
* "Message": "上传成功",
* "AppendData": "图片路径",
* }
*/
public function UploadNavImg()
{
$tid=Util::getSafeText(I('post.tid'));
$imgEven = A('Gszc/Img','Event');
//查出公司名称
$res = M('gszc_tasks as t')
->join('app_gszc_userinfo as u on u.tid=t.id')
->where('t.id='.$tid)
->field('u.*,t.lastname')
->find(); //主营业务范围
$zyywfws = explode('、',$res['zyywfw']);
$zyywfw = array_slice($zyywfws, 0,3); //获取前三个主营业范围
$zyywfw2 = array_slice($zyywfws, 3,6); //获取后三个主营业务范围 $imageName = date("His",time())."_".rand(1111,9999).'.jpg';
$dir = date('Ymd');
$path = 'uploads/company/'.$dir;
if (!is_dir($path)){ //判断目录是否存在 不存在就创建
mkdir($path,0777,true);
}
$img = $imgEven->save_userShareImg($_SERVER['DOCUMENT_ROOT']."/uploads/test.png",'','',$_SERVER['DOCUMENT_ROOT']."/".$path."/". $imageName,$res['lastname'],$zyywfw, $zyywfw2, '',$_SERVER['DOCUMENT_ROOT']."/uploads/PingFang Bold.ttf"); if($img){
//生成照片成功 保存到任务表里
$tasks = M('gszc_tasks')->where('id='.$tid)->setField('lastpic',$path."/".$imageName);
if($tasks){
$lujing = $path."/".$imageName;
$this->array_return['errno']=self::__OK__;
$this->array_return['errmsg']='生成成功!';
$this->array_return['data']= $lujing ;
$this->ajaxReturn($this->array_return);
}
}else{
$this->array_return['errno']=self::__ERROR__;
$this->array_return['errmsg']='生成失败!';
$this->array_return['data']=[];
$this->ajaxReturn($this->array_return);
}
}
        $i = 528;
$j = 113;
foreach($zyywfw as $k=>$v){ //设置前三个主营业务范围
$this->copyWriteText($saveFile, $saveFile, $v,254,253,254, $j , $i ,11,$font_path, array());
$j = $j+135; }
上一篇:用python给图片添加半透明水印


下一篇:C#图片上写文字