体验地址: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';
}
本文作者:ZKCOI
文章名称:不求人,以后自己整国庆头像
文章链接:https://www.zkcoi.com/365up/program/2771.html
本站资源仅供个人学习和交流,如若转载,请注明出处,详见《免责声明》。
微信扫一扫
支付宝扫一扫
