体验地址:https://www.zkcoi.com/guoqing
经过不懈地研究,继之前研究的WPJAM微信机器人,终于在公众号里整了个合成国庆头像的功能,这下可以不求人了。
那么通过WPJAM微信机器人处理图片即可。
//将自定义回复的关键字设置为[img],回复内容为函数回复zke_wx_img_reply function zke_wx_img_reply($keyword, $wxObj){ $msg_input = file_get_contents('php://input');//获取用户在公众号发送的内容 $msg_input = $wxObj->decrypt($msg_input); //调用WPJAM微信机器人的解密方法 $msg_input = xmlToObject($msg_input); // 去掉控制字符 $PicUrl = (string)$msg_input->PicUrl; //获取图片url $MediaId = (string)$msg_input->MediaId;//获取图片MediaId $result = add_flag($PicUrl,$MediaId) ; $result_type = substr($result, -4); if ($result_type === '.jpg') { $item = '<item> <Title><![CDATA[您的国庆头像已经制作成功]]></Title> <Description><![CDATA[点击获取您的国庆头像,不满意可回复“国庆”]]></Description> <PicUrl><![CDATA['.$result.']]></PicUrl> <Url><![CDATA['.$result .']]></Url> </item>'; $wxObj->news_reply($item); } else { $item = '<item> <Title><![CDATA[爱国头像获取失败,点击联系zke]]></Title> <Description><![CDATA[错误提示:'.$result.']]></Description> <PicUrl><![CDATA[https://www.zkcoi.com/wp-content/uploads/2023/06/zk_wx_reply.png]]></PicUrl> <Url><![CDATA[https://work.weixin.qq.com/kfid/kfc7d5f2527b579c8eb]]></Url> </item>'; $wxObj->news_reply($item); } } function xmlToObject($xmlString) { $xmlObject = simplexml_load_string($xmlString, 'SimpleXMLElement', LIBXML_NOCDATA);//WPJAM微信机器人里的,直接复制过来用 return $xmlObject; } //生成国庆头像的方法 function add_flag($PicUrl, $MediaId) { // 获取远程头像图片并保存到本地临时文件 $temp_avatar_file = tempnam(sys_get_temp_dir(), 'avatar_'); $avatar_data = file_get_contents($PicUrl); $wx_img_path = ZKEEV_URI . 'static/img/wx/'; if ($avatar_data === false) { return '下载头像出错。'; } if (file_put_contents($temp_avatar_file, $avatar_data) === false) { return '保存头像出错。'; } // 获取头像图片的宽度和高度 list($avatar_width, $avatar_height, $avatar_type) = getimagesize($temp_avatar_file); // 确保头像为正方形 if ($avatar_width != $avatar_height) { unlink($temp_avatar_file); return '别搞我,头像必须得是正方形的'; } // 国旗水印图片的路径 $flag_watermark_path = $wx_img_path.'flag.png'; // 设置国旗水印图片的本地路径 // 打开头像图片 switch ($avatar_type) { case IMAGETYPE_JPEG: $avatar = imagecreatefromjpeg($temp_avatar_file); break; case IMAGETYPE_PNG: $avatar = imagecreatefrompng($temp_avatar_file); break; // 这里可以继续添加其他格式的支持 default: unlink($temp_avatar_file); return '这个格式不支持,必须得是jpg和png的'; } // 打开国旗水印图片 $flag_watermark = imagecreatefrompng($flag_watermark_path); // 获取国旗水印图片的宽度和高度 $flag_width = imagesx($flag_watermark); $flag_height = imagesy($flag_watermark); // 获取头像的宽度和高度 $avatar_width = imagesx($avatar); $avatar_height = imagesy($avatar); // 计算缩放后的头像宽度和高度 $new_width = 940; $new_height = 940; // 创建一个新的图像资源,用于存储缩放后的头像 $avatar_resized = imagecreatetruecolor($new_width, $new_height); // 将原始头像缩放到新的图像资源上 imagecopyresampled($avatar_resized, $avatar, 0, 0, 0, 0, $new_width, $new_height, $avatar_width, $avatar_height); // 将水印叠加到缩放后的头像的左上角 imagecopy($avatar_resized, $flag_watermark, 0, 0, 0, 0, $flag_width, $flag_height); // 将缩放后的头像资源赋值给原始头像 $avatar = $avatar_resized; // 生成合成后的头像文件路径 $result_avatar_path = $wx_img_path.'/output/' . $MediaId.'.jpg'; // 保存带有国旗水印的头像图片,并限制文件大小在150KB左右 $quality = 90; // 初始质量 while (true) { ob_start(); imagejpeg($avatar, null, $quality); $output = ob_get_contents(); ob_end_clean(); $outputSize = strlen($output); if ($outputSize <= 150 * 1024 || $quality <= 10) { // 150KB,也可以根据需要调整 file_put_contents($result_avatar_path, $output); break; } $quality -= 10; // 递减质量 } // 销毁图像资源 imagedestroy($avatar); return ZKEEV_STATIC . 'img/wx/output/' . $MediaId.'.jpg'; }
本文作者:𝙕𝙆𝘾𝙊𝙄
文章名称:不求人,以后自己整国庆头像
文章链接:https://www.zkcoi.com/365up/program/2771.html
本站资源仅供个人学习交流,请于下载后24小时内删除,不允许用于商业用途,否则法律问题自行承担。