error_reporting
(0);
ob_start();
header(
'Content-Type: image/png'
);
define(
'IMG_NO'
,
"no.png"
); #刚开始显示的提示信息
define(
'IMG_BACKGROUND'
,
"background.png"
);
define(
'IMG_WIDTH'
, 400);
define(
'IMG_HEIGHT'
, 128);
define(
'FONT_NAME'
,
"AdobeHeitiStd-Regular.otf"
); #字体文件名
define(
'CACHE_PATH'
, rtrim(
realpath
(
"./cache"
),
'/'
).
'/'
); #缓存目录
define(
'CACHE_EXPIRE'
, 60*60); #缓存时间,单位秒
#(!
is_dir
(CACHE_PATH) &&
is_writable
(CACHE_PATH)) ||
die
;
/*
$remote: 远程URL
$local: 本地缓存路径
$expire: 过期时间。为-1时,永久不更新缓存
*/
function
load_from_cache(
$remote
,
$local
,
$expire
= CACHE_EXPIRE,
$as_path
= false) {
//过滤潜在的危险字符
$local
= preg_replace(
"/[.\/\\\?\*\'\"\|\:\<\>]/"
,
"_"
,
$local
);
$cache
= CACHE_PATH.
$local
;
//查找缓存
if
(
file_exists
(
$cache
) && (
$expire
= -1 ||
filemtime
(
$cache
) - time() <
$expire
))
return
$as_path
?
$cache
:
file_get_contents
(
$cache
);
//文件不存在或缓存过期,重新下载
$content
=
file_get_contents
(
$remote
);
file_put_contents
(
$cache
,
$content
);
return
$as_path
?
$cache
:
$content
;
}
/*
返回客户端信息。
*/
function
client_info() {
$ip
= (
$_SERVER
[
"HTTP_VIA"
] &&
$_SERVER
[
"HTTP_X_FORWARDED_FOR"
] ?
$_SERVER
[
"HTTP_X_FORWARDED_FOR"
] :
$_SERVER
[
"REMOTE_ADDR"
]);
$info
=
explode
(
'"'
, load_from_cache(
$url
.
$ip
,
$ip
, -1));
$string
=
$info
[7].
$info
[23].
$info
[31].
$info
[47];
return
json_decode(
'"'
.
$string
.
'"'
);
}
$referer
=
$_SERVER
[
'HTTP_REFERER'
];
$pattern
=
"/http:\/\/user.qzone.qq.com\/(\d+)\/infocenter/"
;
if
(preg_match(
$pattern
,
$referer
,
$matches
)) {
//获取QQ号码
$uin
=
$matches
[1];
$info
=
explode
(
'"'
, load_from_cache(
$avatar
=
$info
[3];
$nickname
= iconv(
"GBK"
,
"UTF-8//IGNORE"
,
$info
[5]);
$client
= client_info();
//重点来了,生成图片
try
{
$im
= imagecreatefrompng(IMG_BACKGROUND);
//绘制头像
$avatar_file
= load_from_cache(
$avatar
,
$uin
.
".jpg"
, 60*60*24, true);
$im_avatar
= imagecreatefromjpeg(
$avatar_file
);
imagecopymerge(
$im
,
$im_avatar
, 14, 14, 0, 0, 100, 100, 100);
imagedestroy(
$im_avatar
);
//绘制文字
$blue
= imagecolorallocate(
$im
, 0, 0x99, 0xFF);
$white
= imagecolorallocate(
$im
, 0xFF, 0xFF, 0xFF);
$texts
=
array
(
array
(12, 148, 40,
$white
,
$uin
),
array
(18, 125, 70,
$blue
,
$nickname
),
array
(16, 125, 100,
$blue
,
$client
)
);
foreach
(
$texts
as
$key
=>
$value
) {
imagettftext(
$im
,
$value
[0], 0,
$value
[1],
$value
[2],
$value
[3], FONT_NAME,
mb_convert_encoding(
$value
[4],
"html-entities"
,
"utf-8"
));
//解决乱码问题
}
imagepng(
$im
);
imagedestroy(
$im
);
header(
"Content-Length: "
.ob_get_length());
ob_end_flush();
}
catch
(Exception
$e
) {
//die($e->getMessage());
$error
= true;
}
}
else
{
$error
= true;
}
//更新:在这里直接停止输出即可防止图片被缓存
die
();
/*
if($error){
header('Content-Length: '.filesize(IMG_NO));
echo file_get_contents(IMG_NO);
}
*/