tp5.0 FAST 生成海报图

14 篇文章 0 订阅
5 篇文章 0 订阅

推销部门的海报,大致类容都差不多,经常会修改一些简介,诊疗范围,擅长病种等等,刚开始想到的是利用扩展截图然后去下载,网上的例子倒是不多,目前有两个例子

  1. zyan/url2pic-sdk
    CSDN地址
    可以composer安装,也可调用接口
    composer安装的时候有冲突,捣鼓了一阵发现需要安装一些别的扩展,就放弃,不想安装太多扩展
    就开始调用API 但是返回来的图片好多css都没加载完就截图完成了,他应该是网站加载完就截图了,没有等适配就截图了,所以布局的时候需要考虑进去
  2. PhantomJS
    这个也是composer安装的时候需要额外安装一些扩展,实用性有待参考

后来才想起来海报图,之前一直就想的是生成网页,然后截图,下载就行。
下面是原图
在这里插入图片描述
正如图片所示,需要修改的地方还蛮多的,名称的位置,名称可能两位数,三位数,四位数,也需要判断去调整left的位置,名称下的标签也是一样,根据字数调整文字的大小等等,还有成就需要去掉标签载换行,然后添加上对应的五角星。后台:简介这里做了一个开关,打开的时候必须填写简介内容,下方的诊疗范围/擅长范围,有两个板块,只能显示一个,所以做了一个开关控制,单选选择这两个小板块,
简介这里由于文字不定,所以稍微计算了一下文字的高度,来自适应的增加/减去背景的高度,下方的诊疗范围也是一样
代码垃圾,后期会优化

	protected $summary_height = ''; // 简介范围文字的高度
	protected $dat_height = ''; // 诊疗范围文字的高度
	protected $good_at_height = ''; // 擅长范围文字的高度
	protected $brown_height = 1500; // 下半部分 棕色部分“一行文字”所需最低高度
	protected $Pentagram = ''; // 五角星
	protected $textRows = ''; // 文字行数
	protected $textRowsHight = 0; // 文字行数 高
	protected $bat_ga_textRows = ''; // 诊疗/擅长行数
	protected $bat_ga_image_top = 0; // 诊疗/擅长 上半部分
	protected $bat_ga_image_down = 65; // 诊疗/擅长 下半部分 背景高度

/**
	 * 生成海报图
	 * @param $docname // 医生名称
	 * @param $doclabel    // 医生职称
	 * @param $docimg   // 医生图片
	 * @param $docachieve   // 医生成就
	 * @param $syswitch // 简介开关
	 * @param $summary  // 简介内容
	 * @param $gaswitch // 诊疗/擅长开关
	 * @param $gadata  // 诊疗/擅长 选择
	 * @param $gac      // 诊疗/擅长内容
	 */
	public function posterImage($docname,$doclabel,$docimg,$docachieve,$syswitch = 0,$summary,$gaswitch = 0,$gadata = 0,$gac)
	{
		$summary = $this->tagecontent($summary,mb_strlen($summary,"utf-8"));
		$gac = $this->tagecontent($gac,mb_strlen($gac,"utf-8"));
		// 转换 成就 值
		// 正则匹配获取p标签里的值,并重新赋值
		$matches = '';
		// preg_match 匹配出第一条符合条件的数据后停止继续操作
		// preg_match_all 匹配出全部
		preg_match_all('/<p.*?>(.*?)(?=<\/p>)/im', $docachieve, $matches);
		unset($matches[0]);
		foreach($matches[1] as $v){
			$search = array(" "," ","\t","\n","\r");
			$v = str_replace($search, '', $v);
			$val = trim(strip_tags($v));
			if(!empty($val)){
				$bt_arrays[] = $val;
			}
		}
		// 过滤数组中的元素。
		$bt_arrays = array_filter($bt_arrays);
		// 数组转字符串并换行
		$docachieve = implode("\n",$bt_arrays);
		// 统计五角星
		$this->Pentagram = count($bt_arrays);
		// 获得职位长度,调整位置
		$length_label = mb_strlen($doclabel,"utf-8");
		$label_left = 100;
		$label_fontSize = 35;
		switch ($length_label){
			case $length_label == 4;
				$label_left = 150;
				break;
			case $length_label == 5;
				$label_left = 120;
				break;
			case $length_label == 6;
				$label_left = 95;
				break;
			case $length_label == 7;
				$label_left = 70;
				break;
			case $length_label == 8;
				$label_left = 50;
				break;
			case $length_label == 9;
				$label_left = 38;
				$label_fontSize = 33;
				break;
			case $length_label == 10;
				$label_left = 39;
				$label_fontSize = 29;
				break;
			case $length_label == 11;
				$label_left = 39;
				$label_fontSize = 27;
				break;
			default:
				$label_left = 100;
		};
		// 字体文件,可以去百度下载,计算机里面也有,可以复制到项目里去用,路径要用绝对路径
		$fontPath = ROOT_PATH.'/public/assets/fonts/5c8a05a7b3b641552549287.otf';
		$config = [
			'text' => [
				[
					// 医生名称
					'text'      => $docname,
					'left'      => 55,				//文字距离左边框多远(负数是从右往左)
					'top'       => 600,			    //文字距离上边框多远(负数是从下往上)
					'fontPath'  => $fontPath,       //字体文件
					'fontSize'  => 90,              //字号
					'fontColor' => '115,66,34',     //字体颜色
					'angle'     => 0,				//倾斜角度
					'spacing'   => 25,              //字间距调整设置
				],
				[
					// 医生标签
					'text'      => $doclabel,
					'left'      => $label_left,				//文字距离左边框多远(负数是从右往左)
					'top'       => 700,			//文字距离上边框多远(负数是从下往上)
					'fontPath'  => $fontPath,       //字体文件
					'fontSize'  => $label_fontSize,              //字号
					'fontColor' => '255,255,255',      //字体颜色
					'angle'     => 0,				//倾斜角度
				],
			],
			'achieve' =>[
				  // 医生成就
					'text'      => $docachieve,
					'left'      => 62,				//文字距离左边框多远(负数是从右往左)
					'top'       => 720,			//文字距离上边框多远(负数是从下往上)
					'fontPath'  => $fontPath,		//字体文件
					'fontSize'  => 23,				//字号
					'fontColor' => '0,0,0',		//字体颜色
					'angle'     => 0,				//倾斜角度
					'width'     => 500,

			],
			'image' => [
				[//海报上部分图
					'url'       => "../public/assets/XXXX/13_01.png", //图片地址
					'stream'    => 0,//图片资源是否是字符串图像流
					'left'      => 0,//图片距离左边框多远(负数是从右往左)
					'top'       => 0    ,//图片距离上边框多远(负数是从下往上)
					'right'     => 0,
					'bottom'    => 0,
					'width'     => 950,//图片宽度(不要超过背景图的尺寸)
					'height'    => 1063,//图片高度(不要超过背景图的尺寸)
					'opacity'   => 100,//透明度
					'radius'    => 0,//图片圆角角度
				],
				[// 医生图片
					'url'       => ROOT_PATH.'/public/'.$docimg,
					'stream'    => 0,
					'left'      => 520,
					'top'       => 123,
					'right'     => 0,
					'bottom'    => 0,
					'width'     => 430,
					'height'    => 940,
					'opacity'   => 100,
					'radius'    => 15,
				],
				[
					// 底部
					'url'       => "../public/assets/XXXX/17_02.png",
					'stream'    => 0,
					'left'      => 0,
					'top'       => -1,
					'right'     => 0,
					'bottom'    => 0,
					'width'     => 950,
					'height'    => 290,
					'opacity'   => 100,
				],
			],
			'background'    => '../public/assets/XXXX/14.png', //背景图
			'pentagram'     => [
				'url'       => '../public/assets/XXXX/wujiaoxing.png', // 五角星
				'stream'    => 0,
				'left'      => 35,
				'top'       => 748,
				'right'     => 0,
				'bottom'    => 0,
				'width'     => 25,
				'height'    => 25,
				'opacity'   => 100,
			],
		];

		if($syswitch == 1){
			$sy_title_img = [
				// 医生简介头部
				'url'       => "../public/assets/XXXX/18_02.png",
				'stream'    => 0,
				'left'      => 0,
				'top'       => 1090,
				'right'     => 0,
				'bottom'    => 0,
				'width'     => 950,
				'height'    => 52,
				'opacity'   => 100,
				'radius'    => 15,
			];

			$sy_text = [
				// 简介
				'text' => $this->getbrtext(1060, 22, 0, $fontPath, $summary,1), // 文字换行
				'left' => 40,                //文字距离左边框多远(负数是从右往左)
				'top' => 1190,            //文字距离上边框多远(负数是从下往上)
				'fontPath' => $fontPath,        //字体文件
				'fontSize' => 18,                //字号
				'fontColor' => '255,255,255',        //字体颜色
				'angle' => 0,                //倾斜角度
			];
			array_push($config['image'],$sy_title_img);
			array_push($config['text'],$sy_text);

			// 背景最低高度 + 文字高度
			$this->brown_height =  $this->brown_height + $this->summary_height;

			if ($gaswitch == 1){
				// 诊疗/擅长 头部 距离简介文字的高度
				$this->bat_ga_image_top = 1190 + $this->summary_height + $this->textRows;
				$in_text = [
					// 擅长
					'text' => $this->getbrtext(990, 22, 0, $fontPath, $gac,2), // 文字换行
					'left' => 80,                //文字距离左边框多远(负数是从右往左)
					'top' => $this->bat_ga_image_top + 105,//文字距离上边框多远(负数是从下往上)105是富裕高度
					'fontPath' => $fontPath,        //字体文件
					'fontSize' => 18,                //字号
					'fontColor' => '98,98,98',        //字体颜色
					'angle' => 0,                //倾斜角度
				];
				array_push($config['text'],$in_text);
				// 诊疗信息下半部分
				$in_image_down =
					[
						// 诊疗/擅长 信息下半部分
						'url'       => "../public/assets/XXXX/121_03.png",
						'stream'    => 0,
						'left'      => 0,
						'top'       => $this->bat_ga_image_top + 50,// 50是富裕高度
						'right'     => 0,
						'bottom'    => 0,
						'width'     => 950,
						'height'    => 65,
						'opacity'   => 100,
						'radius'    => 15,
					];
				if ($gadata == 1){
					// 默认的高度是 65
					$in_dat = [
						// 诊疗信息头部
						'url'       => "../public/assets/XXXX/13_02.png",
						'stream'    => 0,
						'left'      => 0,
						'top'       => $this->bat_ga_image_top,
						'right'     => 0,
						'bottom'    => 0,
						'width'     => 950,
						'height'    => 52,
						'opacity'   => 100,
						'radius'    => 15,
					];
					// 背景图片的高 加上文字的高度 加上20 的富裕高度
					$in_image_down['height'] = 65 + $this->dat_height + 20;
					$this->bat_ga_image_down = $in_image_down['height'];
					array_push($config['image'],$in_dat);
				}else{
					$in_ga = [
						// 擅长信息头部
						'url'       => "../public/assets/XXXX/14_02.jpg",
						'stream'    => 0,
						'left'      => 0,
						'top'       => $this->bat_ga_image_top,
						'right'     => 0,
						'bottom'    => 0,
						'width'     => 950,
						'height'    => 52,
						'opacity'   => 100,
						'radius'    => 15,
					];
					// 背景图片的高 加上文字的高度 加上20 的富裕高度
					$in_image_down['height'] = 65 + $this->dat_height + 20;
					$this->bat_ga_image_down = $in_image_down['height'];
					array_push($config['image'],$in_ga);
					// 擅长信息头部图片不规整 调整一下
					$in_image_down['left'] = 2;
				}
				array_push($config['image'],$in_image_down);
				$this->brown_height = $this->brown_height + $this->bat_ga_image_down + 50;
			}
		}else{
			if ($gaswitch == 1){
				// 诊疗/擅长 头部 距离简介文字的高度
				$in_text = [
					// 擅长
					'text' => $this->getbrtext(990, 22, 0, $fontPath, $gac,2), // 文字换行
					'left' => 80,                //文字距离左边框多远(负数是从右往左)
					'top' => 1090 + 105,            //文字距离上边框多远(负数是从下往上)
					'fontPath' => $fontPath,        //字体文件
					'fontSize' => 18,                //字号
					'fontColor' => '98,98,98',        //字体颜色
					'angle' => 0,                //倾斜角度
				];
				array_push($config['text'],$in_text);
				// 诊疗信息下半部分 默认的高度是 $bat_ga_image_down 316
				$in_image_down =
					[
						// 诊疗/擅长 信息下半部分
						'url'       => "../public/assets/XXXX/121_03.png",
						'stream'    => 0,
						'left'      => 0,
						'top'       => 1090 + 50,
						'right'     => 0,
						'bottom'    => 0,
						'width'     => 950,
						'height'    => 65,
						'opacity'   => 100,
						'radius'    => 15,
					];
				if ($gadata == 1){
					// 默认的高度是 65
					$in_dat = [
						// 诊疗信息头部
						'url'       => "../public/assets/XXXX/13_02.png",
						'stream'    => 0,
						'left'      => 0,
						'top'       => 1090,
						'right'     => 0,
						'bottom'    => 0,
						'width'     => 950,
						'height'    => 52,
						'opacity'   => 100,
						'radius'    => 15,
					];
					// 背景图片的高 加上文字的高度 加上20 的富裕高度
					$in_image_down['height'] = 65 + $this->dat_height + 20;
					$this->bat_ga_image_down = $in_image_down['height'];
					$this->brown_height = $this->brown_height + $this->dat_height + 50;
					array_push($config['image'],$in_dat);

				}else{
					$in_ga = [
						// 擅长信息头部
						'url'       => "../public/assets/XXXX/14_02.jpg",
						'stream'    => 0,
						'left'      => 0,
						'top'       => 1090,
						'right'     => 0,
						'bottom'    => 0,
						'width'     => 950,
						'height'    => 52,
						'opacity'   => 100,
						'radius'    => 15,
					];
					// 背景图片的高 加上文字的高度 加上20 的富裕高度
					$in_image_down['height'] = 65 + $this->dat_height + 20;
					$this->bat_ga_image_down = $in_image_down['height'];
					$this->brown_height = $this->brown_height + $this->dat_height + 50;
					array_push($config['image'],$in_ga);
					// 图片不规整 调整一下
					$in_image_down['left'] = 2;
				}
				array_push($config['image'],$in_image_down);
			}
		}
		$filename = '/promote/'.time().'.jpg';
		$file_path = ROOT_PATH.'/public'.$filename;
		$file_dir = 'promote/';
		// 判断是否有这个文件夹  没有的话就创建一个
		if(!is_dir($file_dir)){
			// 创建文件夹
			mkdir($file_dir);
		}
		// 这里调用上面生成海报的根方法,将组装的参数和设置的图片名称传过去
		$url = $this->createPoster($config,$file_path,$syswitch,$gaswitch,$gadata);
		// 这里会直接输出海报图,在调试的时候开启使用
//        echo "<img src='".$filename."'>";
		return $filename;
	}

生成海报图

/**
	 * 生成宣传海报
	 * @param array  参数,包括图片和文字
	 * @param string  $filename 生成海报文件名,不传此参数则不生成文件,直接输出图片
	 * @return [type] [description]
	 */
	public function createPoster($config=[],$filename="",$syswitch,$gaswitch,$gadata)
	{
		//如果要看报什么错,可以先注释调这个header
		if(empty($filename)) header("content-type: image/png");
		$imageDefault = array(
			'left'=>0,
			'top'=>0,
			'right'=>0,
			'bottom'=>0,
			'width'=>100,
			'height'=>100,
			'opacity'=>100
		);
		$textDefault = array(
			'text'=>'',
			'left'=>0,
			'top'=>0,
			'fontSize'=>32,       //字号
			'fontColor'=>'255,255,255', //字体颜色
			'angle'=>0,
		);
		$background = $config['background'];//海报最底层得背景
		// 背景方法
		// getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
		$backgroundInfo = getimagesize($background);
		//  根据指定的图像类型返回对应的后缀名。
		$backgroundFun = 'imagecreatefrom'.image_type_to_extension($backgroundInfo[2], false);
		$background = $backgroundFun($background);
		$backgroundWidth = imagesx($background);  // 返回原图背景宽度
		$backgroundHeight = imagesy($background);  // 返回原图背景高度
		if ($syswitch == 1){
			$backgroundHeight = $this->brown_height;
		}else{
			if ($gaswitch == 1){
				if ($gadata == 1){
					$backgroundHeight = $this->brown_height;
				}else{
					$backgroundHeight = $this->brown_height;
				}
			}
		}
		// PHP中的内置函数,用于创建新的true-color图像。此函数返回给定尺寸的空白图像。
		$imageRes = imageCreatetruecolor($backgroundWidth,$backgroundHeight);
		// PHP中的内置函数,用于设置图像的颜色。此函数返回以RGB格式给出的颜色。
		$color = imagecolorallocate($imageRes, 0, 0, 0);
		// PHP中的内置函数,用于用给定的颜色填充图像。此函数以给定的坐标(图像的左上角为0、0)开始执行填充。
		imagefill($imageRes, 0, 0, $color);
		// imageColorTransparent($imageRes, $color);  //颜色透明
		// 通过重采样复制和调整图像的一部分
imagecopyresampled($imageRes,$background,0,0,0,0,imagesx($background),imagesy($background),imagesx($background),imagesy($background));
		//处理了图片
		if(!empty($config['image'])){
			foreach ($config['image'] as $key => $val) {
				$val = array_merge($imageDefault,$val);

				$info = getimagesize($val['url']);
				// 根据指定的图像类型返回对应的后缀名。
				$function = 'imagecreatefrom'.image_type_to_extension($info[2], false);
				if($val['stream']){   //如果传的是字符串图像流
					// 从字符串中获取图像尺寸信息。
					$info = getimagesizefromstring($val['url']);
					// imagecreatefromstring 从字符串中的图像流新建一图像
					$function = 'imagecreatefromstring';
				}
				$res = $function($val['url']);
				$resWidth = $info[0];
				$resHeight = $info[1];

				//建立画板 ,缩放图片至指定尺寸
				// PHP中的内置函数,用于创建新的true-color图像。此函数返回给定尺寸的空白图像。
				$canvas = imagecreatetruecolor($val['width'], $val['height']);
				imagefill($canvas, 0, 0, $color);
				// 关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
				// 通过重采样复制和调整图像的一部分
				imagecopyresampled($canvas, $res, 0, 0, 0, 0, $val['width'], $val['height'],$resWidth,$resHeight);
				$val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']) - $val['width']:$val['left'];
				$val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']) - $val['height']:$val['top'];
				//2.上色
				$color = imagecolorallocate($canvas,229,231,230);
				//3.设置透明
				imagecolortransparent($canvas,$color);

				// 放置图像
				// PHP中的内置函数,用于将图像复制并合并为单个图像。如果成功,则此函数返回True;如果失败,则返回False。
				imagecopymerge($imageRes,$canvas, $val['left'],$val['top'],$val['right'],$val['bottom'],$val['width'],$val['height'],$val['opacity']);//左,上,右,下,宽度,高度,透明度
			}
		}
		//处理文字
		if(!empty($config['text'])){
			foreach ($config['text'] as $key => $val) {
				$val = array_merge($textDefault,$val);
				list($R,$G,$B) = explode(',', $val['fontColor']);
				$fontColor = imagecolorallocate($imageRes, $R, $G, $B);
				$val['left'] = $val['left']<0?$backgroundWidth- abs($val['left']):$val['left'];
				$val['top'] = $val['top']<0?$backgroundHeight- abs($val['top']):$val['top'];
				// PHP中的内置函数,用于使用TrueType字体将文本写入图像。
				// imagettftextSp
				// imagettftext
				imagettftext($imageRes,$val['fontSize'],$val['angle'],$val['left'],$val['top'],$fontColor,$val['fontPath'],$val['text']);
			}
		}
		
		// 处理成就 单独设置
		if(!empty($config['achieve'])){
			for ($ac = 0;$ac < count($config['achieve']["text"]);$ac++) {
				$text = $config['achieve']["text"];
				list($R,$G,$B) = explode(',',$config['achieve']['fontColor']);
				$fontColor = imagecolorallocate($imageRes, $R, $G, $B);
				$config['achieve']['top'] = $config['achieve']['top'] + 50;
				// PHP中的内置函数,用于使用TrueType字体将文本写入图像。
				// imagettftextSp
				// imagettftext
				imagettftext($imageRes,$config['achieve']['fontSize'],$config['achieve']['angle'],$config['achieve']['left'],$config['achieve']['top'],$fontColor,$config['achieve']['fontPath'],$text[$ac]);
			}
		}
		
		// 成就文字前五角星
		if (!empty($config['pentagram'])){
			// $this->Pentagram
			for ($i = 0;$i < $this->Pentagram * 2;$i++){
				$iniptm = $config['pentagram'];
				$inipentagram = $iniptm['url'];
				// getimagesize() 函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回 FALSE 并产生一条 E_WARNING 级的错误信息。
				$morepentagram = getimagesize($inipentagram);
				// 根据指定的图像类型返回对应的后缀名。
				$morefunction = 'imagecreatefrom'.image_type_to_extension($morepentagram[2], false);
				if($iniptm['stream']){   //如果传的是字符串图像流
					// 从字符串中获取图像尺寸信息。
					$inipentagram = getimagesizefromstring($iniptm['url']);
					// imagecreatefromstring 从字符串中的图像流新建一图像
					$morefunction = 'imagecreatefromstring';
				}
				$inipentagram = $morefunction($inipentagram);
				$morewidth = $morepentagram[0]; // 返回当前图片宽度
				$moreheight = $morepentagram[1]; // 返回当前图片高度
				// 创建新的true-color图像。此函数返回给定尺寸的空白图像。
				$moreimage = imageCreatetruecolor($iniptm['width'], $iniptm['height']);
				// 用给定的颜色填充图像。此函数以给定的坐标(图像的左上角为0、0)开始执行填充。
				imagefill($moreimage, 0, 0, $color);
				// 关键函数,参数(目标资源,源,目标资源的开始坐标x,y, 源资源的开始坐标x,y,目标资源的宽高w,h,源资源的宽高w,h)
				// 通过重采样复制和调整图像的一部分
				imagecopyresampled($moreimage,$inipentagram, 0, 0, 0, 0, $iniptm['width'], $iniptm['height'],$morewidth,$moreheight);
				$iniptm['left'] = $iniptm['left']<0?$backgroundWidth- abs($iniptm['left']) - $iniptm['width']:$iniptm['left'];
				$iniptm['top'] = $iniptm['top']<0?$backgroundHeight- abs($iniptm['top']) - $iniptm['height']:$iniptm['top'];
				//2.上色
				$color = imagecolorallocate($moreimage,229,231,230);
				//3.设置透明
				imagecolortransparent($moreimage,$color);
				// 放置图像
				// PHP中的内置函数,用于将图像复制并合并为单个图像。如果成功,则此函数返回True;如果失败,则返回False。
				// imagecopy
				// imagecopymerge($imageRes,$moreimage, $iniptm['left'],$iniptm['top'],$iniptm['right'],$iniptm['bottom'],$iniptm['width'],$iniptm['height'],$iniptm['opacity']);//左,上,右,下,宽度,高度,透明度
				imagecopy($imageRes,$moreimage, $iniptm['left'],$iniptm['top'] + $i++ * 24.5,$iniptm['right'],$iniptm['bottom'],$iniptm['width'],$iniptm['height']);//左,上,右,下,宽度,高度,透明度
			}
		}
		//生成图片
		if(!empty($filename)){
			// imagegif():以 GIF 格式将图像输出到浏览器或文件
			// imagejpeg():以 JPEG 格式将图像输出到浏览器或文件
			// imagepng():以 PNG 格式将图像输出到浏览器或文件
			// imagewbmp():以 WBMP 格式将图像输出到浏览器或文件
			$res = imagejpeg ($imageRes,$filename,90); //保存到本地
			// 销毁图像资源
			imagedestroy($imageRes);
			if(!$res) return false;
			return $filename;
		}else{
			imagejpeg ($imageRes);     //在浏览器上显示
			imagedestroy($imageRes);
		}
	}

其他方法

	// 因为文字表情无法显示,提供一个过滤表情的方法
	// 过滤掉emoji表情,在参数组装时调用,过滤掉表情
	function filterEmoji($str)
	{
		$str = preg_replace_callback('/./u', function (array $match) {
			return strlen($match[0]) >= 4 ? '' : $match[0];
		}, $str);
		return $str;
	}
	// 文字换行
	public function getbrtext($width = 200, $size = 16, $angle = 0, $font = '../public/assets/fonts/5c8a05a7b3b641552549287.otf', $text = '',$type = '') {
		$hang = 1;
		//判断是否超出范围
		$str = "";
		for ($i = 0; $i < mb_strlen($text); $i++) {
			$letter[] = mb_substr($text, $i, 1);

		}
		foreach ($letter as $l) {
			$teststr = $str . " " . $l;
			$testbox = imagettfbbox($size, $angle, $font, $teststr);
			// 判断拼接后的字符串是否超过预设的宽度。超出宽度添加换行
			if (($testbox[2] > $width) && ($str !== "")) {
				$str .= "\n";
				$hang++;
			}
			$str .= $l;
		}
		if ($type == 1){
			// 获取简介文本高度
			// 行数
			$this->textRows = $hang;
			// 文字高
			$this->summary_height = $this->text_height($str,2,$hang);;

		}elseif ($type == 2){
			$this->bat_ga_textRows = $hang;
			// 获取诊疗文本高度
			$this->dat_height = $this->text_height($str,2,$hang);
		}else{
			// 获取擅长文本高度
			$this->good_at_height = $this->text_height($str,2,$hang);
		}
		//返回
		return $str;
	}
	// 获取文本的高度
	public function text_height ($text,$type,$hang) {
		$size = 12;//font height
		$box = $this->get_bbox(22,0,ROOT_PATH.'/public/assets/fonts/5c8a05a7b3b641552549287.otf',$text);
		if ($type == 1){
			$height = $box[3] - $box[5];
		}else{
			$width = abs($box[4] - $box[0]) + 10;
			$height = (35 * $hang);
		}
		return $height;
	}

	// 用于计算TrueType文本的边框(以像素为单位)。
	public function get_bbox($size = 16,$angle = 0,$font = ROOT_PATH.'/public/assets/fonts/5c8a05a7b3b641552549287.otf',$text = ''){
		/*
		 * imagettfbbox() 返回一个含有 8 个单元的数组表示了文本外框的四个角:
		 * 0 左下角 X 位置
		 * 1 左下角 Y 位置
		 * 2 右下角 X 位置
		 * 3 右下角 Y 位置
		 * 4 右上角 X 位置
		 * 5 右上角 Y 位置
		 * 6 左上角 X 位置
		 * 7 左上角 Y 位置
		*/
		return imagettfbbox($size, $angle, $font, $text);
	}
	// 字体间距
	public function imagettftextSp($image, $size, $angle, $x, $y, $color, $font, $text, $spacing = 0)
	{
		if ($spacing == 0)
		{
			imagettftext($image, $size, $angle, $x, $y, $color, $font, $text);
		}
		else
		{
			$temp_x = $x;
			for ($i = 0; $i < strlen($text); $i++)
			{
				$bbox = imagettftext($image, $size, $angle, $temp_x, $y, $color, $font, $text[$i]);
				$temp_x += $spacing + ($bbox[2] - $bbox[0]);
			}
		}
	}

	/*
	 *去除html标签,并截取指定个字符
	 * $contents 内容
	 * $number 字数
	 */
	public function tagecontent($contents,$number='85'){

		$tagecontent = strip_tags($contents);
		$pattern = '/\s/';//去除空白
		$content = preg_replace($pattern, '', $tagecontent);
		$list = mb_substr($content,0,$number, "UTF-8");
		return $list;
	}

将就看
最后在后台下载图片,
在操作列添加下载按钮

buttons: [
                                {
                                    name: 'ajax',
                                    title: __('发送Ajax'),
                                    classname: 'btn btn-xs btn-primary btn-magic btn-ajax',
                                    icon: 'fa fa-cloud-download',
                                    confirm: '确认发送下载海报图请求?',
                                    url: 'Poster/downloadImg/downloadImg/ids',
                                    success: function (data, ret) {

                                        var a = document.createElement('a');          // 创建一个a节点插入的document
                                        var event = new MouseEvent('click')           // 模拟鼠标click点击事件
                                        a.download = 'beautifulGirl'                  // 设置a节点的download属性值
                                        a.href = data;                                 // 将图片的src赋值给a节点的href
                                        a.dispatchEvent(event)
                                        //如果需要阻止成功提示,则必须使用return false;
                                        //return false;
                                    },
                                    error: function (data, ret) {
                                        console.log(data, ret);
                                        Layer.alert(ret.msg);
                                        return false;
                                    }
                                },
                            ],
/**
	 * 下载图片
	 */
	public function downloadImg($ids){
		if (!$this->request->isAjax()){
			$this->error('错误的信息');
		}
		$row = $this->model->get(['id' => $ids]);
		if($row['poster_image']){
			$poster_image = $this->request->domain() . $row['poster_image'];
			$this->success("请求成功", null,$poster_image);
		}else{
			$this->error(__('No Results were found'));
		}


	}

修改的时候判断是否有修改数据,先获取原数据,在使用 array_diff_assoc 对比提交的数据
array_diff:比较两个数组的值,并返回差集
array_diff_assoc:比较两个数组的键名和键值,并返回差集

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时间轴-小文同学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值