PHP 微信小程序码与背景图合并

需求:

  1. 微信二维码与背景图合并,
  2. 合并图加上房间名称并居于合适位置。

首先,确定开启了PHP gd库,可以使用下面的代码查看是否开启了,若没开启请自行搜索开启方法。

if(extension_loaded('gd')){
	echo "可以使用gd<br>";
	foreach(gd_info() as $k=>$v){
		echo "$k:$v<br>";
	}
}else{
	echo "不能使用";
}

然后,使用gd库的方法直接操作图片就OK,不懂的gd库api传送门在这 https://www.kancloud.cn/liuzhen153/tp5-demo/273394

        // 图片一 url地址或者相对地址
		$path_1 = './images/backcode.png';
		// 图片二  url地址或者相对地址
		$path_2 = './images/minacode.png';
		//创建图片对象
		$image_1 = imagecreatefrompng($path_1);
		$image_2 = imagecreatefrompng($path_2);

		//创建真彩画布
		$image_3 = imageCreatetruecolor(imagesx($image_1),imagesy($image_1));
		//imagepng($image_3);
		//为真彩画布创建白色背景
		
		$color = imagecolorallocate($image_3, 0, 0, 0);
		imagefill($image_3, 0, 0, $color);
		imageColorTransparent($image_3, $color);
		//复制图片一到真彩画布中(重新取样-获取透明图片)
		imagecopyresampled($image_3, $image_1, 0, 0, 0, 0, 
        imagesx($image_1), imagesy($image_1), imagesx($image_1), imagesy($image_1));
		//与图片二合成
		imagecopymerge($image_3, $image_2, 134, 260, 0, 0, 
        imagesx($image_2), imagesy($image_2), 100);  

		$str = "水木年华s";
		
		$rnamewidth = $this->getRNameWidth($str);
		
		$fontcolor   = imagecolorallocate($image_3, 40, 40, 40); //由十进制整数设置一个颜色
		
		//windows  系统字体 --楷体
		$fontfile = str_replace('\\', '/', 'C:\Windows\Fonts\simkai.ttf');
		imagettftext($image_3, 28, 0, $rnamewidth, 58, $fontcolor, $fontfile, $str);
		// 输出合成图片
		ob_clean ();//清空缓存区
		header('Content-type: image/png');
    	 imagejpeg($image_3);

记录一下遇到的问题,

  1. 一开始使用的2张固定图片,合并生成是正常的,但是使用从微信获取的小程序码图片后并不能成功合并,出现小程序码消失的情况。
  2. 小程序码图片过大,需要调整及调整过程
  3. 使得添加的文字信息位置居中
  4. 选择字体文件

解决方案:

  1. 我遇到的这种情况是因为2张图片的mime类型不同,导致使用imageXXX方法不能正确的生成图片,所以导致无法合并,需要考虑的是,你当前使用的2张图片的mime类型是否一致。可以使用 getimagesize 这个方法来判断一下
    $arr = getimagesize($path_2);//url地址或相对地址
    echo "<pre>"; print_r($arr);die;
  2. 获取小程序码图片后,使用 imagecopyresampled 处理图片即可,这里需要注意的是,小程序码本身是黑色的,若创建白色背景会导致失真的错觉,并且会有图片质量降低的感觉
    //将图片二  小程序码缩略成202*202
    //创建真彩画布
    $image_4 = imageCreatetruecolor(imagesx($image_2),imagesy($image_2));
    //为真彩画布创建黑色背景  因为小程序码是黑色的,若创建白色背景会有小程序码失真的感觉
    $color4 = imagecolorallocate($image_4, 255, 255, 255);
    imagefill($image_4, 0, 0, $color4);
    imageColorTransparent($image_4, $color4);
    //复制图片一到真彩画布中(重新取样-获取透明图片)
    imagecopyresampled($image_4, $image_2, 0, 0, 0, 0, 202, 202,
    imagesx($image_2), imagesy($image_2));
  3. 关于这个问题,因为房间信息字符串只包含中文数字字母这3种类型,我想到的办法是按照固定图片合并成功的图片去获取这3种类型的宽度,从而计算出整个字符串的宽度,然后通过背景图的宽度进行相应运算得到这个字符串的x坐标 。
    其运算法则是   (背景图宽度 - (中文数量*中文宽度)+(数字数量*数字宽度)+(字母数量*字母宽度))/ 2
    我这边的背景图宽度为470,中文36,数字字母20  (单位px)
    //根据房间名称  确认x坐标
    public function getRNameWidth($roomname){
    	header("Content-type: text/html; charset=utf-8");
    		
    	preg_match_all("/[0-9]{1}/",$roomname,$arrNum);//数字
    	preg_match_all("/[a-zA-Z]{1}/",$roomname,$arrAl);//字母
    	preg_match_all("/([\x{4e00}-\x{9fa5}]){1}/u",$roomname,$arrCh);//汉字
    		
    	$numlen = sizeof($arrNum[0]);
    	$allen = sizeof($arrAl[0]);
    	$chlen = sizeof($arrCh[0]);
    		
    	$rnamewidth = ($numlen+$allen)*20+$chlen*36;
    		
    	$x = (abs(470-$rnamewidth))/2;
    		
    	return $x;
    }
  4. 字体选择的是windows自带的一些字体,大家可以去C盘的windows/fonts 目录下找找,需要注意的是只能使用 .ttf后缀的文件,可以通过右击,选择属性来查看是否是 .ttf 和字体文件的名称

谨以此记。成品如下

猜你喜欢

转载自blog.csdn.net/SCT_T/article/details/81104307