大家见过网页隐藏图像,一般可以用firework或者ps制作隐藏图像。下面介绍一下原理。当我们选择ctrl+a的时候,在图像里面发生了下面变化,所有的x和y坐标和能被2整除的象素(姑且称为a类象素)会保留,而所有的x和y坐标和不能被2整除的象素(姑且称为b类象素)会被蓝色象素覆盖,造成了一种半透明蒙板效果。如
象素(0,0)能保留
而象素(1,0)则要被windows用蓝色象素覆盖掉。
设想一下,我们对所有a类象素如(如(0,0))先下手,用其它颜色覆盖掉(比如说白色),那么剩下b类的象素(如(1,0))仍然保留了一半的信息,由于眼睛分辨率的原因,我们还是可以看得出这副图像的轮廓,只是感觉加了一层半透明的蒙板。
当我们全选的时候,windows将b类象素全部用蓝色象素覆盖掉,那么我们只能看到a类象素了,但是a类象素有效信息已经被我们用白色象素覆盖掉了,宏观效果就是我们看不到有效的图片象素了。
但是如果我们不把a类象素用白色覆盖掉,而是取而代之为另外一张图片(我们成为图片2,原来的图片称为图片1)的a类象素呢。那么我们看到的就是两张图片混合的效果,在这张图片里面,a类象素带了图片2的信息,而b类象素带了图片1的信息。
当我们全选的时候,b类象素被windows用蓝色象素覆盖,我们就只能看到a类象素了,剩下的就是图片1的信息了。
这里仍然不很完美,就是图片2隐藏的很不好,那怎么办,既然图片2的a类象素是必需要保留的,图片1的b类象素必需保留,那么我们就把图片2的透明度调高,这样就淡化了图片2,也许可以降低人们对它的注意力:
效果还是不好,仍然看得出来。怎么办,我们加入干扰因素,是图片颜色打破人眼的习惯。我们先单独对图片2实验这种干扰的效果。
图片2的a类象素必需保留,那么我们可以将图片2的b类象素变成负片效果,这样混合就会得到非常规效果,因为这种轮廓不符合人眼习惯,就会干扰人眼正常识别。这下效果就出来了。
然后我们将图片2透明度调高,于图片1混合,当全选的时候,图片1的信息的b类象素全部被屏蔽,混合图片的a类象素和图片1的a类象素位置的白色象素是半透明的,我们可以朦胧的看见图片2的信息,没有全选的时候,混合图片中b类象素中的包括了图片2的负片信息和图片1的正片信息,而由于a,b类象素都是按同样强度做alpha混合的,所以混合图片中b类象素仍然会干扰a类象素,除非全选将a类象素屏蔽掉。
<?
function MixImg()
{
$param['bgimg']='me.jpg';
$param['hdimg']='index.jpg';
$param['alpha']=25;
$param['fmode']='white';
while(list($key,$val)=each($_GET))
{
$param[$key]=$val;
}
$size=getimagesize($param['bgimg']);
$size1=getimagesize($param['hdimg']);
if(($size[0])>400||($size[1]>300))
{
echo 'Too large images, less than 400*300 pixels.';
exit;
}
if(($size1[0])>400||($size1[1]>300))
{
echo 'Too large images, less than 400*300 pixels.';
exit;
}
$im = imagecreatefromjpeg($param['bgimg']);
$im1 = imagecreatefromjpeg($param['hdimg']);
define(white,ImageColorAllocate($im, 255,255,255));
define(black,ImageColorAllocate($im, 0,0,0));
define(fill_color,($param['fmode']=='black')?black:white);
define(imgh,imagesy($im));
define(imgw,imagesx($im));
for($y=0;$y<=imgh;$y++)
for($x=0;$x<=imgw;$x++)
{
if((($x+$y)%2))
{
imagesetpixel($im1, $x, $y, imagecolorat($im1, $x, $y));
imagesetpixel($im, $x, $y, fill_color);
}
else
{
imagesetpixel($im1, $x, $y,white-imagecolorat($im1, $x, $y));
imagesetpixel($im, $x, $y,imagecolorat($im, $x, $y));
}
}
imagecopymerge( $im, $im1, 0, 0, 0, 0, imgw, imgh,$param['alpha']);//混合图像,做alpha混合
Header("Content-type: image/png");
Imagepng($im);
ImageDestroy($im);
ImageDestroy($im1);
}
?>