一、问题分析
我们想要制作的东西是一张图片,或者至少看起来像图片的东西(鸭子类型),这张图片可以在不同的时刻呈现不同的形态,然而必须有一个固定的地址。因为我们是想把它插入到论坛里跟人开玩笑,就像这里一样。
要有固定地址这一点限制了我们只能用服务器端技术来炮制图片。也就是说,基于JS的技术,或者更广泛来讲,基于DHTML技术的工具我们都不能使用。因为我们要的是一个图片地址,而DHTML是在客户端进行的解析。
要使用服务器端技术,首先要求我们有服务器。这里我选择的是新浪云平台SAE上的服务,使用PHP来完成。欢迎大家访问http://omegacoleman.sinaapp.com/。
然而这个问题还有一个潜在需求,就是图像的地址必须是.jpg,.png这类后缀,然而使用PHP建立的无疑是.php后缀。现如今大多数论坛都会禁止插入没有图像后缀的图像,即使是你的php返回了图像数据也一样。在第三节中我会解决这个问题。
二、服务器端图像处理
使用PHP进行图像处理很简单,这里我们采用GD库进行处理。但在这之前,我们还要修改HTTP头。因为PHP默认返回text/html头,这显然不是我们想要的。
<?php
header("content-type:image/jpeg");
这样写可以改变成jpeg网页头,现在它看起来像鸭子了。
然后,我们就可以用GD库进行图像处理了。为了达到刷新改变的效果,我们只需简单的加入一些随机元素,代码如下:
$img = imagecreatefromjpeg('http://omegacoleman-occnimages.stor.sinaapp.com/notepad.jpg');
$color = imagecolorallocate($img, 0, 0, 0);
$txt_bleach =
"故事的主角黑崎一护是个看似单薄却满身\n".
"热血少年,并且拥有能看见灵的体质。一\n".
"天晚上,死神朽木露琪亚被他一脚踢到墙\n".
"角并满脸惊疑地望着他问“你能看见我?”\n".
"时序幕才这样被他正式地踢开……";
$txt_hyouka =
"在其他正要展开玫瑰色高中生活的学生当\n".
"中,本作的男主角却是一个灰色的节能主\n".
"义者,没有必要的事都不会主动去做,因\n".
"为不想后悔,被人说他疏离、厌世也没所\n".
"谓,因为这就是他的作风。这样的他,因\n".
"为姐姐的命令而进入了濒临废社的古籍研\n".
"究社,虽然好不容易招到了四名新社员,\n".
"却又卷入了三十二年前社长突然逃学的谜\n".
"团之中……";
$txt_another =
"26年前夜见山北中学的三年三班里,曾经\n".
"有一位名叫见崎的学生。她不仅是位运动\n".
"天才还是个优等生,个性平易近人广受众\n".
"人喜爱的她却在某日突然猝死,极度悲伤\n".
"的同班同学们无法接受这件事实,众人决\n".
"定到毕业之前仍想像见崎还活著般度过每\n".
"一天……";
$txt_gc =
"本作的男主角樱满集,17岁的高校二年生\n".
",他的右手却寄宿著特殊的能力王之能力\n".
"能从同伴间取出反映人格的物质,并将他\n".
"人的能力据为己用。被取出的物质叫做虚\n".
"空,除了可以是大剑,也可以是乐器或相\n".
"机。虽然集一直隐藏着自己的能力,并尽\n".
"量避免为其他人制造麻烦,但当他遇上女\n".
"主角后,他的人生便从此转变了……";
$all_txt = array($txt_gc, $txt_another, $txt_hyouka, $txt_bleach);
$txt = $all_txt[array_rand($all_txt)];
imagettftext($img, 15, 0, 80, 120, $color, "simhei.ttf", $txt);
这样我们就得到了一个图片数据块$img,其中的文字内容是随机的。
随后我们向客户端输出这个数据块:
imagejpeg($img);
好了,现在它叫起来也像是鸭子了。
我的这个php文件在http://64.omegacoleman.sinaapp.com/piclamp.php,你刷新就可以看出变化。记住上传时把php文件和simhei.ttf(可从网上下载)字体文件放在一起。
三、伪装后缀名
这一步相对简单很多,思路很明确——URL重写。为什么选择URL重写呢?因为如果用其他方式跳转至该php都没有办法改变后缀为.jpg。
在SAE中,URL重写十分容易。有两种方法:
一是在SAE管理页面中单击右侧的AppConfig,再点击右侧的URL重写(rewrite),在对话框“重写后规则”中填入后缀为.php的文件,再任选一个不存在的图像文件地址填入“重写前规则”。点击“添加”“确定”,然后再把你在“重写前规则”中输入的地址打在浏览器地址栏中回车,刷新几次,就能看到图像在不断变化。
还有一种方法是直接修改config.yaml,这个在此不做赘述。
此时再把这个URL发在Discuz论坛中,就能不断变化啦。
如果你用的不是SAE,而是Apache,可以使用mod_rewrite.so:
在httpd.conf中将这一行注释解开:
LoadModule rewrite_module modules/mod_rewrite.so
再搜索AllowOverride,将后面的None改成All,重启服务器。
随后修改网站目录下.htaccess(没有就建立一个),加入:
RewriteEngine On
RewriteRule ***.jpg ***.php
大功告成了!