Hide a picture
Hide a picture
2004.02.09
说明:前阵在BBS上看到一幅“隐藏图片”,就是在IE里的一幅图,看上去是一个拿枪的士兵,按Ctrl+A后就变成一个美女。我把那幅图发给同事玩,有个同事把它放大了仔细看,找出了规律。具体来说,这是和IE直接相关的:IE在用户按Ctrl+A选中一幅图时,按45度的斜十字网格,把网格上的像素变蓝。剩下的一半像素照常显示。
我写了一段简单的代码来合并两个图。使用自己写的CDib类来操作bitmap文件。注意在这个例子里最好用24bits位图,因为在CDib类里并没有实现dither, 对于8bits调色板位图来说这是复制时必需的。1.bmp和2.bmp是两个相同大小的位图,1做背景,2是待隐藏图像文件。
CDib d1, d2; // CDib is a self-made class, works in MFC only
if( !(d1.Load( "C:\\1.bmp") && d2.Load( "C:\\2.bmp")))
{// d1 is the background bitmap and the d2 is the picture to hide
AfxMessageBox( "Load bitmap failed");
return;
}
unsigned int xmax = d1.GetDibWidth();
unsigned int ymax = d1.GetDibHeight();
if( (xmax != d2.GetDibWidth()) || ( ymax != d2.GetDibHeight()))
{// make sure the two images have the same size
AfxMessageBox( "The bitmap size mismatch!");
return;
}
unsigned int i, j;
for( i = 0; i < xmax; i++)
{
for( j = 0; j < ymax; j++)
{
if( (i + j)%2) //关键是这里
{
d1.SetPixel( i, j, d2.GetPixel( i, j));
}
}
}
d1.Save( "C:\\3.bmp"); // Write the result to 3.bmp
结果图是:

需要注意的是,背景(1.bmp)和待隐藏图像(2.bmp)最好具有相近的色调和饱和度,可以先用图像处理软件处理一下。背景图最好要足够复杂,而待隐藏图片最好不要有很复杂的纹理,对比度要尽可能小。
另外一些软件,比如FrontPage, 图像被选中时是色彩取反(Invert),不知道这个特性可以做出什么特效来,可以开动脑筋想一想。
ps. 看到有人用PhotoShop做这种图片,好复杂的:http://www.blueidea.com/tech/graph/2003/859.asp
posted 2004.02.09 Monday
分类
Technology

发表评论