//业务需求:我们需要一个微信小程序码,但是是需要提供给别人扫码的但是只有一个纯粹的小程序码是不好看的,所以需要推广的海报图片。再结合文字
(相关资料图)
最终效果
准备工作 1、需要海报的底图 2、小程序码的图片
代码部分结合YII2但不影响使用
完整过程
第一步:生成小程序码图片
第二步:缩放小程序码的图片大小 (如果尺寸符合海报大小可省略) 280-1280px
第三步:将缩放后的小程序图片合成到背景图片
第四步:合成文字信息
第一步:生成小程序码图片(我使用的场景是无限制小程序码code地址 三种自行选择)
//微信小程序 小程序码 public static function getWeChatSmallProgramCode($scene) { $AccessToken = self::getAccessToken(); $url = "https://api.weixin.qq.com/wxa/getwxacodeunlimit?access_token=" . $AccessToken; $postData = [ "scene" => $scene, "page" => "pages/index/index", "width"=>930 ]; $postData = json_encode($postData); $contentData = self::sendPost($url, $postData); return $contentData; //如果图片大小符合这开启base64位图片地址也可以完成图片的合并合文字的合并// return self::base64UrlCode($contentData, "image/png"); } protected static function sendPost($url, $post_data) { $options = array( "http" => array( "method" => "POST", "header" => "Content-type:application/json", //header 需要设置为 JSON "content" => $post_data, "timeout" => 60 //超时时间 ) ); $context = stream_context_create($options); return file_get_contents($url, false, $context); } //二进制转图片image/png public static function base64UrlCode($contents, $mime) { $base64 = base64_encode($contents); return ("data:" . $mime . ";base64," . $base64); }第二步:缩放小程序码的图片大小
/** * 缩放图片尺寸 * @param $img_path string 图片地址 * @param $new_width * @param $new_height * @param $new_img_path string 新的图片地址 */ public static function picZoom($img_path,$new_width,$new_height,$new_img_path) { //获取尺寸 list($width, $height, $img_type, $attr) = getimagesize($img_path); $imageinfo = [ "width" => $width, "height" => $height, "type" => image_type_to_extension($img_type, false), "attr" => $attr ]; $fun = "imagecreatefrom" . $imageinfo["type"]; $image = $fun($img_path); //创建新的幕布 $image_thump = imagecreatetruecolor($new_width, $new_height); //复制源文件 imagecopyresampled($image_thump, $image, 0, 0, 0, 0, $new_width, $new_height, $imageinfo["width"], $imageinfo["height"]); imagedestroy($image); $image = $image_thump; $func = "image" . $imageinfo["type"]; $func($image, $new_img_path); }第三步:将缩放后的小程序图片合成到背景图片
/** * 图片合并 * 将源图片覆盖到目标图片上 * @param string $dstPath 目标图片路径 背景图 * @param string $srcPath 源图片路径 内容图 * @param int $dstX 源图片覆盖到目标的X轴坐标 * @param int $dstY 源图片覆盖到目标的Y轴坐标 * @param int $srcX * @param int $srcY * @param int $pct 透明度 * @param string $filename 输出的文件名,为空则直接在浏览器上输出显示 * @return string $filename 合并后的文件名 */ public static function picMerge($dstPath, $srcPath, $dstX = 0, $dstY = 0, $srcX = 0, $srcY = 0, $pct = 100, $filename = "") { //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dstPath)); $src = imagecreatefromstring(file_get_contents($srcPath)); //获取水印图片的宽高 list($src_w, $src_h) = getimagesize($srcPath); //将水印图片复制到目标图片上,最后个参数50是设置透明度,这里实现半透明效果// imagecopymerge($dst, $src, 80, 125, 0, 0, $src_w, $src_h, 100); imagecopymerge($dst, $src, $dstX, $dstY, $srcX, $srcY, $src_w, $src_h, $pct); //如果水印图片本身带透明色,则使用imagecopy方法 //imagecopy($dst, $src, 10, 10, 0, 0, $src_w, $src_h); //输出图片 list($dst_w, $dst_h, $dst_type) = getimagesize($dstPath); switch ($dst_type) { case 1://GIF if (!$filename) { header("Content-Type: image/gif"); imagegif($dst); } else { imagegif($dst, $filename); } break; case 2://JPG if (!$filename) { header("Content-Type: image/jpeg"); imagejpeg($dst); } else { imagejpeg($dst, $filename); } break; case 3://PNG if (!$filename) { header("Content-Type: image/png"); imagepng($dst); } else { imagepng($dst, $filename); } break; default: break; } imagedestroy($dst); imagedestroy($src); }第四步:合成文字信息
/** * 添加文字到图片上 * @param $dstPath string 目标图片 * @param $fontPath string 字体路径 * @param $fontSize string 字体大小 * @param $text string 文字内容 * @param $dstY string 文字Y坐标值 * @param string $filename 输出文件名,为空则在浏览器上直接输出显示 * @return string 返回文件名 */ public static function addFontToPic($dstPath, $fontPath, $fontSize, $text, $dstY, $filename = "") { ob_end_clean(); //创建图片的实例 $dst = imagecreatefromstring(file_get_contents($dstPath)); //打上文字 $fontColor = imagecolorallocate($dst, 255, 255, 255);//字体颜色 $width = imagesx($dst); $height = imagesy($dst); $fontBox = imagettfbbox($fontSize, 0, $fontPath, $text);//文字水平居中实质 imagettftext($dst, $fontSize, 0, ceil(($width - $fontBox[2]) / 2), $dstY, $fontColor, $fontPath, $text); //输出图片 list($dst_w, $dst_h, $dst_type) = getimagesize($dstPath); switch ($dst_type) { case 1://GIF if (!$filename) { header("Content-Type: image/gif"); imagegif($dst); } else { imagegif($dst, $filename); } break; case 2://JPG if (!$filename) { header("Content-Type: image/jpeg"); imagejpeg($dst); } else { imagejpeg($dst, $filename); } break; case 3://PNG if (!$filename) { header("Content-Type: image/png"); imagepng($dst); } else { imagepng($dst, $filename); } break; default: break; } imagedestroy($dst); return $filename; }外部的调用
/** * 根据店铺id 和名称 合成A5 图片小程序图片 * @param $shop_id * @param $shop_name * @return array */ public static function generateWeChatAppletImage($shop_id, $shop_name) { //1 生成小程序码 //2 合成小程序码到背景图片 $sceneStr = "?shop_id=" . $shop_id; $weChatAppImgBaseData = WxTools::getWeChatSmallProgramCode($sceneStr); $weChatAppImgPath = "./weChatAppImg/shop_code_" . $shop_id . ".jpg"; file_put_contents($weChatAppImgPath, $weChatAppImgBaseData); //合并到背景图片中 $beiJinImgPath = "./weChatAppImg/weChatBJ.jpg"; $mergeImgFile = "./weChatAppImg/shop_mini_program" . $shop_id . ".jpg"; GenerateCodeImg::picMerge($beiJinImgPath, $weChatAppImgPath, 408, 714, $srcX = 0, $srcY = 0, $pct = 100, $mergeImgFile); //3 合成文字 $fontPath = "./plus/fonts/SourceHanSansCN-Bold.ttf"; $fontSize = 40; $dstY = 640; GenerateCodeImg::addFontToPic($mergeImgFile, $fontPath, $fontSize, $shop_name, $dstY, $mergeImgFile); $weChatCodeImgUrL = \Yii::$app->request->hostInfo . "/weChatAppImg/shop_code_" . $shop_id . ".jpg"; $weChatAppImgUrl = \Yii::$app->request->hostInfo . "/weChatAppImg/shop_mini_program" . $shop_id . ".jpg"; return [ "weChatCodeImgUrL" => $weChatCodeImgUrL, "weChatAppImgUrl" => $weChatAppImgUrl, ]; }常见的问题
1文字合并的时候出现乱码?
第一检测一下字体是否是正常tff字体 如果不知道去C://windows/Fonts 随便找一个 微软雅黑都行
2、英文阿拉布数字正常 中文乱码
$text = mb_convert_encoding("呵呵呵","UTF-8","GBK");
$text = mb_convert_encoding("呵呵呵","html-entities","UTF-8");
设置看看
关键词:
业务需求:我们需要一个微信小程序码,但是是需要提供给别人扫码的但是只有一个纯粹的小程序码是不好看的,所以需要推广的海报图片。再结合2023-03-27
有听到小伙伴们不会画衣服褶皱的今天给大家分享一个褶皱画法合集里面收纳了褶皱绘画教程、男生女生服饰、不同风格款式参考等赶紧点赞收藏起来2023-03-27
DC新作《雷霆沙赞!众神之怒》于3月17日在国内上映,影片在3月20日宣布票房突破3000万,但上映至今天,累计10天,票房堪堪达到4000万。2023-03-27
瑞信最大股东——沙特国家银行27日在沙特交易所发布公告称,董事长AmmarAlKhudairy因个人原因辞职,继任者为公司首席执行官SaeedMohamm2023-03-27
岳阳临湘市桃矿街道开展2023年重点人群健康体检工作2023-03-27
美国前白宫国安顾问欧布莱恩(Robert O’Brien)24日在台北召开记者会表示,台湾全民应学习使用AK-47步枪,以吓阻中国大陆武力攻台。上个月2023-03-27
光环新网(300383)03月27日在投资者关系平台上答复了投资者关心的问题。2023-03-27
海外网3月27日电 据美国《国会山报》等媒体3月26日报道,美国宾夕法尼亚州一家工厂日前发生泄漏事故,导致超过8000加仑用于乳胶表面处理的化2023-03-27
【环球时报特约记者陈立非】洪都拉斯政府宣布与台当局断绝“外交关系”,成为蔡英文任内第9个“断交”的“邦交国”,这样台当局“邦交国”的数2023-03-27
想摆摊儿?东胜区可以一键申请!2023-03-27
1、拉帕尔马机场(英语:LaPalmaAirport;IATA代码:SPC;ICAO代码:GCLA)位于加那利群2023-03-27
1、熟木耳过夜是否可以吃,需要根据木耳是否出现霉变决定,未发生霉变或者异味的木耳一般可以食用。2、做熟的木耳,如果当天没有吃完,通常木2023-03-26
《灾难侦探斎牙~不合理的怪奇事件~》是一款滑稽风格的灾难冒险游戏,该作今日正式在Steam平台发售,游戏支持简体中文,目前游戏在国区的售价2023-03-26
小鸡庄园8 14答案是什么?在支付宝中,我们可以通过蚂蚁庄园回答每日问题,答对后可以获取饲料,我们可以使用饲料喂养小鸡,那么小鸡庄园82023-03-26
解答:1、食材:冰粉7克,红糖适量,开水适量。2、取冰粉7克,放入容器中,倒入开水,搅拌;3、直到完全融化,颗粒看不见后2023-03-26
1、九江市属于江西省。2、九江,简称“浔”,为江西省地级市,古称柴桑、江州、浔阳,是一座有着2200多年历史的江南名城。3、九江位于长江、京2023-03-26
半场-朱辰杰乌龙吴少聪送点&颜骏凌扑点国足0-1新西兰,武磊,颜骏凌,朱辰杰,吴少聪,新西兰,韦世豪,中国足球联赛,中国职业运动联盟2023-03-26
中国酒业协会第六届理事会第五次(扩大)会议在山东泰安召开,会议披露了2022年酒业各酒种的发展情况。其中,白酒行业发展势头良好,据国家统计2023-03-26
榆阳法院拍卖宝马牌小型轿车一辆,59400元起拍!2023-03-26
大东海位于三亚市东约二公里处,在鹿回头与榆林港之间,是个弓字形的海湾。三亚大东海背靠青山,东南平行走向的两条小小的山脉,恰似两道巨岩2023-03-26
1、红葱头,又名红葱、圆葱、细香葱、香葱,属百合科(Liliaceae)葱属葱种分葱亚种的一个栽培类型,学名为All2023-03-26
当地时间3月25日,约旦外交和侨务部谴责以色列当局计划在约旦河西岸和东耶路撒冷建造一千多个住房的计划。该部门表示,新建住房计划严重违反国2023-03-25
兰茂文化节|18个项目签约嵩明,协议投资总额27 6亿元2023-03-25
市交通委指挥中心介绍,2023年清明节假期为4月5日(星期三,正清明),共1天,节日期间高速公路实施7座以下小客车免费通行政策。清明假期有出2023-03-25
宽松的毛衣,镂空的领子和背部非常的时尚个性,白色的镂空部分做工精美,搭配卷边的牛仔短裤,黑色的打的裤袜,个性飞扬。玫红色的镂空大领子2023-03-25
