博得一笑

编程只为博得一笑

所有的代码都自己敲……
    所有的BUG都自己找……
 

博得写的博客

写博客的博得
2005自制游戏《小鱼蛋与小仙女》 下载  Hot      学思湖怪超COOL文字生成器II黄金特别版——华丽登场!!!  New Cool Hot

de

[博得作品]

1、 学思湖怪超COOL文字生成器II黄金特别版——华丽登场!!!  New  Cool
最酷的文字特效生成器,丰富的附加功能,让喜欢灌水的你武装到牙齿!

2、 2005自制游戏《小鱼蛋与小仙女》 下载  Hot
(根据2005热播电视连续剧《小鱼儿和花无缺》改编)
 

posted @ 2005-08-22 16:01 博得一笑 阅读(178) | 评论 (0)编辑

Bode's Online Judge Core Engine Bate2 Publish

在线评测系统核心引擎新测试版本发布

  

版本:  0.9.9.2002
日期:  2008-11-27

更新:
1 提高大预期文件读写的速度
2 提高输出流的处理效率
修正:
1 修正了多处资源泄漏的情况


版本:  0.9.9.2001
日期:  2008-11-21

更新:
1 提高单个预期输入输出文件上限(单个输入文件无限制、单个输出文件10M)
2 提高打包文件效率,支持多个大文件打包
3 修改打包程序逻辑,不再支持旧有版本生成的打包文件!
4 解包程序在解包后生成用于再次打包的批处理文件
5 同时发布基于0.9.9.1005的0.9.9.1999,用于预期文件升级
6 提供2个批处理方便预期文件升级(从0.9.9.1X到0.9.9.2X)
修正:
1 修改了导致日志错乱的一个Bug

××××××××××××××××××××××××××××××××××××

点击直接下载Bode's Online Judge Core Engine Bate2

点击下载升级包(用于0.9.9.1X版本的升级)

××××××××××××××××××××××××××××××××××××

 

关于预期文件升级的说明

由于用0.9.9.1X之前的内核在打包大文件时存在错误,所以0.9.9.2000开始的内核重写了这块逻辑。
原有打包后的预期文件需要用旧版本解包后,再用新版本重新打包,才能使用。
为方便操作,所以提供了2个批处理来进行重新打包预期文件的工作。

在命令行窗口进入JudgeCoreEngine所在目录,并确认该目录下存在下列文件:
文件 版本要求 说明
Judge.dll 0.9.9.2000+ 新版核心
Judge.dll.old 0.9.9.1999 旧版核心
UnpackExpectFile.exe / 解包程序
ExpectFileCreate.exe / 打包程序
UpdateExpectFile.bat / 单个预期文件升级
UpdateAllExpectFile.bat / 全目录预期文件升级

使用命令:
UpdateExpectFile 预期文件名
来升级单个预期文件
UpdateAllExpectFile 待处理目录
来升级待处理目录下所有预期文件

预期文件升级成功后,会将原预期文件添加后缀.old后备份。

注意:
请在升级前,将原预期文件复制到其他目录中备份!
升级程序不能辨认预期文件版本,错误的升级(将已升级的文件再次升级等)可能导致不可预计的后果。
升级程序会在当前目录下自动创建并删除一些临时文件,请不要在升级过程中,手动删除。

 

××××××××××××××××××××××××××××××××××××

这是一套在Windows平台下Online Judge系统的评测子系统,可用于需要批量校验代码的运行结果的场合,比如Online Judge在线评测系统或自动化测试系统等。

如果你希望了解更多关于本系统的相关信息,请直接联系我。(MSN/Email: i@bodesmile.com)

由于包含编译器的版本过大,所以只提供含有.net平台编译器的版本下载,如果需要相应的编译器,可以直接联系我。

 

posted @ 2008-11-21 17:25 博得一笑 阅读(309) | 评论 (1)编辑
 

Bode's Online Judge Core Engine (Judge Engine Dynamic Link Library)

在线评测系统核心引擎

Beta Publish

测试版公布

 

一、         用途

Windows平台下Online Judge系统的评测子系统,一般用于校验待检测代码的运行结果。

二、         方法

传入预期文件,待检测代码和对应编译器,就可获得代码运行结果。

三、         特色

A.       完备的功能性设计:

1. Online Judge任务无须人工干预。自动编译源文件,自动运行客户程序,自动效验答案,自动回收资源。

2.支持编译器扩展,当前支持的编译器有

GCC: 3.4.5 20060117 (http://gcc.gnu.org/)

VC8: 8.00.50727.42 (Microsoft® Visual Studio® 2005)

CS8: 8.0.50727.1433 (Microsoft® Visual Studio® 2005)

FPC: intel/i386 2.2.0 (http://www.freepascal.org/)

VB8: 8.0.50727.1433 (Microsoft® Visual Studio® 2005)

JAVA: jdk1.5.0_15

将来更会加入更多的支持可能

3.支持使用多组测试数据一次性完成Judge过程。

4.支持Special Judge。(需自行提供Special Judge的源代码或可执行文件)

5.当用户程序占用的系统资源(如CPU时间、内存等)超过限制时,及时终止用户程序,发出相应的“超时(Time Limit Exceeded)”、“超内存(Memory Limit Exceeded)”、“输出文件过大(Output Limit Exceeded)”,并能给出实际的CPU、内存占用情况数据。

6.提供任务缓冲功能,即使有任务在执行,也能添加新的任务。

7.提供完善的日志功能,当Judge系统发生错误时可以迅速定位。

B.       良好的安全性保护

1.防止用户程序取得除预期输入文件之外服务器上的任何文件信息或配置信息。更不能对服务器上的文件进行修改删除等操作。

2.用户程序不会在服务器上创建任何文件。所有输出一律使用标准输出。

3.防止用户程序创建子进程。

4.防止用户程序调用系统API

5.防止用户程序无意中对于系统的破坏,如缓冲区溢出等。

6.防止其他可能危害系统安全的行为发生。

C.      超强的稳定性保证

1.系统可以长时间的连续、稳定、无错的工作。

2.无论Online Judge系统刚刚启动还是已经连续运行了几十个小时,同样的用户代码多次重复Judge,运行结果相同,运行参数(运行时间和内存占用)基本一致。

D.      极佳的效率性表现

1.系统具有较高的运行效率。

2.在相同配置的机器上,无论是在Online Judge系统中,还是单独运行,用户程序的执行时间,资源占用相当。

3.系统空闲时,占用极少的系统资源。

4.系统在空闲时接受到任务能够快速响应。

E.       开放的第三方接口

1.引擎可以方便的部署。

2.引擎可以方便的添加、移除第三方编辑器。(*测试版暂不支持)

3.预期文件、预期输出以及Special Judge的支援代码可以方便的组织。(*提供了对应的工具包)

4.提供方便的接口供第三方程序调用。

四、         历史

起源于大学时的毕业设计(Since 2006

现版本完成于20085

上海世界外国语中学在线评测系统使用了本引擎

五、         获取

如果你希望了解更多关于本系统的相关信息,请直接联系我。(MSN/Email: i@bodesmile.com)

由于包含了编译器的版本过大,所以只提供没有编译器的版本下载,如果需要相应的编译器,可以联系我,或自行下载(不推荐)。

本地下载 (只包含C#8、VB8编译器,需要先安装.net f2.0)

posted @ 2008-05-27 17:31 博得一笑 阅读(746) | 评论 (0)编辑

公司的网游《乌龙学院》开始封测,我这里也推广一下~

==================================
 
   由华东师范大学出版社和上海地创网络技术有限公司历时两年,联合精心研发的大型多人在线英语情境教学软件——乌龙学院,今日正式封测。

    乌龙学院是一款神奇的英语学习软件,她真正的将“玩”和“学”结合起来了。

    乌龙学院是以华东师范大学多位教育专家、外教的最新教研成果为基石,再由上海地创网络技术有限公司的数位资深多媒体技术和软件开发工程师潜心研发,以当今互联网领域最前沿的“大型多人在线角色扮演(MMORPG)”技术为平台,真正的实现了寓教于乐,她将掀起一轮新的学习革命。

    乌龙学院的官方网站地址是:www.wulongonline.com  全程媒体支持:沪江英语网
  
    从现在开始,您可以免费下载并注册。
  
    直接点击下载( http://220.170.79.50/wulong/WLA_1010_setup.exe

==================================















posted @ 2008-02-13 14:19 博得一笑 阅读(458) | 评论 (3)编辑
写下来,给自己点鞭策!!!

1、完善judge.dll,帮助SHNU Online Judge早日上线。
2、早日搞定我的论文,也是关于judge的,呵呵!
3、开始准备学思湖怪3的开发!!!

关于学思湖怪三的开发设想如下:
    相比之前的《博客笑》以及《学思湖怪文字生成器》,现在的《学思湖怪超COOL文字生成器II》极大的丰富了功能,已不单单只是一个文字特效的生成器了,而原有的程序架构显然不能很好的支持这种发展。而且用C#.net开发的《学思湖怪超COOL文字生成器II》在速度上偏慢,尤其是一些大篇文字的处理速度十分缓慢;利用.net1.1开发的界面也显得落伍。所以决定从底层开始重构,开发一套全新的“学思湖怪”!

历史版本进化

版本 学思湖怪文字生成器 学思湖怪超COOL文字生成器II 学思湖怪特效生成器3
发布时间 2006/01/15 第一版
2006/01/19 Update
2006/04/06 Beta1
2006/05/19 Beta2
2006/05/28 Beta3
2006/06/06 正式版
2006/06/24 Update
2006/07/04 Update
2006/12/24 Update
2007/05 预期Alpha
2007/06 预期Beta
2007/08 预期正式
开发代号 BlogSmile2006/SHNUBBS++ SuperBBS SpecialBB(Special Blog & BBS)
程序结构 单一文件 单一文件 + 资源文件 SBB SDK + 外壳界面 + 资源文件
内核语言 C#.NET C#.NET VC++2005
用户界面 C#.NET C#.NET C#2005
主要功能 文字渐变 文字渐变、字符画、隐匿画等 未定
支持语言 中文 中文 Unicode
Vista支持 未测试 未测试 计划支持
下载链接 本地下载 本地下载 暂无
posted @ 2007-03-22 15:32 博得一笑 阅读(89) | 评论 (0)编辑

刚才心血来潮一记,去维基上面百科了一下上海师范大学,居然还给我找到了

 

 

仔细一看,咦,校长的名字还能点击,不错不错

 

 

然后赶紧点进去捧捧场,结果发现……

 

 

吾没想法了。。。

真不知道是谁干的好事……

 

Wiki应该是人人可以编辑的,俺没空研究怎么编辑,那个会改的同志上去改改吧,太不雅观了

 

p.s. 维基百科可能很多人上不了,所以俺贴几张图来

posted @ 2007-02-07 16:33 博得一笑 阅读(77) | 评论 (0)编辑
关于进程间共享数据的研究。

昨天看了用共享节的方式共享静态数据,但是这个方法安全性不高,而且无法适用于需要动态分配大块内存的情况。

今天尝试了一下内存映射文件,发现可以很好的解决这个问题。

范例:
dll.h
class testFileMapping
{
private:
    HANDLE hMapping;
    LPVOID lpData; 
public:
    
bool init();

    
void set(int idx,int val);

    
int get(int idx);

    testFileMapping();
    
~testFileMapping();
}
;

MY_API HANDLE InitFileMapping();

MY_API 
void SetFileMapping(HANDLE hMap,int idx,int val);

MY_API 
int GetFileMapping(HANDLE hMap,int idx);

MY_API 
void CleanFileMapping(HANDLE hMap);
dll.cpp

bool testFileMapping::init()
{
    hMapping
=CreateFileMapping(INVALID_HANDLE_VALUE,NULL,PAGE_READWRITE,0,sizeof(int)*100,L"MYSHARE");   
    
if(hMapping==NULL)   
    
{   
        
return false;
    }
   
    lpData
=MapViewOfFile(hMapping,FILE_MAP_ALL_ACCESS,0,0,0);   
    
if(lpData==NULL)   
    
{   
        
return false
    }
   
}


void testFileMapping::set(int idx, int val)
{
    
int* tp = (int*)lpData;
    tp[idx] 
= val;
}


int testFileMapping::get(int idx)
{
    
int* tp = (int*)lpData;
    
return tp[idx];
}


testFileMapping::testFileMapping()
{
    hMapping 
= NULL;
    lpData 
= NULL;
}


testFileMapping::
~testFileMapping()
{
    
if(NULL != lpData)
    
{
        UnmapViewOfFile(lpData);
        lpData 
= NULL;
    }

    
if(NULL != hMapping)
    
{
        CloseHandle(hMapping);
        hMapping 
= NULL;
    }

}


MY_API HANDLE InitFileMapping()
{
    testFileMapping
* tp = new testFileMapping();
    tp
->init();
    
return tp;
}


MY_API 
void SetFileMapping(HANDLE hMap,int idx,int val)
{
    ((testFileMapping
*)hMap)->set(idx,val);
}


MY_API 
int GetFileMapping(HANDLE hMap,int idx)
{
    
return ((testFileMapping*)hMap)->get(idx);
}


MY_API 
void CleanFileMapping(HANDLE hMap)
{
    delete ((testFileMapping
*)hMap);
}



编译为dll后,在不同的程序中调用,就可以共享一块大小为100的int数组。因为没有加边界控制,所以检查了一下边界条件,发现其实可以访问的内存是大小为1024的int数组,也就是x86页面文件的大小4KB。当然这样的访问是不安全的,应该在程序中加以屏蔽。
posted @ 2007-01-31 14:52 博得一笑 阅读(157) | 评论 (0)编辑
    昨天深夜整理了一下Judge的需求和存在的bug,发现自己在Judge这个泥潭里已经越陷越深,很多问题都不是用一种查阅式的阅读所能解决,所以决定仔细的读一读《Windows核心编程》,来深刻领悟一下Windows相关的编程知识。

一:3.2.2 关闭内核对象

如果将一个无效句柄传递给CloseHandle,将会出现两种情况之一。如果进程运行正常,CloseHandle 返回FALSE ,而GetLastError 则返回ERROR_INVALID_HANDLE。如果进程正在排除错误,系统将通知调试程序,以便能排除它的错误。 
这个说明或许可以解释我Judge中现在存在的某个Bug:那个Bug仅在Debug模式下出现。

二:9.1等待函数

下面这个函数Wa i t F o r M u l t i p l e O b j e c t s与Wa i t F o r S i n g l e O b j e c t函数很相似,区别在于它允许调用线程同时查看若干个内核对象的已通知状态:


DWORD WaitForMultipleObjects(DWORD dwCount,
   CONST HANDLE
* phObjects, 
   BOOL fWaitAll, 
   DWORD dwMilliseconds);
d w C o u n t参数用于指明想要让函数查看的内核对象的数量。这个值必须在1与M A X I M U M _WA I T _ O B J E C T S(在Wi n d o w s头文件中定义为6 
4)之间。p h O b j e c t s参数是指向内核对象句柄的数组的指针。
可以以两种不同的方式来使用Wa i t F o r M u l t i p l e O b j e c t s函数。一种方式是让线程进入等待状态,直到指定内核对象中的任何一个变为已通知状态。另一种方式是让线程进入等待状态,直到所有指定的内核对象都变为已通知状态。f Wa i tAl l参数告诉该函数,你想要让它使用何种方式。如果为该参数传递T R U E,那么在所有对象变为已通知状态之前,该函数将不允许调用线程运行。

d w M i l l i s e c o n d s参数的作用与它在Wa i t F o r S i n g l e O b j e c t中的作用完全相同。如果在等待的时候规定的时间到了,那么该函数无论如何都会返回。同样,通常为该参数传递I N F I N I T E,但是在编写代码时应该小心,以避免出现死锁情况。

Wa i t F o r M u l t i p l e O b j e c t s函数的返回值告诉调用线程,为什么它会被重新调度。可能的返回值是WA I T _ FA I L E D和WA I T _ T I M E O U T,这两个值的作用是很清楚的。如果为f Wa i tAl l参数传递T R U E,同时所有对象均变为已通知状态,那么返回值是WA I T _ O B J E C T _ 
0。如果为f Wa i t A l l传递FA L S E,那么一旦任何一个对象变为已通知状态,该函数便返回。在这种情况下,你可能想要知道哪个对象变为已通知状态。返回值是WA I T _ O B J E C T _ 0与(WA I T _ O B J E C T _ 0 + d w C o u n t - 1)之间的一个值。换句话说,如果返回值不是WA I T _ T I M E O U T,也不是WA I T _ FA I L E D,那么应该从返回值中减去WA I T _ O B J E C T _ 0。产生的数字是作为第二个参数传递给Wa i t F o r M u l t i p l e O b j e c t s的句柄数组中的索引。该索引说明哪个对象变为已通知状态。下面是说明这一情况的一些示例代码:


HANDLE h[
3];
h[
0= hProcess1;
h[
1= hProcess2;
h[
2= hProcess3;
DWORD dw 
= WaitForMultipleObjects(3, h, FALSE, 5000);
switch(dw) 
{
   
case WAIT_FAILED:
      
// Bad call to function (invalid handle?)
      break;

   
case WAIT_TIMEOUT:
      
// None of the objects became signaled within 5000 milliseconds.
      break;

   
case WAIT_OBJECT_0 + 0:
      
// The process identified by h[0] (hProcess1) terminated.
      break;

   
case WAIT_OBJECT_0 + 1:
      
// The process identified by h[1] (hProcess2) terminated.
      break;

   
case WAIT_OBJECT_0 + 2:
      
// The process identified by h[2] (hProcess3) terminated.
      break;
}


如果为f Wa i t A l l参数传递FA L S E,Wa i t F o r M u l t i p l e O b j e c t s就从索引0开始向上对句柄数组进行扫描,同时已通知的第一个对象终止等待状态。这可能产生一些你不希望有的结果。例如,通过将3个进程句柄传递给该函数,你的线程就会等待3个子进程终止运行。如果数组中索引为0的进程终止运行,Wa i t F o r M u l t i p l e O b j e c t s就会返回。这时该线程就可以做它需要的任何事情,然后循环反复,等待另一个进程终止运行。如果该线程传递相同的3个句柄,该函数立即再次返回WA I T _ O B J E C T _ 
0。除非删除已经收到通知的句柄,否则代码就无法正确地运行。

用WaitForMultipleObjects改写我的Judge,使得中止线程时,可以让线程自己中止,而不是由其他线程杀。这样可以解决另一Bug。

三:17.1.2 在可执行文件或DLL的多个实例之间共享静态数据

我可以创建一个称为“S h a r e d”的节,它包含单个L O N G值,如下所示:

#pragma data_seg(
"Shared")
LONG g_lInstanceCount 
= 0;
#pragma data_seg()
当编译器对这个代码进行编译时,它创建一个新节,称为S h a r e d,并将它在编译指示后面看到的所有已经初始化(i n i t i a l i z e d)的数据变量放入这个新节中。在上面这个例子中,变量放入S h a r e d节中。该变量后面的#pragma dataseg()一行告诉编译器停止将已经初始化的变量放入S h a r e d节,并且开始将它们放回到默认数据节中。需要记住的是,编译器只将已经初始化的变量放入新节中。例如,如果我从前面的代码段中删除初始化变量(如下面的代码所示),那么编译器将把该变量放入S h a r e d节以外的节中。

#pragma data_seg(
"Shared")
LONG g_lInstanceCount;
#pragma data_seg()
Microsoft 的Visual C
++编译器提供了一个A l l o c a t e说明符,使你可以将未经初始化的数据放入你希望的任何节中。请看下面的代码:

// Create Shared section & have compiler place initialized data in it.
#pragma data_seg("Shared")

// Initialized, in Shared section
int a = 0;

// Uninitialized, not in Shared section
int b;

// Have compiler stop placing initialized data in Shared section.
#pragma data_seg()

// Initialized, in Shared section
__declspec(allocate("Shared")) int c = 0;

// Uninitialized, in Shared section
__declspec(allocate("Shared")) int d;

// Initialized, not in Shared section
int e = 0;

// Uninitialized, not in Shared section
int f;        
上面的注释清楚地指明了指定的变量将被放入哪一节。若要使A l l o c a t e声明的规则正确地起作用,那么首先必须创建节。如果删除前面这个代码中的第一行#pragma data_seg,上面的代码将不进行编译。
之所以将变量放入它们自己的节中,最常见的原因也许是要在. e x e或D L L文件的多个映像之间共享这些变量。按照默认设置, . e x e或D L L文件的每个映像都有它自己的一组变量。然而,可以将你想在该模块的所有映像之间共享的任何变量组合到它自己的节中去。当给变量分组时,系统并不为. e x e或D L L文件的每个映像创建新实例。

仅仅告诉编译器将某些变量放入它们自己的节中,是不足以实现对这些变量的共享的。还必须告诉链接程序,某个节中的变量是需要加以共享的。若要进行这项操作,可以使用链接程序的命令行上的
/ S E C T I O N开关:


/SECTION:name,attributes
在冒号的后面,放入你想要改变其属性的节的名字。在我们的例子中,我们想要改变S h a r e d节的属性。因此应该创建下面的链接程序开关:

/SECTION:Shared,RWS
在逗号的后面,我们设定了需要的属性。用R代表R E A D ,W代表W E I T E,E代表E X E C U T E,S代表S H A R E D。上面的开关用于指明位于S h a r e d节中的数据是可以读取、写入和共享的数据。如果想要改变多个节的属性,必须多次设定
/ S E C T I O N开关,也就是为你要改变属性的每个节设定一个/ S E C T I O N开关。
也可以使用下面的句法将链接程序开关嵌入你的源代码中:


#pragma comment(linker, 
"/SECTION:Shared,RWS")
这一行代码告诉编译器将上面的字符串嵌入名字为“ . d r e c t v e”的节。当链接程序将所有的. o b j模块组合在一起时,链接程序就要查看每个. o b j模块的“ . d r e c t v e”节,并且规定所有的字符串均作为命令行参数传递给该链接程序。我一直使用这种方法,因为它非常方便。如果将源代码文件移植到一个新项目中,不必记住在Visual C
++的Project Settings(项目设置)对话框中设置链接程序开关。
虽然可以创建共享节,但是,由于两个原因, M i c r o s o f t并不鼓励你使用共享节。第一,用这种方法共享内存有可能破坏系统的安全。第二,共享变量意味着一个应用程序中的错误可能影响另一个应用程序的运行,因为它没有办法防止某个应用程序将数据随机写入一个数据块。


用这个方法可以在两个进程间共享内存数据。
posted @ 2007-01-30 15:07 博得一笑 阅读(230) | 评论 (0)编辑
     摘要: 介绍MD5的论文:http://tools.ietf.org/html/rfc1321MD5_Global.h//MD5_Global.h-RSAREFtypesandconstants//POINTERdefinesagenericpointertypetypedefunsignedchar*POINTER;//UINT2definesatwobytewordtypedefunsignedsho... 阅读全文
posted @ 2007-01-29 18:00 博得一笑 阅读(816) | 评论 (2)编辑

讲个故事:

    话说有一天你中了500万,然后一群强盗天天在你家门口说你家里藏了只有强盗才能拥有的匕首,你说没有,他就报警。被强盗把刀架脖子上的警察进来查了你家,没有发现,但是把你家厨房里菜刀什么都贴上封条也不许你用了。强盗不甘心,继续说你有藏匕首,然后又叫来了傀儡警察……

    几个来回,你家所有的橱啊,柜啊都被贴上封条了。但是强盗还是说你家有匕首!

    终于有一天,强盗决定自己来找,它们从你几个邻居的窗户爬到了你家,囚禁了你全家,然后把你家小保姆报成你家户主,顺利上位。当然他们也没有找到那把匕首,但是他们开始帮你翻旧账,不幸发现你在前年夏天打死了几个蚊子,不仅打死了想吸你学的蚊子,而且把没有想吸你学的无辜蚊子也打死了。于是他们说你有反蚊子罪,在他们强盗集团年终分红前把你吊死了……然后你家就成了强盗们的小金库了……

    其实这样的小金库据说已经有不少了,上一家是住阿福汉路的笨辣灯,你是姨拉客路上的傻大姆,听说下一家是住潮鲜北路的……

 

 

    强盗说,这一天,我们终于伸张了正义!

 

大家都知道强盗、匕首、警察,邻居,蚊子和那个你都是指代什么的吧,我就不解释了……

posted @ 2006-12-30 20:11 博得一笑 阅读(44) | 评论 (0)编辑

看看下面这幅图片:

你看出什么玄机了吗?

如果没有,按Ctrl+A试试 ^o^

这就是学思湖怪超COOL文字生成器II黄金特别版中最新添加的隐匿画的神奇特效!


不需要高深的PS技巧。利用学思湖怪,只要短短4部就能帮助你把两张风马牛不相及的图片合成为一张暗藏天机的隐匿画!还不快来试试!!!


“学思湖怪”文字生成器:本地下载  (最后更新于2006-12-24)

如果无法运行,请下载微软.net运行库。
.NET Framework v1.1:   微软官方下载
 


——————————————————————————————————————

 

 使用方法:
1、在菜单中选择——〉更多效果——〉隐匿画
(如果菜单无法选择,请将程序底部的输出格式中选择“通用HTML”)

2、分别选择背景图片以及需要隐藏的图片。

隐匿画 功能利用人类视觉特点将两张图片合成为一张,通常情况下人们只能看到背景图案。

当在IE等浏览器中选中这个图片时,却会发现别有洞天!

*为了达到更好的效果,建议使用颜色比较杂的图片作为背景,而需要隐藏的图片则不宜颜色过于鲜艳,或者和背景反差过大。

 

你可以选中下面的图片试试看 ^o^

 

 

 3、在隐藏效果设置中进行细化修正。

在隐藏效果设置中:

你可以在(1)所示的区域里预览最后的合成效果,通过滑动滑杆可以改变隐藏图片的位置的大小。

在图中(2)的区域可以随时切换平时看到的图片,和当选中图片导致隐匿部分浮现时的图片样子。

如果你对两幅图片的合成效果不够满意,你可以在图中(3)的区域进行微调。一般来说:隐藏图片的越透明,则背景越清晰,但选中后的效果越差;反之,则可以较好的显示隐藏图但不能保证背景的清晰。

如果你需要隐藏的图片小于背景,周围可能留有难看的白边。这是你可以在图中(4)的位置来改变空白处的颜色。

重置按钮的作用是使图中(3)的区域中的滑杆恢复到初始状态。

 
4、预览效果如果感到不错,就可以保存啦!
posted @ 2006-12-24 17:40 博得一笑 阅读(981) | 评论 (4)编辑