汉字转换成图片(散分)

下一站轻风 2010-08-10 04:15:18
我输入一些汉字将它转换成一张图片?请高手指教怎么实现,最好有源代码...
...全文
243 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
aonate11o 2010-08-10
  • 打赏
  • 举报
回复
顶2,5楼
Alfredknox 2010-08-10
  • 打赏
  • 举报
回复
#region 生成汉字随机数
/// <summary>
/// 生成汉字随机数
/// </summary>
/// <param name="rd">随机数对象</param>
/// <param name="intLength">随机数的个数</param>
/// <returns></returns>
public static string setRegionCodeRand(Random rd, int intLength)
{
string strRegCodeRand = "";
Encoding encGB = Encoding.GetEncoding("gb2312");
string[] strBase = new string[16] { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };
object[] objBytes = new object[intLength];
for (int i = 0; i < intLength; i++)
{
int rnd1 = rd.Next(11, 14);
string str_rnd1 = strBase[rnd1].Trim();
rd = new Random(rnd1 * unchecked((int)DateTime.Now.Ticks) + i);
int rnd2;
if (rnd1 == 13)
{
rnd2 = rd.Next(0, 7);
}
else
{
rnd2 = rd.Next(0, 16);
}
string str_rnd2 = strBase[rnd2].Trim();
rd = new Random(rnd2 * unchecked((int)DateTime.Now.Ticks) + i);
int rnd3 = rd.Next(10, 16);
string str_rnd3 = strBase[rnd3].Trim();
rd = new Random(rnd3 * unchecked((int)DateTime.Now.Ticks) + i);
int rnd4;
if (rnd3 == 10)
{
rnd4 = rd.Next(1, 16);
}
else if (rnd3 == 15)
{
rnd4 = rd.Next(0, 15);
}
else
{
rnd4 = rd.Next(0, 16);
}
string str_rnd4 = strBase[rnd4].Trim();
byte byRand1 = Convert.ToByte(str_rnd1 + str_rnd2, 16);
byte byRand2 = Convert.ToByte(str_rnd3 + str_rnd4, 16);
byte[] byRands = new byte[] { byRand1, byRand2 };
objBytes.SetValue(byRands, i);
}
string[] strRegCode = new string[intLength];
for (int j = 0; j < intLength; j++)
{
strRegCode[j] = encGB.GetString((byte[])Convert.ChangeType(objBytes[j], typeof(byte[])));
strRegCodeRand += strRegCode[j].Trim();
}
return strRegCodeRand;
}
#endregion

public static void strRandMap(string saveImagePath)
{
//建立位图对象
Bitmap bitmap = new Bitmap(90, 30, PixelFormat.Format48bppRgb);
//根据上面创建的位图对象创建绘图面
Graphics graphics = Graphics.FromImage(bitmap);
//以指定的颜色填充矩形区
graphics.FillRectangle(new SolidBrush(Color.Red), new Rectangle(0, 0, 90, 30));
//创建字体对象
Font txtFont = new Font("gb2312", 12, FontStyle.Bold);
//创建RectangleF结构指定一个区域
RectangleF rectangleF = new RectangleF(0, 0, 90, 30);
//创建随机数对象
Random random = new Random();
//获取随机数
string strRand = setRegionCodeRand(random, 6);
//string strRand = setRegionCodeRand(random, 4);
//使用指定的颜色填充上面RectangleF结构指定的矩形区域
graphics.FillRectangle(new SolidBrush(Color.BurlyWood), rectangleF);
StringFormat sformat = new StringFormat();
sformat.Alignment = StringAlignment.Center;
sformat.LineAlignment = StringAlignment.Center;
//在上面填充的矩形区域中填充上面生成的随机数
graphics.DrawString(strRand, txtFont, new SolidBrush(Color.Blue), rectangleF, sformat);

//把创建的位图保存到指定的路径
bitmap.Save(HttpContext.Current.Server.MapPath("") + saveImagePath, ImageFormat.Gif);
}
村长_乐 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jrl5365 的回复:]
C# code
Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 8.5)), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random……
[/Quote]
up++
Love_Air523824 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 jrl5365 的回复:]
C# code
Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 8.5)), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random……
[/Quote]
up!!!!
jrl5365 2010-08-10
  • 打赏
  • 举报
回复
Bitmap image = new Bitmap((int)Math.Ceiling((checkCode.Length * 8.5)), 22);
Graphics g = Graphics.FromImage(image);
try
{
//生成随机生成器
Random random = new Random();
//清空图片背景色
g.Clear(Color.White);
//Font font = new System.Drawing.Font("宋体", 10, (System.Drawing.FontStyle.Bold | System.Drawing.FontStyle.Italic));
//System.Drawing.Drawing2D.LinearGradientBrush brush = new System.Drawing.Drawing2D.LinearGradientBrush(new Rectangle(0, 0, image.Width, image.Height), Color.Black, Color.Black,90, true);
//g.DrawString(checkCode, font, brush, 2, 2);

g.FillRectangle(new System.Drawing.SolidBrush(Color.Black), 0, 0, image.Width, 20);
g.Clear(Color.White);
g.DrawString(checkCode, new Font("宋体", 10, FontStyle.Bold), Brushes.Black, new PointF(5, 5));
MemoryStream ms = new MemoryStream();
image.Save(ms, System.Drawing.Imaging.ImageFormat.Gif);
Response.ClearContent();
Response.ContentType = "image/Gif";
Response.BinaryWrite(ms.ToArray());
}
finally
{
g.Dispose();
image.Dispose();
}
jrl5365 2010-08-10
  • 打赏
  • 举报
回复
就类似验证码一样,输出好了
此文件是MyFll.fll文件不可分割的一部分,包含对MyFll函数库全部说明及示例。 MyFll是专为Microsoft Visual FoxPro设计的扩展库,部分函数来自任明汉(RMH myF1论坛)前辈提供的myDll代码翻译而成,由于很多功能利用VFP处理比较烦锁,或无法实现,使用此库可有效解决VFP的弱项。部分与Win32Api同名的函数,是Win32API的封装。部分函数取自网上开源算法,在相关函数中均有注明。 此源代码使用VC6 sp6开发,采用VFP9 Sp2的库文件,理论上可以应用于VFP6 7 8 9版本。 此库在第一次打开时自动添加智能感应功能已关闭。请在打开后,使用FllAddFoxCode()向智能感应库添加所有的函数原型(需要VFP7以上),此库存所有函数使用VFP推荐的命名规则,一般可以根据函数名和知能感应的提示参数来推测参数及返回值。 开发环境可以使用FllHelp()函数来检查函数信息: 取得此版本函数个数:FllHelp() 取得第x个函数的信息:?FllHelp(x) 显示提示信息:?FllHelp(x,.T.) 显示指定函数的信息:FllHelp("SendMessage",.T.) 显示Fll的版:?FllGetVersion() 添加智能感应代码:FllAddFoxCode() 版本信息:由于不定期更新,请及时核对版本(右键属性),版本为X.X.X.X,第一位为主版本号,第二位为函数个数,第三位为发布的年份,第四位为日期。当前版本为:1.179.9.811 版权:你可以自由使用、散发此函数库及此帮助,包括应用于你的商业软件中。在转发时应注意帮助文件于函数库和帮助同在。不得对软件进行破解、反编译等破性或逆向工程。MyFll作者不承担可能由于技术原因或失误给你带来的错误或损失。发现错误可以与作者取得联系共同改进。 感谢:我的帮助论坛http://www.myf1.net/bbs 梅子论坛 http://www.meizvfp.com/bbs 感谢:各位为Myfll做测试、编写帮助的热心网友。 作者:木瓜 ljyit@163.com 函数列表: 硬件相关函数: GetDiskSerial        读取指定硬盘的序列号 GetCpuId           读取CPU的序列号 GetMAC            读取网卡的MAC地址 GetVolumeNumber       读取指写磁盘的卷标 IsDiskInDrive        检查指定磁盘是否就绪 GetPort           读取系统的串口、并口 ComOpen           打开串口 ComWrite           向串口输出信息 ComRead            从串口读取信息 ComClose           关闭串口 GetGUID            获取全球唯一ID AEthernet          枚举网卡的所有信息 加密解密函数: MD5File           计算一个文件的MD5效验和 MD5String          计算一个字符串的MD5效验和 CRC32File          计算一个文件的CRC32效验和 CRC32String         计算一个字符串的CRC32效验和 des             采用DES算法加密或解密一个字符串,长度为8位 des16            采用DES算法加密或解密一个字符串,长度为16位 des24            采用DES算法加密或解密一个字符串,长度为24位 EnDeString          双向加密解密字符串的函数 Encrypt           双向加密解密字符串 RSACalc           RSA计算函数 RSAGen            生成随机RSA密钥函数 RSACmp            比较两个十六进制值是否相等 URLEncode          URL编码 URLDecode          URL解码 QPEncode           Quoted-Printable QP编码 QPDecode           Quoted-Printable QP解码 压缩解压函数: Zip              压缩文件 UnZip             解压文件 UnZipFile           解压单个文件           ZipInfo            测试一个文件是否在压缩文件中存在 ZipFileToStr         将压缩文件中的文件解压到变量 ZipAFile           将zip文件中的文件信息生成的数组 CompressString        压缩一个字符串 DeCompressString       解压字符串 数据库: CursorToStr         将Cursor生成变量 ChangesToStr         将Cursor的变动情况生成变量         StrToCursor         将变量还原为Cursor AppendFromStr        将变量中的表追加到指定表中 ACursorList         将变量中的表信息生成数组 ACursorFields        将变量中的指定表的字段信息生成数组 CRC32Record         计算一条记录的CRC32值 SQLCallBack         SQL回调函数载入 SQLCallReset         SQL回调函数卸载 PackMDB           压缩修复Access数据库 ReadMemo           读取vfp中大于16M的备注字段 网络相关函数: DownFile           从internet上下载文件到本地 DownFileX           线程方式从网上下载一个文件 HttpGetFileSize       读取internet上的文件大小 HttpPostData         向http服务器Post数据 HttpOpen           打开一个Internet句柄 HttpAddParms         为Http句柄添加一个参数 HttpSend           发送Http句柄中的Post数据 HttpClose          关闭Http句柄 FtpDownFile          从FTP服务器下载文件 FtpUploadFile        向FTP服务器上传文件 FtpConnect          连接FTP服务器 FtpDisconnect        断开FTP服务器连接 FtpAFile          枚举Ftp中的所有文件 FtpCreateDir        在FTP服务器上创建一个文件夹         FtpSetCurrentDir      设置当前的文件夹 FtpDeleteDir        删除FTP服务器上的文件夹 FtpDelFile         删除FTP服务器上的文件 FtpRename          重命名FTP服务器上的文件 FtpFOpen          打开FTP服务器上的文件 FtpFClose         关闭FTP服务器上的文件 FtpFRead          读取FTP服务器上的文件 FtpFWrite          写入FTP服务器上的文件 FtpSetPasv          设置FTP被动工作模式 ShareAdd           在局域网共享文件夹 ShareDel           删除共享文件夹的共享 ShareMapDrive         映射网络驱动器 ShareDelDrive         删除映射的网络驱动器 GetLocalIP          读取本机IP DomainToIP          转换域名为IP地址 DialUp            建立拨号连接 DialDown           断开拨号连接 GetSqlServer         列出所有网络上的SQL Server IpToMAC           根据IP得到MAC地址 邮件函数: SmtpCreate          创建一个SMTP发送邮件的句柄 SmtpNewMail         在内存中创建邮件内容,等待发送 SmtpSend           发送邮件 SmtpGetLastError       检测邮件最后的错误 Pop3Create          创建一个POP3接收邮件的句柄 Pop3Close          关闭句柄 Pop3AMailList        枚举POP3服务器上的邮件数量 Pop3DeleteMail        删除POP3邮件服务器上的邮件 Pop3GetMail         下载一封邮件 Pop3GetMailHeader      下载邮件头 Pop3DeleteMail        删除服务器上的邮件 打印相关函数: PaperAdd           添加自定义纸张并返回ID PaperDel           删除自定义纸张 PaperInfo          读取所有纸张信息或指定纸张信息 APaper            枚举所有纸张生成数组 GetDefaultPrinter      取得默认打印机的名称 SetDefaultPrinter      设置默认打印机 PrinterOpen         启用一个打印任务 PrinterOutPage        打印页对像 PrinterClose         结束打印 常用转换函数: ToPY             生成指写字符串的拼音首字 NToC             数字转人民币大写 hzbh             计算指定字符串的汉字笔划 StringToDword        将高底位存放的字符串,转换为字符型 DwordToString        将整型数值转换为字符型数值 NumConver          进制转换函数,能够将一个数字转换为2至36进制的字符串 ConverNum           将指定进制的字符串转换为数值型 GB2312ToBIG5         简体转繁体 BIG5ToGB2312         繁体转简体 FormToBmp          将表单保存为BMP图片 RectToBmp           指定屏幕区域保存为bmp图片 StrReverse          指定屏幕区域保存为bmp图片 ImageConver         转换图片格式 FTrim            删除字符串中除指定字符以外的字符 Thumbnail          缩放图片 注册表读写函数: regRead           读取注册表中的设置 regWrite           向注册表中写入设置 regDelKey          删除注册表中的分支 regDelValue         删除注册表中的设置 ini文件读写函数: iniRead           从ini文件中读取设置 iniWrite           向ini文件中写入一个设置 iniSet            设置默认的数据段和ini文件 iniSetSection        设置默认的数据段 iniSetFileName        设置默认的ini文件 系统托盘 SysTrayAdd          向系统托盘添加一个图标 SysTrayEdit         修改系统托盘的图标 SysTrayDel          删除系统托盘中的图标 HotKeyAdd          向系统注册一个热键 HotKeyDel          删除向系统注册的热键 SysTrayShowMessage      显示托盘消息 文件操作 CopyFiles          复制文件 MoveFiles          移动文件 DeleteFiles         删除文件 CreateShortcut        创建快捷方式 GetIcon           释放exe或dll中的图标 其它: SetVFPEvents         设置MYFLL内部函数回调功能 SetDateTime         设置Windows系统时间 ChangEres          更改屏幕的分辨率 idleLoad           开始加载空闲检测 idleSeconds         读取系统空闲时间 idleUnload          卸载空闲检测 KillApp           终止指定进程 KillAllApp          终止所有进程,但排除指定标题的进程 KillProcessByName      根据程序文件名杀死一个进程 FindAllFile         查找指定文件夹下的所有文件 IsNum            检测函数是否是数字 CheckProcess         检测主程序是否重复运行 ProcLoad            载入一个VFP函数,取得函数地址 ProcUnload          卸载函数 MemRead           读取指定地址的内存 MemWrite           写入指写内存 PushError          系统错误处理压栈 PopError           系统错误处理出栈 Format            格式化输出字符串(类C语言) CreateLink          创建文件关联 DesktopHide         隐藏桌面 SystemKeySet         禁用系统键 RegisterFile         注册文件名解除文件注册 封装过的Win32 API函数: FindWindow          查找指定窗口的句柄 SendMessage         向指写窗口发送指定消息 PostMessage         将消息投递到指定句柄的消息队列 ShowWindow          显示指定窗口 ShowWindowAsync       显示指定窗口 SetWindowLong        设置窗口的扩展样式 SetLayeredWindowAttributes  设置窗口效果 SetForegroundWindow     激活指定窗口使这成为最前面的窗口 ShellExecute         调用系统关联,打开一个文件 ShellExecWait        调用一个程序,并等待执行结束 SuspendThread        暂停一个线程 ResumeThread         恢复一个线程 Beep             使电脑内喇叭发出beep声 ExitWindowsEx        退出Windows Sleep            程序挂起nMilliseconds毫秒 ExitProcess         终止当前进程 GetLastError         返回最后的错误号码 SetParent          设置窗口的父窗口 UpdateWindow         更新窗口
计算机应用技术 实用手册 Xnllz 2011.7.29 目录 第一章COMS的设置 1 1.STANDARD CMOS SETUP(标准CMOS设定)用来设定日期、时间、软硬盘规格、工作类类型。 3 2.BIOS能功设定 5 3.Advanced Chipset Features(芯片组设定) 6 4.Integrated Peripherals(集成设备设定) 8 5.PNP/PCI Configurations 即插即用与PCI设备设定,一般为默认。 9 6.POwer Management Features(电源管理模式设定) 9 7.Frequency/voltage control 超频控制 11 8.LOAD FAIL——Save defaults 恢复出厂设置 11 第二章 分区软件的应用 12 1.PQ魔术分区:首先用GHOST安装光盘引导起计算机,选择PQ分区进入工作界面。 12 2.DM分区的应用:首先用GHOST安装光盘引导起计算机,选择DM分区进入工作界面。 16 第三章 CMOS密码的清出与系统密码的清出 23 1、跳线短接法 23 2、下电池短接 23 二.系统密码清除,把CMOS第一引导设为光驱引导,用GHOST安装光盘起动,选择系统登录密码破解按回车进入 24 第四章 局域网组建 24 1.常用网络命令: 25 2.网线的制作: 27 3.局域IP地址配置: 27 4.采用TP-LINK路由器连接上网: 27 第五章 系统常用命令及格式转换 30 1.Msconfig 系统的关闭起动项命 30 2.Dxdiag系统信息查看命令 30 3.Gpedit.msc计算机管理命令 31 4.格式之间的转换,使用winavi进行转换 32 5.常用的快捷键,使用快捷可以帮助我节约时间。 33 6.开机常按F8可以进入安全模式或是带DOS命令的安全模式。 33 第六章GHOST的备份与恢复 34 第七章 综合应用 44 一.文件的后缀名, *号任意的文件名 44 二.内存出错或是系统出错引起蓝屏 48 三.本机病毒删除不了,解决方法是把硬盘拆下来换到别台主机上进行杀毒,要求挂上去的主机要采用正版杀毒软件,升过级的才可以 49 四.识别常见病毒,病毒一般是以隐藏形式藏匿在计算机的文件中,要把文件的隐藏属性打开。每一盘都有工具这个选项,如下图所示: 49 五.常用DOS命令 60 第一章COMS的设置 开机画面现在有两种,一种为AMI公司开发的,一种为Phoenix-award两家公司合并共同开发的;下面这张图为Phoenix-award开机自画面: Phoenix-award workstation BIOS V6.00PC,An Energy star Ally copyright(c) 1984-2003,Phoenix Technologies,LTD 这句英语的意思是:Phoenix-award这两家COMS芯片开发公司合并后共同开发第6号BIOS版本,采用美国电工电器省电标准,Phoenix技术有限公司,版权1984-2003 RS482-M 03/16/2006 FOR Tongfang 清华同方电脑公司选用的BIOS芯片代号为RS482-M 日期为2006年3月16号 Main Processor : AMD Athlon™64 x2 dual core Processor 3600+ CPU为AMD3600+ 速龙64位双核酷睿技术 Memory Testing: 524288k ok with 32M shared memory 内存为512兆 32兆的二级缓存 IDE Channel 0 master : None IDE Channel 0 Slave : None IDE Channel 1 master : HL-DT-STDVD-ROM GDR8164B 0L06 IDE Channel 1 Slave : None IDE Channel 2 master : WDC WD800BD-00LRA0 06.01D06 IDE Channel 2 Slave : None IDE 1号接口检测到光驱,IDE 2号接口检测到希捷硬盘为80GB,其它为NONE表示检测没有设备连接到接口上。 Warning!! Now system is in safe mode. Please re-setting CPU frequency in CMOS setup. 警告:现在系统处在安全模式,从新进入CMOS 进行设置。 CMOS checksun error-del anlts loaded 或是CMOS检查出错。 出现上面两种错是CMOS电池没电了.解决方法:打开机箱,把主板上的一节纽扣电池取出,换上一节新的既可,或是CMOS被放电了,从新进入CMOS设置时间保存并退出就可解决此问题。 Press F1 tocontinue ,DEL to enter SETUP 按F1可以继续启动,按DEL进入CMOS 下面这张图为AMI公司开发的BIOS界面: AMI BIOS (C) 2006 American megatrends,INC.ASUS P5B-Delusxe ACPI BIOS Revision 0507 CPU: INTEL(R) CORE(TM)2 CPU 6400 @ 2.13GHz Speed :4.01GHz Count :2 AMI公司2006年开发的BIOS版本信息,华硕主板采用的CMOS并修正了 0507芯片,CPU 为 英特尔 酷睿技术双核 型号为6400 主频为2.13GHz,总共处理速度为4.01GHz Press DEL TO run Setup 按del进入CMOS Press f8 for bbs popup 按F8弹出BBS网页 Press ALT+F2 to boot from system Recovery 按ALT+F2进入根录进行设置 PC2-4300 Dual Channel interleaved 双通道技术 Initializing usb Controllers..done 装载USB控制 2048MB OK 内存为2GB 开启计算机或重新启动计算机后,听见自检通过的声音后,按 “Del”键就可以进入CMOS的设置界面;要注意的是,如果按得太晚,计算机将会启动系统,这时只有重新启动计算机了。大家可在开机后立刻按DEL键直到进入CMOS。进入后,你可以用方向键移动光标选择CMOS设置界面上的选项,然后按Enter进入副选单,用ESC键来返回上一级菜单,用PAGE UP和PAGE DOWN键来选择具体选项,F10键保留并退出BIOS设置。 1.STANDARD CMOS SETUP(标准CMOS设定)用来设定日期、时间、软硬盘规格、工作类类型。 列表中存在PRIMARY MASTER 第一组IDE主设备;PRIMARY SLAVE 第一组IDE从设备;SECONDARY MASTER 第二组IDE主设备;SECONDARY SLAVE 第二组IDE从设备。这里的IDE设备包括了IDE硬盘和IDE光驱,第一、第二组设备是指主板上的第一、第二根IDE数据线,一般来说靠近芯片的是第一组IDE设备,而主设备、从设备是指在一条IDE数据线上接的两个设备,大家知道每根数据线上可以接两个不同的设备,主、从设备可以通过硬盘或者光驱的后部跳线来调整。 后面是IDE设备的类型和硬件参数,TYPE用来说明硬盘设备的类型,我们可以选择AUTO、USER、NONE的工作模式,AUTO是由系统自己检测硬盘类型,在系统中存储了1-45类硬盘参数,在使用该设置值时不必再设置其它参数;如果我们使用的硬盘是预定义以外的,那么就应该设置硬盘类型为USER,然后输入硬盘的实际参数(这些参数一般在硬盘的表面标签上);如果没有安装IDE设备,我们可以选择NONE参数,这样可以加快系统的启动速度,在一些特殊操作中,我们也可以通过这样来屏蔽系统对某些硬盘的自动检查。 图中2部分是DRIVE A和DRIVE B软驱设置,如果没有A或B驱动器,那么就设置NONE驱动器。我们可以在这里选择我们的软驱类型,当然了绝大部分情况中我们不必修改这个设置。 右下方还有系统内存的参数:BASE MEMORY:基本内存;extended 扩展内存;other 其它内存;total MEMORY 全部内存。 2.BIOS能功设定 在用光盘安装系统时就需要对此部分进设置,第一驱动改为光驱引导(First Boot Device),否则光驱不会引导装系统。 Quick Power On Self Test(快速启动选择): 当设定为[Enabled](启动)时,这个项目在系统电源开启之后,可加速POST(Power On Self Test)的程序。BIOS会在POST过程当中缩短或是跳过一些检查项目,从而加速启动等待的时间! Hard Disk Boot Priority(硬盘引导顺序): 此项目可选择硬盘开机的优先级,按下的按键,你可以进入它的子选单,它会显示出已侦测到可以让您选择开机顺序的硬盘,以用来启动系统。当然,这个选项要在你安装了两块或者两块以上的系统才能选择! HDD Change Message: 当设定为[Enabled](启动)时,如果你的系统中所安装的硬盘有更动,在POST的开机过程中,屏幕会出现一道提示讯息。 First Boot Device / Second Boot Device / Third Boot Device / Boot Other Device: 在[First Boot Device]、[Second Boot Device]以及[Third Boot Device]的项目当中选择要做为第一、第二以及第三顺序开机的装置。BIOS将会依据你所选择的开机装置,依照顺序来启动操作系统!其中可以选择的设备根据你安装的设备而定! BOOT UP FLOPPY SEEK(开机时是否自动检测软驱); BOOT UP NUMLOCK STATUS(开机时小键盘区情况设定) SECURITY OPTION(检测密码方式)如设定为SETUP,则每次打开机器时屏幕均会提示输入口令(普通用户口令或超级用户口令,普通用户无权修改BIOS设置),不知道口令则无法使用机器;如设定为SYSTEM则只有在用户想进入BIOS设置时才提示用户输入超级用户口令。 3.Advanced Chipset Features(芯片组设定) 芯片组设定也是Bios设置里面的一个重点设置,这里就详细说明一下! DRAM Timing Selectable(内存参数设置选项): 这个项目会视内存模块的不同,为接下来四个项目设定最佳的计时方式。默认值为「By SPD」。这个默认值会读取SPD (Serial Presence Detect) 装置的内容,并且依据SPD内容设定这四个项目。内存模块上的EEPROM (只读存储器) 储存有关模块的重要参数信息,例如内存类型、大小、速度、电压接口及模块储存区域。 CAS Latency Time: 这个项目可控制DRAM读取指令与数据成为真正可用的时间之间的延迟时间。较低的CAS周期能减少内存的潜伏周期以提高内存的工作效率。因此只要能够稳定运行操作系统,我们应当尽量把CAS参数调低,从而提高内存的运行速度。反过来,如果内存运行不稳定,可以将此参数设大,以提高内存稳定性。 Act to Precharge Delay: 这个项目控制了给DRAM参数使用之DRAM频率的数值。同理,数值小性能高,但是对内存的质量也要求严格! DRAM RAS# to CAS# Delay: 这个项目可控制DRAM作用指令与读取/写入指令之间的延迟时间,有2,3,4几种选择。数值越小,性能越好。 DRAM RAS# Precharge: 这个项目是用来控制当预充电(precharge)指令送到DRAM之后,频率等待启动的等待时间。预充电参数越小则内存读写速度就越快。 以上的内存参数设置一般可以不动!让默认的就可以了,但是超频玩者是肯定不会放过任何可以提高性能的东西的,所以如果你想在这里让你的电脑提升一点性能的话,就必须慢慢试验,选择一个适当的参数才能让你的计算机达到性能和稳定的最佳状态! Video BIOS Cacheable(影像快取): 如同系统BIOS的快取功能,启用影像BIOS的快取功能将允许存取影像BIOS自C0000H到C7FFFH具有快取功能,如果快取控制器也被启用。高速缓存的大小愈大,影像效能将会更快速。 Memory Hole At 15M-16M(扩展卡内存分配): 当设定为[Enabled](启动)时,将会有15M-16M的内存空间预留给特别需要此设定的ISA扩充卡。这会使得内存有15 MB以上的空间无法让系统使用,这个项目请使用系统的默认值。 Delay Prior to Thermal(激活延时设置): 此项目可用来选在择温探(Thermal)装置动作之前的延迟时间。 AGP Aperture Size(AGP卡槽内存分配设置): 这个项目可指定让AGP装置来使用的系统内存大小,这取用大小是PCI内存地址范围的一部份,可分配给图形内存的空间。 Init Display First: 这个项目可选择当系统开机时先行对AGP或是PCI插槽来做初始化的动作。 [AGP]:当系统开机时,它将会先对AGP插槽来做初始化的动作。 [PCI Slot]:当系统开机时,它将会先对PCI插槽来做初始化的动作。 AGP Data Transfer Rate(AGP速度设置): 这个项目允许你选择AGP装置的数据传输速率,更高的数据传输速率可对您的系统提供更快以及更佳的图形处理能力。请确认您的显示卡可以支持您所选择的模式,一般用默认的就可以。 4.Integrated Peripherals(集成设备设定) 这个是管理计算机的主板集成设备和端口的选项,具体项目因为主板不同,所以其中的设置会有所不同。 OnChip IDE Device: 主板IDE驱动接口控制 OnChip PCI Device 主板PCI接口控制 OnChip USB Controller: 这个选项开启或关闭USB端口。 USB 2.0 Controller: 这个选项开启或关闭USB 2.端口传输模式。 USB Keyboard Support Via: 此项目允许您去选择 [ENABLED],以让您在DOS环境下可以使用USB键盘,或是选择 [OS] 以在OS环境下使用。在默认情况下是关闭的即:[DISABLED],只有打开在DOS下才可以用。 USB Mouse Support Via: 此项目允许您去选择 [ENABLED],以让您在DOS环境下可以使用USB鼠标,或是选择 [OS] 以在OS环境下使用。在默认情况下是关闭的即:[DISABLED],只有打开在DOS下才可以用。 AC97 Audio 这个选项开启或关闭集成声卡设备。有时候在系统的任务栏你见不到小喇叭有可能在这里被关闭了,即:[DISABLED],遇到这种情况可从新进入COMS把此项打开即可,即:[ENABLED]。 SATA MODE 这个项目是对SATA接口控制,一般为RAID模式,如接上SATA接口的光驱就可改为IDE模式,这样才能正常工作。 VIA ONBOARD LAN主板网卡接口控制,一般为默认即可。 5.PNP/PCI Configurations 即插即用与PCI设备设定,一般为默认。 Resources Controlled By: 这个项目可对所有的开机以及即插即用之兼容装置进行组态的动作。 [Auto]: 系统将会自动地侦测所有的设定。 [Manual]: 在「IRQ Resources」选单中选择特定的IRQ资源。 IRQ Resources: 这个项目可设定各别系统的中断为[PCI Device]或是[Reserved]中之任一者。 PCI/VGA Palette Snoop: 这个项目可决定哪种MPEG ISA/VESA VGA卡可以(或是不能)与PCI/VGA一起运作。 [Enabled]: MPEG ISA/VESA VGA卡可以与PCI/VGA一起运作。 [Disabled]: MPEG ISA/VESA VGA卡不能与PCI/VGA一起运作。 6.POwer Management Features(电源管理模式设定) 选择APM Configuration进入设置界面 选择Hardware monltor进入设置界面 7.Frequency/voltage control 超频控制 超频的前提是主板要支持超频功能,并且CPU的风扇要换散热好的,否则就会烧坏CPU或是主板,此功能要慎用。 CPU HOST CLOCK CONTROL [DISABLED] 一般进入后是关闭的,把DISABLED改为ENABLED就可以改变主频的大小了,即:CPU HOST FREQUENCY(MHZ)[166]把中括号里的数字改变超就可以超频了。频即改变CPU主频的大小。 PCI/AGP Frequency(MHZ)[AUTO] PCI设备与显卡频率的控制。一般为自动。 DRAM COLCK (MHZ)[AUTO] 动态随机读取时钟信号,默认为自动。 CPU OVERVOLTAGE CONTROL [AUTO] CPU的额外工作电压,默认为自动。 AGP OVERVOLTAGE CONTROL [AUTO] 显卡的额外工作电压,默认为自动。 DIMM OVERVOLTAGE CONTROL [AUTO] 双列直插内存模块的额外工作电压,默认为自动。 8.LOAD FAIL——Save defaults 恢复出厂设置 在设置一些项后,又不清楚的情况下可,用此项恢复出厂设置恢复到原来出厂的样子。 9.LOAD Optimized defaults 优化设置。 10.SET superisor password CMOS密码设置 11.SET user password 用户密码设置 12.SAVE&EXIT SETUP 保存并退出 每次出了更改设置后都要保存,这样才起作用。 13.QUIT WITHOUT SAVING(Y/N) 退出不保存。 注意:在从起后,显示器上出现 Floppy drive A : ERROR 为A盘引导出错,要求按F1继续;此时进入CMOS把DRIVE A:改为 NONE 即可。如果出现:disk boot failure,insert system disk and press enter 种这信息为找不到硬盘或是系统坏掉了;解决办法:先从新装一次系统,如果从装系统问题还是一样,把机箱打开把硬盘的接口从接一个看看,看看线是否接好,是否有松动的地方,如果还是出现的话,把硬盘换到另外一台机子上试一试,这样做的目的是查看硬盘是不是好的,如果以上方法都试过后仍然出现错误提示,那么有很大的可能是硬盘坏了,只有换硬盘了。 第二章 分区软件的应用 现在主流的分区软件有三种,分别是PQ魔术分区、DM分区、FDISK分区;在这里我主要讲PQ和DM分区,FDISK分区在教材上有,在这里我就不多说了。 1.PQ魔术分区:首先用GHOST安装光盘引导起计算机,选择PQ分区进入工作界面。 没有分过区的硬盘在第一次分区是灰色的,如上图所示。在未分配上右击鼠标,点击建立,出现下图所,创建主要分区。 如果装2000版本的系统就采用NTFS格式,大小这一栏要根据硬盘的大小按一定比例划分,如是80G的硬盘,主分区也就是我们所常说的C盘最好分10000MB即10GB。 如果装XP版本的系统就采用FAT32格式,大小这一栏要根据硬盘的大小按一定比例划分 主分区建好后,剩下的硬盘空间全部分为逻辑分区,格式这一栏如果装2000版本的系统就采用NTFS格式,如果装XP版本的系统就采用FAT32格式。大小分配好后点确定。 把主分区设为设定为作用,相当于FDISK分区中的激活C盘。如果不把C盘激活,系统就装不上,出错信息为:OS ERROR! 在每个分区上点鼠标右键,先择格式化,最后确定。 从新启动计算机就可以装系统了。 2.DM分区的应用:首先用GHOST安装光盘引导起计算机,选择DM分区进入工作界面。 选择“(A)dvanced Options”进入二级菜单,然后选择“(A)dvanced Disk Installation”进行分区的工作。 此主题相关图片如下: 接着会显示硬盘的列表,直接回车即可 此主题相关图片如下: 如果你有多个硬盘,回车后会让你选择需要对哪个硬盘进行分区的工作。 此主题相关图片如下: 然后是分区格式的选择,一般来说我们选择FAT32的分区格式 此主题相关图片如下: 接下来是一个确认是否使用FAT32的窗口,这要说明的是FAT32跟DOS存在兼容性,也就是说在DOS下无法使用FAT32。 此主题相关图片如下: 这是一个进行分区大小的选择,DM提供了一些自动的分区方式让你选择,如果你需要按照自己的意愿进行分区,请选择“OPTION (C) Define your own”。 此主题相关图片如下: 接着就会让你输入分区的大小: 此主题相关图片如下: 首先输入的主分区的大小,然后输入其它分区的大小。这个工作是不断进行的,直到你硬盘所有的容量都被划分。 此主题相关图片如下: 完成分区数值的设定,会显示最后分区详细的结果。此时你如果对分区不满意,还可以通过下面一些提示的按键进行调整。例如“DEL”键删除分区,“N”键建立新的分区。 此主题相关图片如下: 设定完成后要选择“Save and Continue”保存设置的结果,此时会出现提示窗口,再次确认你的设置,如果确定按“Alt+C”继续,否则按任意键回到主菜单。 此主题相关图片如下: 接下来是提示窗口,询问你是否进行快速格式化,除非你的硬盘有问题,建议选择“(Y)ES”。 此主题相关图片如下: 接着还是一个询问的窗口,询问你分区是否按照默认的簇进行,选择“(Y)ES”。 此主题相关图片如下: 最后出现是最终确认的窗口,选择确认即可开始分区的工作。 此主题相关图片如下: 此时DM就开始分区的工作,速度很快,一会儿就可以完成,当然在这个过程中你要保证系统不要断电。 此主题相关图片如下: 完成分区工作会出现一个提示窗口,不用理会按任意键继续。 此主题相关图片如下: 面就会出现让你重新启动的提示 此主题相关图片如下: 这样就完成了硬盘分区工作.按CTRL+ALT+DEL重新起动,装系统。 第三章 CMOS密码的清出与系统密码的清出 一.在忘记系统密码和计算机不能启动的处理时经常提到的一个操作就是"CMOS放电"。 放电前一定要关闭计算机,并且拔掉机箱电源。 CMOS放电方法一般有2种 1、跳线短接法 主板后备电池的附近一般都有一个在跳线,旁边注有RESET CMOS、CLEAN CMOS、CMOS CLOSE、CMOS RAM RESET、CMOS Reset或Ext. Buttery等字样。 跳线开关一般为3脚,在1、2两脚上一般有一个跳接器,此时将其拔下接到2、3脚上短接数秒即可放电。 放电后,应记着将跳线或开关恢复到正常状态,否者计算机有可能不能启动甚至损坏机器。 在原装品牌机上也有将跳线做成DIP开关的,将CMOS开关拔到ON的位置与短接跳线的作用相同。 另外应该注意,几乎所有的主板都有清除CMOS的跳线和相关设置,但应厂商不能而各有所异,例如有的主板的CMOS清除设备并不是我们长见的跳线,而是很小的焊接锡点,使用金属短接一下同样可以达到目的。 此法关键之处在于找到相应的跳线(如果没有主板说明书,则难度就更大了),跳线一般在电池或CMOS芯片附近。 2、下电池短接 后备电池在主机断电期间是通过二级管向CMOS RAM提供电源的。用导线短接CMOS的VDD和地线形成放电回路进行放电即可清除CMOS中的数据(包括口令)。 在不能确定放电跳线位置时,可以将主板供电锂电池取出,然后用金属物件短接一下电池槽中的两个电极片,使存在电路电容中的残余电荷消失,重新装上锂电池,重新开机设置一下BIOS参数即可。 注意:取出电池后不作电极短接,会需很长时间才能使CMOS电路中残余的电荷放尽,残余电荷不放尽便重新装入电池,BIOS 随机参数便不会消除。 二.系统密码清除,把CMOS第一引导设为光驱引导,用GHOST安装光盘起动,选择系统登录密码破解按回车进入 [1] Choose logical drive 只清除逻辑驱动器的密码 [2] Search for ms sam datahbase(s) on all hard disk and logical drives 清除所有驱动器的密码。 [3] EXIT 退出 Your choice [2] 选择2按回车 继续按回车,接着每个数字都输入一次,每次输入后都按回车,按Y确认清除,再按回车确认。最后一直按键盘上的ESC键退到安装界面,从硬盘起动,密码清除。 第四章 局域网组建 TCP/IP(Transmission Control Protocol/Internet Protocol的简写,中文译名为传输控制协议/互联网络协议)协议是Internet最基本的协议,简单地说,就是由底层的IP协议和TCP协议组成的。 “传输控制协议”(TCP,Transsmission-Control Protocol)和“因特网协议”(IP,Internet Protocol)即TCP/IP协议。 IP地址分为网络地址和主机地址二个部分,A类地址前8位为网络地址,后24位为主机地址,B类地址16位为网络地址,后16位为主机地址,C类地址前24位为网络地址,后8位为主机地址,网络地址范围如下表所示: 种类 网络地址范围 A 1.0.0.0 到126.0.0.0有效 0.0.0.0 和127.0.0.0保留 B 128.1.0.0到191.254.0.0有效 128.0.0.0和191.255.0.0保留 C 192.0.1.0 到223.255.254.0有效 192.0.0.0和223.255.255.0保留 D 224.0.0.0到239.255.255.255用于多点广播 E 240.0.0.0到255.255.255.254保留 255.255.255.255用于广播 使用ADSL需要PC机、ADSL Modem、10M\100M自适应网卡和虚拟拨号软件 ADSL是一种非对称的DSL技术,所谓非对称是指用户线的上行速率与下行速率不同,上行速率低,下行速率高,特别适合传输多媒体信息业务,如视频点播(VOD)、多媒体信息检索和其他交互式业务。ADSL在一对铜线上支持上行速率512Kbps~1Mbps,下行速率1Mbps~8Mbps,有效传输距离在3~5公里范围以内。 ADSL的特点:   1.一条电话线可同时接听,拨打电话并进行数据传输,两者互不影响。   2.虽然使用的还是原来的电话线,但adsl传输的数据并不通过电话交换机。   3.adsl的数据传输速率是根据线路的情况自动调整的,它以“尽力而为”的方式进行数据传输。 1.常用网络命令: 在DOS下运用:Ping命令,例:Ping www.baidu.com / ping 127.0.0.1,这个命主要用于检测网络是否通,查看网络延时。 Ping 百度之后返回的结:IP地址为220.181.6.18 传输为32字节,TIME为时间,TTL为中转路由器个数,TTL=128-54。发送4帧,收到4帧,丢失为0,网络最小延时为88ms , 最大延时为89ms ,平均延时为88ms这样的数据才正常。 Ping 127.0.0.1为环路自检,查看本地网络是否正常。上图显示为正常。 Ipconfig IP地址查看命令,主要用于查看网络IP地址。 Ip address 192.168.1.100 IP地址,Subnet mask 255.255.255.0 子网掩码 default gateway 192.168.1.1网关。 2.网线的制作: 需要做线钳一把,RJ-45水晶头,超5类双绞线(5E),网络测试仪等。做线规则:①双机对联线做法:绿白、绿、橙白、蓝、蓝白、橙、棕白、棕;另一头做法:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕 ②直连线做法,两头一样,即:橙白、橙、绿白、蓝、蓝白、绿、棕白、棕。 3.局域IP地址配置: 192.168.x.x, 其中经为1-254之间任意值,要注意的是在同一个段中网段的IP值要一样,主机名不能相同,192.168.x.x,如两台机子联机IP设为: 192.168.1.13 192.168.1.14 不难看出1这个值是网段,要相同;13与14是主机的值,不能相同。 4.采用TP-LINK路由器连接上网: 在地址栏中录入192.168.1.1按回车,如下图所示: 出现如下图所示的界面:点下一步; 选择ADSL虚拟拨号(pppoE),点下一步 输入上网账号和上网口令后点下一步 点完成,这样就完成上网设置。上网正常显示如下图所示: 第五章 系统常用命令及格式转换 1.Msconfig 系统的关闭起动项命 点击开始 运行 录入Msconfig按回车进入工作界面,如下图: 点起“启动” ctfmon 对应任务栏的输入法图标,avp对应的是卡巴斯基杀毒软件的起动图标 2.Dxdiag系统信息查看命令 3.Gpedit.msc计算机管理命令 4.格式之间的转换,使用winavi进行转换 当选择多个文件时,要创建成一个DVD目录,多个标题,即对应的英为:ONE DVDS,Separate titles Create separate DVDs 创建多个DVD目录;Merge into one title所有文件整合成一个目录。 如果Winavi转换不了的文件可配合Total Video Converter 使用,如下图所。 5.常用的快捷键,使用快捷可以帮助我节约时间。 CTRL+A 全选 CTRL+ C复制 CTRL+V粘贴,这两组组合键是选复制后粘贴。 CTRL+S保存 CTRL+O打开 CTRL+Z 撤消上一步操作 CTRL+X剪切 CTRL+N新建 ALT+F4快速关机 ALT+TAB强行跳出正在操作的界面 CTRL+ALT+DEL 重新起动 6.开机常按F8可以进入安全模式或是带DOS命令的安全模式。 有一些病毒我们在系统下是杀不掉的,这时我们可以进入带安全模式的系统下再用杀毒软件去扫描病毒,这样有可能把病毒清除掉。进入带DOS命令的安全模式我们可以用它来起动GHOST文件。 第六章GHOST的备份与恢复 1 重新启动计算机 用光盘引导,选择DOS工具进入DOS操作界面。 2 在电脑启动时 快速 连续 按键盘最上一排的 F8 3 按了后会显示 黑底白字的 系统选项 通常上面有6 个选项 4 此处我们需要了解的是1 正常模式 3 安全模式 6 进入DOS界面 5 ghost通常必须要在dos 运行 因此选取 6 进入dos 界面 按上下选择箭头 选定 6 回车 6 进入后会出现DOS 提示符 如 C:\> 此处意思为 现在显示的是C盘 7 在c:\> 后面输入d:此处的意思为进入D盘 输入后回车 出现d:\> 8 再在d:\>后面输入 g 此处意思为运行 g 程序 此处的g 实际上就是原有的 ghost 程序 9 输入后回车 就会进入GHOST 的操作界面 见 图一 附 DOS 下基本操作命令 每一个命令输入完毕后回车进入下一个操作 1 c : 进入C盘 同样的道理 D :进入D盘 E: F: 进入E盘F盘 2 dir 查看 查看目录下面的文件 如c:\> dir 是指查看 C盘里面的文件 3 cd 文件夹名字 打开文件夹 如cd 123 意思是说 打开123这个文件夹 4 exe 是程序的意思 如这ghost 改名字后为g 在dos下面就叫 g.exe 5 在dos下面 如果要执行程序的话 输入程序名字 回车即可 如 运行g.exe 输入g 回车 6 cd ..进入上一个目录 如此时是c:\>windows 是表示在C盘的windowd 中 如果说此时输入 cd .. 则会进入C盘 屏幕上显示出c:\> 三 打包 制作镜像文件 对于通常用户来说 仅仅只是使用GHOST里的分区备份功能 故此此处只讲解分区备份部分 1 按上所说处理好打包前的工作(系统状况最好 驱动安装好 相关软件安装好 清理垃圾文件 磁盘查错 磁盘碎片整理……) 后 重新启动 快速按F8 进入DOS界面 运行 G.exe 2 注意:若要使用备份分区功能 (如要备份C盘)必须有两个分区(最少要有C D二个分区)以上 而且C盘所用容量必须大于D盘的未用容量(通常C盘用了二GB 则D盘必定要有二GB以上的空间) 保证D盘上有足够的空间储存镜像 3 进入图一所示GHOST 界面后 由于是在DOS下 只能用键盘操作 按回车 进入下一个界面 4 DOS界面下 键盘操作:TAB键进行切换 回车键进行确认 方向键进行选择 如图二 用方向键选择 选择菜单 Local(本机)--Partition(分区)--To Image(到镜像) 通俗一点说就是1-2-2 先选中 1 再选取 弹出选项 2 再选取弹出选项 2  5 选中后回车 将出现如图三 选择硬盘 此处第一次是显示的第一个硬盘的信息 如果有二个硬盘的话 回车后会出现二个硬盘的信息选项 通常我们只一个硬盘 此处操作按回车  6 选中后回车 将出现下一个操作界面 如图四   选择要备份的分区 通常我们是选择C盘 也就是系统盘 此处操作 1 选择分区(可以用方向键上下选择 用TAB选择项目 )通常选择第一个就是C盘 分区 2 选定分区 回车确定 3 按一下TAB 再次确定 回车 就表示已经选定为 备份C盘 如果说您不能确定是不是备份的C盘 建议您在WINDOWS的时候 查看一下您的各个分区的大小 再对照就可以知道的 因此处是借鉴别的人的图 所以需要到您区别一下   7 选中后回车 将出现如图5 此处需要是输入备份文件名字 此处操作 1 按TAB选定到图片下面的输入名字的地方 在空格内输入您确定的名字 回车 2 此处选择的名字为 windows 当然您也可以选择别的名字的 3 后缀名为.gho 8 输入后回车 就会进入如下所示 见 图6 此处是提示您选择压缩模式 上面共有三个选择: No表示不压缩,Fast表示适量压缩,High高压缩 限于适用与速度 通常我们选择适量压缩 Fast 9 输入后回车 就会进入下一操作界面 见 图7 此处是提示您选择是否开始备份 共有二个选择 YES 是 NO 不 我们需要选定YES 此处操作 1 按左右方向键 选定YES 回车 10 输入后回车 就会进入下一个操作界面 见 图8 此处是提示GHOST根据您的指示 开始备份 此处操作 1 此处请不要做任意动作 您的任意动作都会带来不可预见之后果 请1 不要按键盘 2 不要关机 静心等待到进度条走完 11 进度条跑完后会进入到下一个 操作界面 见 图9 此处是提示GHOST根据您的指示 已经备份完毕 回车退出 此处操作 1 回车 备份完毕 重新启动就可以了  备份的文件以GHO后缀名储存在设定的目录中 如上所述 您的这个文件名叫 windows.gho 此文件在windows界面下是不显示什么的 在DOS下运行GHOST显示为黄色 您的这个 windows.gho 保存在D盘目录下 就是和 G.EXE 一个目录下 通常建议您将镜像文件复制一下 放在安全的地方防止误删除  三 解包 还原镜像文件 要提醒您注意的是在使用 GHSOT 软件恢复系统时,请勿中途中止!如果您在恢复过程中重新启动了计算机那么您的计算机将无法启动!必定要接双硬盘或用光盘系统启动才可恢复 在您的系统遇到以下的情况之一 怀疑或确定您的系统中了病毒或木马 系统运行了半个月以上 或出现无故死机 变慢 及相关类别 您需要还原您的系统镜像文件 以保证到系统的安全与良好运行 1 重新启动 快速按F8 进入DOS界面 运行G.exe 进入GHOST界面 回车 2 回车后 就会进入GHOST 的操作界面 见 图10 此处操作 选择菜单到 Local(本机)--Partition(分区)--From Image 通俗一点说就是1-2-3 先选中 1 再选弹出选项 2 再选项弹出选项 3 3 选定后回车 就会进入下一个操作界面 见 图11 此处是提示您 选择 需要还原的镜像文件 如上所述 我们打的包是 windows.gho 所以我们这里选择windows.gho 1 按上下方向键 选择好windows.gho 回车 4 输入后回车 就会进入下一个操作界面 见 图12 此处显示硬盘信息 不需要处理 直接回车 5 输入后回车 就会进入下一个操作界面 见 图13 此处显示硬盘信息 不需要处理 直接回车 6 输入后回车 就会进入下一个操作界面 见 图14 此处显示分区信息 提示您是需要还原到哪珍上分区 默认是还原第一个分区 也就是C盘系统盘 如果您是要还原到此分区 不需要处理 直接回车 此处操作按 回车 7 输入后回车 就会进入下一个操作界面 见 图15 此处显示信息 此处是为了防止误操作 再次提醒您是不是一定要还原镜像文件 您到了这一步 如果说没有十分的把握 这是最后一次机会 默认是NO 按下可以退出到起始界面 如果选择YES 将进行还原操作 此操作到了此处已经不可逆转 此处需要的是用左右方向键 选择YES 回车 8 输入后回车 就会进入GHOST 的操作界面 见 图16 此处是提示GHST根据您的指示 开始还原镜像文件 此时千万不要进行操作 1 此处请不要做任意动作 您的任意动作都会带来不可预见之后果 包括系统不能启动 请 1 不要按键盘 2 不要关机 静心等待到进度条走完 9 输入后回车 就会进入下一个操作界面 见 图17 此处是提示GHST根据您的指示 已经备份完毕 给出的二个选择 一 默认为重新启动 二 以后再重新启动 此处需要的是重新启动 至此 您已经成功的还原了您的系统镜像 您的系统又和原来最最良好的时候是一样的了 恭喜您的电脑有了百毒不侵 之身 有了可以防止误操作的万事无忧之方法 有了以上的说明 在通常的情况下 您可以随时随地将您的系统还原到最良好运行之境地 第七章 综合应用 一.文件的后缀名, *号任意的文件名 1. *.bmp格式是微软制定的图形标准,最大的优点就是在pc上兼容度一流,就算不装任何看图软件,用windows的画图程序一样可以看。储存为bmp格式的图形不会失真,但容量会很大。 2. *.jpg格式是目前网络上最流行的图形格式,它可以把文件容量压缩到最小的格式。用Photoshop图形处理软件处理jpg格式的图像,它支持不同程度的压缩比,您可以视情况调整压缩倍率,压缩比越大,品质就越低;相反地,压缩比越小,品质就越好。不过要注意的一点是,这种压缩法属于失真型压缩,文件的压缩会使得图形品质下降。 3. *.doc为Word文档,一般看见后缀名为doc的文件就要用Word应用程序才能打开。 4.*.xls为Excel文档,一般看见后缀名为xls的文件就要用Excel应用程序才能打开。 5. *.ppt为Powerpoint文档也就是幻灯片文档,一般看见后缀名为ppt的文件就要用Powerpoint应用程序才能打开。 6.*.txt为文本文档,一般看见后缀名为txt的文件就要用记事本应用程序才能打开。 7.*.pdf便携文档格式 (PDF) 由 Adobe 发明,已成为全世界各种标准组织用来进行更加安全可靠的电子文档分发和交换的出版规范。如今,PDF日益成为一种流行的格式,许多政府及官方媒体的文档,都以 Adobe PDF 作为标准格式。Adobe Reader 8.0 可以浏览 PDF, 但不能创建 PDF! 8. *.mp3 MP3全称是动态影像专家压缩标准音频层面3(Moving Picture Experts Group Audio Layer III)。是当今较流行的一种数字音频编码和有损压缩格式,它设计用来大幅度地降低音频数据量,而对于大多数用户来说重放的音质与最初的不压缩音频相比没有明显的下降。它是在1991年由位于德国埃尔朗根的研究组织Fraunhofer-Gesellschaft的一组工程师发明和标准化的。 简单的说,MP3就是一种音频压缩技术,由于这种压缩方式的全称叫MPEG Audio Layer3,所以人们把它简称为MP3。 9.*.ini 文件是windows的系统配置文件,统管windows的各项配置,一般用户就用windows提供的各项图形化管理界面就可实现相同的配置了;在Windows系统中,INI文件是很多,最重要的就是“System.ini”、“System32.ini”和“Win.ini”。该文件主要存放用户所做的选择以及系统的各种参数。一般ini为后缀名的文件不能删除哟! 10.*.bat是批处理文件,是windows32底下的应用程序,可以同时按条件处理一批文件。 这里有个例子: 在电脑屏幕的左下角按“开始→程序→附件→记事本”,把下面的文字复制进去,点“另存为”,路径选“桌面”,保存类型为“所有文件”,文件名为“清除系统yjh.bat”,就完成了。记住后缀名一定要是.bat,ok!你的垃圾清除器就这样制作成功了! 双击它就能很快地清理垃圾文件,大约一分钟不到。 @echo off echo 正在清除系统垃圾文件,请稍等...... del /f /s /q %systemdrive%\*.tmp del /f /s /q %systemdrive%\*._mp del /f /s /q %systemdrive%\*.log del /f /s /q %systemdrive%\*.gid del /f /s /q %systemdrive%\*.chk del /f /s /q %systemdrive%\*.old del /f /s /q %systemdrive%\recycled\*.* del /f /s /q %windir%\*.bak del /f /s /q %windir%\prefetch\*.* rd /s /q %windir%\temp & md %windir%\temp del /f /q %userprofile%\cookies\*.* del /f /q %userprofile%\recent\*.* del /f /s /q "%userprofile%\Local Settings\Temporary Internet Files\*.*" del /f /s /q "%userprofile%\Local Settings\Temp\*.*" del /f /s /q "%userprofile%\recent\*.*" echo 清除系统LJ完成! echo. & pause 以后只要双击运行该文件,当屏幕提示“清除系统LJ完成!就还你一个“苗条”的系统了!!到时候再看看你的电脑,是不是急速如飞呢? 11.*.RMVB主要用于网络视频格,即电影格式,其特点是比AVI格式小,图像清析,便于网络传输;所谓RMVB格式,是在流媒体的RM影片格式上升级延伸而来。VB即VBR,是Variable Bit Rate(可改变之比特率)的英文缩写。我们在播放以往常见的RM格式电影时,可以在播放器左下角看到225Kbps字样,这就是比特率。影片的静止画面和运动画面对压缩采样率的要求是不同的,如果始终保持固定的比特率,会对影片质量造成浪费。   而RMVB则打破了原先RM格式那种平均压缩采样的方式,在保证平均压缩比的基础上,设定了一般为平均采样率两倍的最大采样率值。将较高的比特率用于复杂的动态画面(歌舞、飞车、战争等),而在静态画面中则灵活地转为较低的采样率,合理地利用了比特率资源,使RMVB在牺牲少部分你察觉不到的影片质量情况下最大限度地压缩了影片的大小,最终拥有了近乎完美的接近于DVD品质的视听效果。可谓体积与清晰度“鱼与熊掌兼得”,其发展前景不容小觑。 12.*.AVI——Audio Video Interleave,即音频视频交叉存取格式。最早由Microsoft公司于1992年推出。在AVI文件中,运动图像和伴音数据是以交织的方式存储,并独立于硬件设备。构成一个AVI文件的主要参数包括视像参数、伴音参数和压缩参数等。而且由于AVI本身的开放性,获得了众多编码技术研发商的支持,不同的编码使得AVI不断被完善。而随着MPEG的崛起,当前流行的AVI格式一般采用DviX5以及Xvid的MPEG4编码器压制,视频的画质和体积都得到了很好的控制。举个例子,一部高品质的DVD电影的容量一般为4-5GB,但经过DivX或XviD编码后的大小只有650-700MB,仅仅为原DVD容量的八分之一,图像品质却与DVD相当使得AVI格式成为电影发烧友的首选格式之一。 13.*.FLV流媒体格式是一种新的视频格式,全称为Flash Video,Macromedia为了尽早用FLV格式来垄断Web Video应用,短短两三年的时间,FLV就成为了目前最主流的在线视频播放格式,随着被新一代的视频播客网站YouTube、土豆等网站的广泛采用,以及Google、百度、新浪、腾讯、猫扑、Maxthon、雅虎等国际国内著名互联网公司的相继投入与看好,还有国际资本大量进入视频播客领域,FLV格式被极大的推广。 14.*.3gp与*.mp4这两种格的文件主要是在手机上应用的比较广泛,其特点是图像小,但在压缩的过程中有损耗,图像不清析,只是适用像手机这样的小屏幕。 15.*.EXE为可执行文件,如果没有可执行文件哪么应用程就运行不了。一般全名为:setup.exe 16. *.gho 为GHSOT生成的镜像文件,主要是系统的备份文件。 17.*.dll为系统的动态库连接文件,静态连接所需要做的工作是多少(假设按windwos来说他有上千个这样的函数,一共有100多个程序来使用,那静态连接需要100000次的更新,动态连接只需要1000次),从而也节省了内存的空间。动态连接库不一定是DLL扩展名的,也可以是ocx、vbx、exe、drv 等等 二.内存出错或是系统出错引起蓝屏 电脑开机就出现的蓝色屏幕内容如下: “ A problem has been detected and windows has been shut down to prevent damage to your computer. If this is the first time you've seen this stop error screen,restart your computer. If this screen appears again, follow these steps: 1.Check to make sure you have adeguate disk space , if a driver is identified in the stop message ,disable the driver or check with the waufacturer for driver updates try changing video adapters . 2.Check with your hardware vendor for any bios updates ,disable bios memoryor options such as caching or shadowing 。 if you need to use safe mode to remove or disable computers,restart your computer 3.Press F8 to select;advanced star up options,and the select safe mode。 Technical information: *** stop:0x0000007E(0x0000005,0xF7711EC5,0xF78A21A4,0xF78A1EA0) ***partMgr.SYS, Adress F7711ECS base at F770F000, Date stamp 480253b0 大致意思是:出现蓝问题是WINDOWS系统自动关闭,阻止计算机被毁坏;如果是第一次出,从新启动计算机,从启后还是一样出现的话,照着下面的步骤: 1.检查硬盘空间,看是否足够装系统; 2.检查内存,看内存是否有问题; 3.按F8进安全模式看看是否能进带安全模式的系统。 出现这种问题般解决办是从装系统,如是不能,把内存拿下来用湿毛巾擦下再用干毛巾擦干,再卡回主机,看问题能否解决;都有能解决哪么把内存拿到其它正常的主机上看看内存是不是好的。如果是内存坏了,哪就要换内存了。 三.本机病毒删除不了,解决方法是把硬盘拆下来换到别台主机上进行杀毒,要求挂上去的主机要采用正版杀毒软件,升过级的才可以 如果是要从新装系统哪么要求这样做:先格式化C盘,如果要装GHOST版本的系统,D盘也要格式化掉,因为GHOST版本的系统有些文件要装到D盘上去,这样是避免系统感染上病毒,系统装好后用光盘装杀毒软件,或是用U盘拷贝过来装,前提是保正U盘和所拷贝的杀毒软件没得病毒哟。注:除了格式化过的盘可以点击,其它盘一律不能点哟,不然的话就白辛苦了。装好杀毒软件并升过级,全盘扫苗过后才能点其它盘。 四.识别常见病毒,病毒一般是以隐藏形式藏匿在计算机的文件中,要把文件的隐藏属性打开。每一盘都有工具这个选项,如下图所示: 1、什么是计算机病毒: 计算机病毒,是指编制或者在计算机程序中插入的破坏计算机功能或者毁坏数据,影响计算机使用,并能自我复制的一组计算机指令或者程序代码。 2、常见病毒的特征及防治方法 如果双击文件图标打不开,哪么就是感染病毒了。 ①新欢乐时光 病毒现象:当您选择“文件夹选项”,并且选择“显示所有文件”的时候,您可以在很多目录中看到原先是隐藏的folder.htt和desktop.ini文件,而且当你打开原先没有这两个文件的文件夹时会自动在这个文件夹里生成这两个文件,这时你的电脑就很可能是被新欢乐时光(Vb.Script)感染了。被病毒感染后系统运行速度明显下降,偶尔弹出错误消息框,严重的可能导致死机甚至无法进入系统。 防治方法:不要随便在其他微机上使用u盘及软盘,在必须的情况下应在自己的电脑中先对其进行查毒再使用。如果系统已经感染了此病毒,则可以在瑞星及江民的网站上下载专杀工具vb.kj可以有效的杀除此种病毒。 ②冲击波、震荡波。 病毒现象:此类病毒常见于windows2000较早的版本,病毒运行时会利用RPC缓冲区漏洞攻击该系统,导致电脑运行变慢,不断死机或开机后立即倒数一分钟重启。 防治方法:发现感染此病毒后,应首先断开与局域网的连接,进入安全模式,使用瑞星的专杀工具进行杀毒(Rs_blaster),然后将系统打上rpc漏洞补丁,可以彻底清除此种病毒。 ③QQ类病毒。 病毒现象:QQ类病毒多数为木马型及蠕虫型混合病毒,目的是窃取你计算机上的密码,有些破坏力强大的病毒可能造成很大的威胁,可能导致OFFICE软件、任务管理器、注册表编辑器等程序无法使用,该病毒还会破坏资源管理器,只要用户打开四层以上的目录,病毒就会自动关闭“资源管理器”。该病毒还会干掉含有“杀毒”字样的窗口,因此会造成一些反病毒软件及病毒专杀工具无法使用、一些反病毒公司的主页无法登陆等现象。另外该病毒还会修改用户电脑的系统配置,导致用户重启系统时无法进入“我的电脑”。 防治方法:不要随便接收别人从QQ上传递的文件,尤其是可执行文件(.exe文件),接收的文件要先查毒再打开。如果感染此类病毒可以进入安全模式进行查杀。 ④灰鸽子木马。 灰鸽子是一种功能极为强大的木马病毒,可以完全控制监控,甚至在你的电脑上安装软件盗取密码,而且除了具有语音监听、语音发送,还有远程视频监控功能,只有远程计算机有摄像头,且正常打开没有被占用,那么你可以看到,远程摄像头捕获的图片!还可以把远程摄像头捕获的画面存为Mpeg-1格式.远程语音也可以录制成Wav声音文件。你的电脑没有任何隐私了,可以从你电脑上下载软件,把坏东西复制上去,可以从新安装非病毒类远程控制,这样你就无法摆脱。电脑感染这种木马后没有什么特别的症状,只有通过杀毒软件才能发现自己已经中毒了。 防治方法:1、打开注册表编辑器(点击“开始”→“运行”,输入“Regedit.exe”,确定),打开 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services注册表项。 2、点击菜单“编辑”→ “查找”,“查找目标”输入“game.exe”,点击确定,我们就可以找到灰鸽子的服务项(此例为Game_Server)。 3、删除整个Game_Server项。 灰鸽子的变种很多,所以不仅限于以上的病毒名称。防止感染灰鸽子要注意不要浏览不安全的网站,经常杀毒,并养成良好上网习惯。 常用专杀工具下载链接 1.新欢乐时光专杀工具vbs.kj http://www8.pconline.com.cn/download/swdetail.phtml?id=7910 2.震荡波(Worm.Sasser)”病毒专杀工具. http://it.rising.com.cn/service/technology/RS_sasser.htm 3.“冲击波(Worm.Blaster)”病毒专杀工具 http://it.rising.com.cn/service/technology/RS_blaster.htm 4. “QQ病毒”专杀工具 http://it.rising.com.cn/service/technology/RS_QQMsender.htm 5. “MSN病毒(Worm.msn.funny)”专杀工具 http://it.rising.com.cn/service/technology/RS_MSN.htm 6“Zotob蠕虫(Worm.Zotob)”病毒专杀工具 http://it.rising.com.cn/service/technology/rav_Zotob.htm 有些深点的蠕虫病毒用瑞星、卡巴斯基、超级兔子等杀毒软件都是杀不出来的,有些即使你杀出来了也删除不了,删除了过下子又来了,或电脑重启又出现了。对于这种病毒,首先你必须要知道哪些东东被中了,哪些东东被感染了,比如IE上的主页被改了,IE有时会自动关闭,电脑“进程”里运行了很多不是系统相关的东东(如.dll的库文件和.exe的可执行文件。)这时候必须重启电脑,一直按f8进入安全模式(如电脑设有多个账号的,要用管理员账号登录,也就是Adminstrator),找到可凝的文件一个一个进行手动删除,并在注册表里找到与此病毒相关的文件进行删除(一般电脑中了这种毒,注册表项里就会恶意被修改,并增加很多新的注册项。),电脑硬盘里带毒的文件必须一一彻底删,还有注册表里的一样必须一一彻底清除或更正。深的蠕虫病毒还会感染每个硬盘及一些相关的文件和软件。 注册表进入命令:regedit 查看电脑启动项命令:msconfig 在电脑的“开始”---“运行”,打开运行对话框输入以上命令。 电脑C盘(系统盘)最容易也最常隐藏病毒的文件夹有下: C:\Documents and Settings\qsk\Local Settings\Temp (这个目录是常常隐藏病毒的地方) 上面的“qsk”是我电脑登录的账号名,如果你登录电脑时的账号名是“abc”那么文件夹路径就是: C:\Documents and Settings\abc\Local Settings\Temp C:\Program Files\Common Files 这个文件夹下常常会隐藏产新生成写病毒文件及病毒文件夹。 C:\Program Files\Internet Explorer(这个也常会隐藏病毒文件,主要病毒文件都跟IE有关。) 病毒文件如:C:\Program Files\Internet Explorer\1.exe C:\WINDOWS (这个目录下常常会藏中毒文件,甚至会新建些中毒文件及相关文件夹) 如:新建一个“down”的文件夹,形成C:\WINDOWS\down 并会在该文件夹(down)下隐世藏一个rundll32.exe 可执行文件。(rundll32.exe是系统文件,真正的rundll32.exe是在C:\WINDOWS\system32 目录下。) C:\WINDOWS\system32 (这个目录也是常常隐病毒的地方) 一般IE中了老弹出窗口,如色情类的网站IE窗口,娱乐类的网站IE窗口病毒都会在此目录下隐藏病毒。会新生成一些如.com 、.exe 、 .dll的病毒文件。.com的文件在查看是否是病毒时,请按照此文件的属性的时间进行查看,假如你电脑系统安装的时间是2006年1月1日,而当前时间是2006年12月15日,如果.com文件的属性时间是2006年12月15日或者14日或更前几天的,那么这种大部份都是病毒文件,可进入安全模式手动删除。系统.com的文件如:edit.com,format.com等.com系统文件一般属性时间显示的都是:创建时间:2005年7月20日, 0:00:00 修改时间:2005年7月20日, 0:00:00(系统的.com文件属性显示的时间都是比你安装系统时的时间更早的。而.com病毒文件属性显示的时间都是在电脑安装系统时间后面的。 电脑常见病毒(这是我电脑上经常中的一些病毒): 病毒名:rundll32.exe 症状:此病毒会调用其它模块病毒文件 路径:C:\WINDOWS\down\rundll32.exe 注:C:\WINDOWS\system32rundll32.exe 不可删,这是正确的系统文件。 病毒名:1.exe 症状:打开IE时老弹出窗口 路径:C:\Program Files\Internet Explorer\1.exe 病毒名:logo 1.exe (此病毒是蠕虫病毒) 症状:占用CPU资源,使电脑运行速度慢,并生成很多可执行文件,在电脑上进行感染、网络感染、下载网络木马或其它病毒的复合型病毒,病毒运行后将自身伪装成系统正常文件。 路径: c:\windows\Logo1_.exe 主要生成病毒文件有下: c:\windows\rundl132.exe(注意:注意,此病毒文件名是rundl132.exe与系统system32目录下的系统文件rundll32.exe 相差一个字,病毒文件是132.exe 而系统文件是l32.exe,凡电脑上出现的rundl132.exe 的文件都是病毒。) c:\windows\0Sy.exe c:\windows\vDll.dll c:\windows\1Sy.exe c:\windows\2Sy.exe c:\windows\rundll32.exe (注意:此目下的此rundll32.exe也是病毒文件,正确的是在system32目录下。) c:\windows\3Sy.exe c:\windows\5Sy.exe c:\windows\1.com c:\window*\**erouter.exe c:\window*\**P10RER.com c:\windows\finders.com c:\windows\Shell.sys c:\windows\sms*.**e c:\windows\kill.exe c:\windows\sws.dll c:\windows\sws32.dll 病毒名:service.exe 路径:C:\WINNT\SYSTEM32\Service.exe(注意:该目录下的services.exe不可删,是系统文件) “特洛依木马”病毒   何谓特洛依木马?特洛依木马其实是一种骗子程序,提供某些功能作为诱饵引诱你,确在背地里摧毁你的计算机系统。记得希腊神话中关于特洛依木马的故事吗?典故就是从那儿来的。中了木马时有什么反应?很难说,因为它们发作时的情况多种多样。   病毒诊断   但是如果你的计算机有以下表现时,就很可能染上特洛依木马这种病毒了。   计算器有时死机,有时又重新激活;在没有执行什么操作的时候,却在拼命读写硬盘;系统莫明其妙地对软驱进行搜索;没有运行大的程序,而系统的速度越来越慢,系统资源占用很多;用Ctrl+Alt+Del调出任务表,发现有多个名字相同的程序在运行,而且可能会随时间的增加而增多(可是,有一些程序是不会出现在这个列表里的。懂得编程的朋友应该知道这不难做到,借助PVIEW95就可以看到)。特别是在连入Internet网或是局域网后,如果你的机器有这些现象,就应小心了,当然也有可能是一些其它的病毒在作怪。   病毒防治   一般中了木马程序最简单的解决办法就是用杀毒软件清除,如金山毒霸、瑞星等。如果对系统熟悉也可以手动清除,首先应该按照Win9x下程序自激活的方法中所述的情况检查一下是否有可疑程序(最好的情况是你熟悉你的系统正常时的这些项,用系统自带的regedit程序查看 /修改注册表)。发现可疑程序将其连同该注册表项一起删除即可,重启系统则木马就已经被清除了。不过这里要提醒大家一点,在做删除操作和注册表修改操作前一定要先备份。   “泡沫小子”病毒   泡沫小子是一种通过Outlook广泛传播的蠕虫病毒。它是第一个不需要从电子邮件打开附件就能被激活的蠕虫病毒。   病毒诊断   一般泡沫小子发送一封主题为“BubblleBoy is back!”(泡沫小子来了!)的HTML电子邮件。如果你的IE5.0的安全保护设置级别置为中、低级,则该HTML页隐含着(植入)VBS程序代码,在未提示用户的情况下就会被执行。   病毒防治   这种病毒在你眼前,要采取哪些简便的方法防范它呢?   首先要做到1.不要开启匿名邮件附件,只打开已知附件,以及可信资源建立链接关系。2.关闭自动打开附件功能。3.执行*.EXE、*.HTA、*.VBS和其它可执行附件时要谨慎。4.打开*.DOC、*.XLS、*.PPT文件时要小心。5.不要在本地邮件列表中保存别名为“ALL-Company”的邮件。6.将Internet Explorer4.x或以上版本的安全级别设定成“高级”;终止Active X和Active Scripting。7.Outlook Express:终止打开和/或预览窗口,在对话框下面,不要选中预览窗口。8.Netscape:终止JavaScript在菜单栏中选取编辑/参数,在对话框左边,点击高级,在对话框右边,不要启用邮件和新闻的JavaScript,停止JavaScript浏览最高安全级别。9.其它邮件用户:终止Visual Basic Scripting或JavaScript。   尼姆达(概念)病毒   尼姆达(概念)病毒,是近日来被发现的一种恶性邮件病毒。该病毒利用微软IE浏览器解释Outlook邮件MIME头的漏洞感染和传播,其速度之快,不可等闲视之。   病毒诊断   尼姆达(概念)感染特征和发现方法其实很简单,当感染“概念”病毒之后,它会在执行时将自身复制到临时目录下,再运行在临时目录中的副本。病毒复制到临时目录下的副本(有两个文件,文件名为???????.tmp.exe),在系统下次启动时,病毒会将他们删除(修改 wininit.ini文件)。同时该病毒还会在Windows的system目录中生成load.exe文件,修改system.ini中的shell,把shell=explorer.exe改为explorer.exe load.exe –dontrunold,从而使病毒在下次系统启动时仍能被激活。另外,在system目录下,该病毒还会生成一个副本:riched20.dll。riched20.dll目录在Windows系统中就存在,它就会把它覆盖掉了。   为了通过邮件将自己传播出去,该病毒使用了MAPI函数读取用户的E-mail并从中读取SMTP地址和E-mail地址。病毒还在Windows的临时目录下生成一个eml 格式的临时文件,大小为79225字节,该文件已经用BASE64编码将病毒包含进去。然后,病毒就用取得的地址将带毒邮件发送出去。   病毒防治   由于尼姆达(概念)病毒借助的是IE浏览器的漏洞来传播的,所以堵住漏洞可以说是防护的第一步。以下的方法都可以有效的弥补这个IE的漏洞:   1.添加微软官方的补丁   SP2微软官方已经就Windows 2000系统目前发现的漏洞做了个“十全大补”的补丁,可以弥补绝大部分的Windows 2000漏洞。 SP2共100M左右,可以到以下网址下载: http://www.microsoft.com/windows2000/downloads/critical/q269862/default.asp   2.利用漏洞检测与修复系统   如果大家嫌SP2太大、太麻烦,可以用天网防火墙个人版自带的漏洞检测与修复系统可以检查出Windows中严重的系统漏洞,并自动修复它。目前的天网个人版(测试版)中所带的漏洞检测与修复系统已经可以检查和修复“概念”病毒赖以传染和传播的 IE浏览器漏洞,所以对于防护“概念”病毒而言,是一个不可多得的顺手工具。经过了漏洞检测与修复系统修复之后,“概念”病毒就无法直接在用户的机器上自动运行了。   该防火墙可以到以下网站下载,网址为:http://www.sky.net.cn/在修补完浏览器的漏洞之后,即使是收邮件的时候遇见携带有“概念”病毒的邮件,它也不能顺利的潜入用户的计算机。这时它会出现一个下载提示框。切记不要按“确定”,只要取消它就行了。或者按“确定”之后,你可以得到一个“概念”病毒的本体程序 Readme.exe。另一种防护方法是:不要用Outlook 收邮件,找其它的邮件客户端软件吧。   3.利用杀毒软件清除   如果在成功免疫前,你的计算机中了这个病毒,可以下载最近的防病毒软件进行清除,如金山毒霸、Norton等防病毒软件都已经推出了能够清除“概念”的最新病毒包。但是如果你需要根治这个漏洞,还是得按照以上的方法进行“免疫”。 解决U盘常见病毒的方法! 最近发现u盘病毒的传播方式发现已经不是当初简单了,在U盘根目录下会生成一个autorun.inf的引导文件那么简单了。如果是单纯地利用aoturun.inf传播,那么切记:打开U盘时要通过点击鼠标右键=》资源管理器的方式打开,千万不要双击,否则病毒立即会执行!然后把资源管理器的不隐藏系统文件的勾打开,再双击打开autorun.inf查看病毒路径,然后一并删除即可。但最新的U盘病毒变种已经不采取这种简单的方式了,其方式有三种:第一种是把U盘下所有文件夹隐藏,并把自己复制成与原文件夹名称相同的具有文件夹图标的文件,当你点击时病毒会执行并且该病毒会打开该名称的文件夹。当然按照上述的方式把隐藏属性去掉你可以看到这种景象。第二种是在U盘的所有可执行文件里插入病毒本身,这种情况比较恶劣。一般你必须用杀毒软件或其他分离软件才能把你能用的那部分提取出来。第三种是直接在每一个文件夹下面生成一个与该文件夹同名的exe文件,跟第一种相似,但更具有混淆性。所以大家一般时候不要什么东西都往U盘里放,轻者被插入病毒,重者资料被更改或破坏导致重要信息无法恢复;如果要在U盘里放东西事先一定要在电脑里做备份哦!另外大家买U盘时一定要买那种有写保护的,如果在别人电脑上使用,但只是读取信息,就把写保护打开,如果他电脑有病毒,或许你会发现有弹出提示的信息,就说明他电脑有病毒了。目前已经发现的有固定名称的病毒如下: autorun.inf AdobeR.exe bittorrent.exe copy.exe desktop.exe desktop2.exe folder.exe host.exe msinfmgr.exe msvcr71.dll RavMonE.exe RavMonLog RECYCLER\*.* RECYCLER SHE.exe sxs.exe SYSTEM.VER toy.exe setup.pif 如果大家发现U盘下面有这些文件,那么基本上可以确定是病毒了。 当然目前给大家的简单的解决方法如下:把下面的东东保存为*.bat文件,放在桌面上,当你感觉U盘有病毒时就双击一下,或许能帮你解决一部分负担。 ----------------------------从下面开始----------------------------------- @echo off attrib -r -h -s -a j:\*.*\ del /f/s/q/a j:\autorun.inf del /f/s/q/a j:\AdobeR.exe del /f/s/q/a j:\bittorrent.exe del /f/s/q/a j:\copy.exe del /f/s/q/a j:\desktop.exe del /f/s/q/a j:\desktop2.exe del /f/s/q/a j:\folder.exe del /f/s/q/a j:\host.exe del /f/s/q/a j:\msinfmgr.exe del /f/s/q/a j:\msvcr71.dll del /f/s/q/a j:\RavMonE.exe del /f/s/q/a j:\RavMonLog del /f/s/q/a j:\RECYCLER\*.* del /f/s/q/a j:\RECYCLER del /f/s/q/a j:\SHE.exe del /f/s/q/a j:\sxs.exe del /f/s/q/a j:\SYSTEM.VER del /f/s/q/a j:\toy.exe del /f/s/q/a j:\setup.pif taskkill /F /im explorer.exe explorer.exe j:\ ----------------------------到这里结束----------------------------------- 五.常用DOS命令 1.Format 命令,用于格式化硬盘;例如:Format C: 2.MD 创建文件夹命令 例如: MD空格+文件夹名 3.DIR 查看文件夹命令,比较常用哟。例如:DIR空格+文件夹名 4.CD..回到上一级目录 5.FDISK 硬盘分区命令 例如:FDISK 6.DELETE 删除文件命令 例如:DELETE *.TXT 7.CD进入文件夹命令 例如: CD空格+文件夹名 附录:
 数据的加密与解密  文件的加密与解密 第 章 加密与解密技术 第19章 加密与解密技术 829 19.1 数据的加密与解密 实例571 异或算法对数字进行加密与解密 光盘位置:光盘\MR\19\571 中级 趣味指数: 实 例说明 在实现本实例之前先来简要了解一下加密的概念,加密是指通过 某种特殊的方法,更改已有信息的内容,使得未授权的用户即使得到 了加密信息,如果没有正确解密的方法,也无法得到信息的内容。谈 到加密的话题,一些读者一定非常感兴趣,而且会联想到复杂的加密 算法,本实例主要使用异或“^”运算符简单地实现了对数字加密的 功能。实例运行效果如图19.1 所示。 关 键技术 本实例实现时主要使用了“异或”运算符对数字进行“异或”运 算,以达到简单加密数字的目的,下面对其进行详细讲解。 “异或”运算符“^”用于比较两个二进制数的相应位。在执行按位“异或”运算时,如果两个二进制数的 相应位都为1 或两个二进制数的相应位都为0,则返回0;如果两个二进制数的相应位其中一个为1 一个为0, 则返回1。 现在来了解一下使用“异或”加密或解密的执行过程,数值23 转换为二进制为10111,加密数字的数值15 转换为二进制为1111。对比两个二进制的值,从右向左按位对比,如果两个二进制数的相应位都为1 或两个二 进制数的相应位都为0,则返回0;如果两个二进制数的相应位中一个为1 一个为0,则返回1,最后得到的结 果为二进制值11000,该值转换为十进制为24,所以得到的加密结果为24。而解密过程也很简单,只是将加密 结果24与加密数字15 进行“异或”运算,将24 转换为二进制值11000,将15 转换为二进制值1111,进行“异 或”运算后,得到结果为23,这样又还原了加密的数据。  说明:本实例只是简单地使用了“异或”运算符计算两个整型数值以达到加密的目的,所以本实例只可以 对整型数值进行加密运算,并不适合其他数据的加密。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个GroupBox 容器控件,其中, 在第一个GroupBox 中放入3 个TextBox 控件和一个Button 按钮,分别用于输入数字、输入加密数字、显示加 密后的数字和计算加密信息;在第二个GroupBox 中放入一个TextBox 控件和一个Button 按钮,分别用于显示 解密后的信息和计算解密信息。 (3)程序主要代码如下: private void btn_Encrypt_Click(object sender, EventArgs e) { int P_int_Num, P_int_Key; //定义两个值类型变量 if (int.TryParse(txt_Num.Text, out P_int_Num) //判断输入是否是数值 && int.TryParse(txt_Key.Text, out P_int_Key)) { txt_Encrypt.Text = (P_int_Num ^ P_int_Key).ToString(); //加密数值 } else 图19.1 异或算法对数字进行加密与解密 C#开发实战1200 例(第II卷) 830 { MessageBox.Show("请输入数值", "出现错误!"); //提示输入信息不正确 } } private void btn_Revert_Click(object sender, EventArgs e) { int P_int_Key, P_int_Encrypt; //定义两个值类型变量 if (int.TryParse(txt_Encrypt.Text, out P_int_Key) //判断输入是否是数值 && int.TryParse(txt_Key.Text, out P_int_Encrypt)) { txt_Revert.Text = (P_int_Encrypt ^ P_int_Key).ToString(); //解密数值 } else { MessageBox.Show("请输入数值", "出现错误!"); //提示输入信息不正确 } } 秘 笈心法 心法领悟571:简述“异或”运算符。 本实例使用了“异或”运算符,但是在使用“异或”运算符之前,有必要了解“异或”运算符所做的“异 或”运算的机制,“异或”运算符“^”用于比较两个二进制数的相应位。在执行按位“异或”运算时,如果两 个二进制数的相应位都为1 或两个二进制数的相应位都为0,则返回0;如果两个二进制数的相应位中一个为1 一个为0,则返回1。 实例572 使用MD5算法加密数据 光盘位置:光盘\MR\19\572 中级 趣味指数: 实 例说明 MD5(Message-Digest Algorithm 5)是一种被广泛使用的“消息-摘要 算法”。“消息-摘要算法”实际上就是一个单项散列函数,数据块通过单 向散列函数得到一个固定长度的散列值,数据块的签名就是计算数据块的散 列值,MD5 算法的散列值为128 位。本实例演示如何使用MD5 算法对用户 输入的密码进行加密,实例运行效果如图19.2 所示。 关 键技术 本实例在实现时主要用到了MD5类的ComputeHash 方法,下面对其进行详细讲解。 MD5 类表示MD5 哈希算法的所有实现均从中继承的抽象类,该类位于System.Security.Cryptography 命名 空间下,其ComputeHash 方法有3种重载形式,分别介绍如下。  计算指定字节数组的哈希值,语法格式如下: public byte[] ComputeHash(byte[] buffer) 参数说明  buffer:要计算其哈希代码的输入。  返回值:计算所得的哈希代码。  计算指定Stream 对象的哈希值,语法格式如下: public byte[] ComputeHash(Stream inputStream) 参数说明  inputStream:要计算其哈希代码的输入。  返回值:计算所得的哈希代码。 图19.2 使用MD5 算法加密数据 第19章 加密与解密技术 831  计算指定字节数组的指定区域的哈希值,语法格式如下: public byte[] ComputeHash(byte[] buffer,int offset,int count) ComputeHash 方法中的参数及说明如表19.1 所示。 表19.1 ComputeHash方法中的参数及说明 参 数 说 明 buffer 要计算其哈希代码的输入 offset 字节数组中的偏移量,从该位置开始使用数据 count 数组中用作数据的字节数 返回值 计算所得的哈希代码  说明:本实例用到了ComputeHash 方法的第一种重载形式。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为MD5Arithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个TextBox 控件,分别用来输入 要加密的数据和显示加密后的字符串;添加一个Button 控件,用来使用MD5算法对输入的数据进行加密。 (3)程序主要代码如下: public string Encrypt(string strPwd) { MD5 md5 = new MD5CryptoServiceProvider(); //创建MD5 对象 byte[] data = System.Text.Encoding.Default.GetBytes(strPwd); //将字符编码为一个字节序列 byte[] md5data = md5.ComputeHash(data); //计算data字节数组的哈希值 md5.Clear(); //清空MD5 对象 string str = ""; //定义一个变量,用来记录加密后的密码 for (int i = 0; i < md5data.Length - 1; i++) //遍历字节数组 { str += md5data[i].ToString("x").PadLeft(2, '0'); //对遍历到的字节进行加密 } return str; //返回得到的加密字符串 } private void button1_Click(object sender, EventArgs e) { string P_str_Code = textBox1.Text; //记录要加密的密码 textBox2.Text = Encrypt(P_str_Code); //显示加密后的字符串 } 秘 笈心法 心法领悟572:如何判断是否为数字? 开发程序时,经常需要判断输入的字符串是否为数字,如判断输入的电话号码、货币金额和邮编等。在程 序中判断是否为数字的方法有很多种,可以使用正则表达式、int.Parse 方法和double.Parse 方法等。下面的代码 通过double.Parse 方法判断textBox1 文本框中的输入是否为数字。 double.Parse(textBox1.Text); 实例573 使用ROT13算法加密解密数据 光盘位置:光盘\MR\19\573 中级 趣味指数: 实 例说明 文件加密可以避免造成重要信息的泄漏,复杂的加密算法可以将信息加密得非常繁杂,但是对于一般的应 用,没有必要作类似于PGP、RSA 或DES 等复杂的加密算法。本实例介绍如何使用ROT13 算法加密和解密数 C#开发实战1200 例(第II卷) 832 据。实例运行效果如图19.3 所示。 图19.3 使用ROT13算法加密解密数据 关 键技术 本实例实现时,主要是用Convert 类的ToChar 方法来获取单个字符的Unicode 编码,然后将字母的前13 个和后13 个对调,从而实现加密的功能。下面对Convert类的ToChar 方法进行详细讲解。 ToChar 方法返回指定的Unicode字符值,并且不执行任何实际的转换,其语法格式如下: public static char ToChar (char value) 参数说明 value:一个Unicode 字符。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为ROT13Encrypt。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个TextBox 控件,分别用来显示 原始数据和解密后的数据;添加两个Button 控件,分别用来实现利用ROT13算法加密和解密数据的功能。 (3)程序主要代码如下: public string ROT13Encode(string InputText) { char tem_Character; //存储临时字符 int UnicodeChar; //存储临时字符的字节值 string EncodedText = ""; //存储加密或解密后的字符串 for (int i = 0; i = 97 && UnicodeChar = 110 && UnicodeChar = 65 && UnicodeChar = 78 && UnicodeChar <= 90) //对字符进行解密 { UnicodeChar = UnicodeChar - 13; } EncodedText = EncodedText + (char)UnicodeChar; //得到加密或解密字符串 } return EncodedText; //返回加密或解密后的字符串 } 秘 笈心法 心法领悟573:如何在字符串中查找指定字符? 在字符串中查找指定字符时,可以先将字符串显示在richTextBox 控件中,然后利用richTextBox 类的Find 方法在该控件中查找指定字符。在字符串中查找指定字符的代码如下: 第19章 加密与解密技术 833 M_int_index = richTextBox1.Find(textBox1.Text.Trim(), M_int_index, RichTextBoxFinds.MatchCase); if (M_int_index == -1) { MessageBox.Show("没有要查找的字符串", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); M_int_index = 0; } else M_int_index = M_int_index + textBox1.Text.Trim().Length; richTextBox1.Focus(); 实例574 使用恺撒密码算法加密密码 光盘位置:光盘\MR\19\574 中级 趣味指数: 实 例说明 恺撒密码据传是古罗马恺撒大帝用来保护重要军情的加密系统,它 是一种置换密码,通过将字母顺序推后起到加密作用。例如,将字母顺 序推后3 位,字母A 将被推作为字母D,字母B 将被推作字母E。本实 例使用C#实现了恺撒加密的算法,实例运行效果如图19.4 所示。 关 键技术 本实例实现时主要用到了string 类的ToCharArray 方法和Convert 类的ToChar 方法,下面分别对它们进行 详细介绍。 (1)string类的ToCharArray 方法 string类的ToCharArray 方法用来将字符串中的字符复制到Unicode 字符数组,该方法有两种重载形式,本 实例中用到的它的重载形式如下: public char[] ToCharArray() 参数说明 返回值:元素为此字符串的各字符的Unicode 字符数组。如果此字符串是空字符串,则返回的数组为空且 长度为零。 (2)Convert 类的ToChar 方法 Convert 类的ToChar 方法用来将指定的值转换为Unicode 字符,该方法为可重载方法,本实例中用到的它 的重载形式如下: public static char ToChar(int value) 参数说明  value:32 位有符号整数。  返回值:等效于value 的值的Unicode 字符。 设 计过程 (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为CaesarArithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个TextBox 控件,分别用来输入 要加密的数据和显示加密后的字符串;添加一个Button 控件,用来使用恺撒密码算法对输入的数据进行加密。 (3)程序主要代码如下: public int AscII(string str) //获取字符的ASCII 码 { byte[] array = new byte[1]; //创建字节数组 array = System.Text.Encoding.ASCII.GetBytes(str); //为字节数组赋值 int asciicode = (short)(array[0]); //获取字节数组的第一项 return asciicode; //返回字节数组的第一项 } 图19.4 使用恺撒密码算法加密密码 C#开发实战1200 例(第II卷) 834 public string Caesar(string str) //凯撒加密算法的实现 { char[] c = str.ToCharArray(); //创建字符数组 string strCaesar = ""; //定义一个变量,用来存储加密后的字符串 for (int i = 0; i < str.Length; i++) //遍历字符串中的每一个字符串 { string ins = c[i].ToString(); //记录遍历到的字符 string outs = ""; //定义一个变量,用来记录加密后的字符串 bool isChar = "0123456789abcdefghijklmnopqrstuvwxyz".Contains(ins.ToLower()); //判断指定的字符串中是否包含遍历到的字符 bool isToUpperChar = isChar && (ins.ToUpper() == ins); //判断遍历到的字符是否是大写 ins = ins.ToLower(); //将遍历到的字符转换为小写 if (isChar) //判断指定的字符串中是否包含遍历到的字符 { int offset = (AscII(ins) + 5 - AscII("a")) % (AscII("z") - AscII("a") + 1); //获取字符的ASCII 码 outs = Convert.ToChar(offset + AscII("a")).ToString(); //转换为字符并记录 if (isToUpperChar) //判断是否大写 { outs = outs.ToUpper(); //全部转换为大写 } } else { outs = ins; //记录遍历的字符 } strCaesar += outs; //添加到加密字符串中 } return strCaesar; //返回加密后的字符串 } 秘 笈心法 心法领悟574:如何将新字符串添加到已有字符串中? 将新字符串添加到已有字符串中时,可以先声明一个StringBuilder类对象,以指定已有字符串的长度可变, 然后利用该对象的Append方法在字符串中添加指定字符串。将新字符串添加到已有字符串的代码如下: StringBuilder strbuilder = new StringBuilder(textBox1.Text.Trim()); strbuilder.Append(textBox2.Text.Trim()); textBox3.Text = strbuilder.ToString(); 实例575 对数据报进行加密保障通信安全 光盘位置:光盘\MR\19\575 高级 趣味指数: 实 例说明 网络传输数据时,有时候传输信息容易被不法分子截获而 用作其他用途。这样,如果传输的数据中包含有重要秘密,将 会造成非常严重的后果。为了防止这种情况的发生,可以对网 络中传输的数据进行加密,用户接收到数据后再进行解密查看, 这样可以更好地保障网络通信安全。运行本实例,首先设置端 口号,然后在窗体左下方的文本框中输入聊天信息,单击“发 送”按钮,向局域网中发送聊天信息,同时在右侧的“数据传 输信息”栏中显示数据报的发送、接收及丢失情况。实例运行 效果如图19.5 所示。 关 键技术 本实例获取数据报信息时主要用到IPGlobalProperties和UdpStatistics类,而在对数据报加密时用到DESCrypto 图19.5 对数据报进行加密保障通信安全 第19章 加密与解密技术 835 ServiceProvider 和CryptoStream 类,其中DESCryptoServiceProvider 继承于DES 类。下面对本实例中用到的关 键技术进行详细讲解。 (1)IPGlobalProperties 类 IPGlobalProperties 类提供有关本地计算机的网络连接的信息,本实例中用到它的GetIPGlobalProperties 和 GetUdpIPv4Statistics 方法,下面分别进行介绍。 GetIPGlobalProperties 为静态方法,主要用来获取一个对象,该对象提供有关本地计算机的网络连接和通信 统计数据的信息,其语法格式如下: public static IPGlobalProperties GetIPGlobalProperties() 参数说明 返回值:IPGlobalProperties 对象,该对象包含有关本地计算机的信息。 GetUdpIPv4Statistics 方法主要用来提供本地计算机的用户数据报协议/Internet 协议版本4 (UDP/IPv4)统 计数据,其语法格式如下: public abstract UdpStatistics GetUdpIPv4Statistics() 参数说明 返回值:UdpStatistics 对象,提供本地计算机的UDP/IPv4通信统计数据。 例如,本实例中创建IPGlobalProperties 对象,及调用其GetUdpIPv4Statistics 方法创建UdpStatistics 对象的 代码如下: IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); UdpStatistics myUdpStat = null; myUdpStat = NetInfo.GetUdpIPv4Statistics(); (2)UdpStatistics类 UdpStatistics 类提供用户数据报协议(UDP)统计数据,本实例中主要用到其DatagramsSent 属性、 DatagramsReceived属性和IncomingDatagramsDiscarded 属性,其中,DatagramsSent 属性用来获取已发送的用户 数据报协议(UDP)数据报的数量,DatagramsReceived 属性用来获取已接收的用户数据报协议(UDP)数据报 的数量,IncomingDatagramsDiscarded 属性用来获取已收到但因端口错误而丢弃的用户数据报协议(UDP)数据 报的数量。 例如,本实例中初始化已发送、已接收和丢失数据报的实现代码如下: SendNum1 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); //记录发送的数据报 ReceiveNum1 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); //记录接收的数据报 DisNum1 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); //记录丢失的数据报  说明:IPGlobalProperties 类和UdpStatistics 类位于System.Net.NetworkInformation 命名空间下。 (3)DES 类 DES 类表示所有DES 实现都必须从中派生的数据加密标准(DES)算法的基类,其CreateEncryptor 方法和 CreateDecryptor 方法分别用来加密和解密。 CreateEncryptor 方法使用指定的Key属性和初始化向量(IV)创建对称加密器对象,其语法格式如下: public abstract ICryptoTransform CreateEncryptor(byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的密钥。  rgbIV:用于对称算法的初始化向量。  返回值:对称加密器对象。 CreateDecryptor 方法使用指定的Key属性和初始化向量(IV)创建对称解密器对象,其语法格式如下: public abstract ICryptoTransform CreateDecryptor(byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的密钥。  rgbIV:用于对称算法的初始化向量。  返回值:对称解密器对象。 C#开发实战1200 例(第II卷) 836 (4)CryptoStream 类 CryptoStream 类定义将数据流链接到加密转换的流,其构造函数的语法格式如下: public CryptoStream(Stream stream,ICryptoTransform transform,CryptoStreamMode mode) 参数说明  stream:对其执行加密转换的流。  transform:要对流执行的加密转换。  mode:CryptoStreamMode 枚举值之一,CryptoStreamMode 枚举值及说明如表19.2 所示。 表19.2 CryptoStreamMode枚举值及说明 枚 举 值 说 明 Read 对加密流的读访问 Write 对加密流的写访问 另外,在向加密或解密流中写入数据时用到CryptoStream 类的Write 方法,该方法将一个字节序列写入当 前CryptoStream,并将流中的当前位置提升写入的字节数,其语法格式如下: public override void Write(byte[] buffer,int offset,int count) 参数说明  buffer:字节数组,此方法将count 个字节从buffer 复制到当前流。  offset:buffer 中的字节偏移量,从此偏移量开始将字节复制到当前流。  count:要写入当前流的字节数。  说明:DES 类和CryptoStream 类位于System.Security.Cryptography 命名空间下。 设 计过程 (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为EncryptDataReport。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加两个RichTextBox 控件,分别用来 输入聊天信息和显示聊天信息;添加4 个TextBox 控件,分别用来输入端口号和显示已发送数据报、已接收数 据报、丢失数据报;添加4 个Button 控件,分别用来执行设置端口号、发送聊天信息、清空聊天信息和关闭应 用程序操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码中,首先创建程序所需要的.NET 对象及公共变量,代码如下: #region 定义全局对象及变量 private IPEndPoint Server; //服务器端 private IPEndPoint Client; //客户端 private Socket mySocket; //套接字 private EndPoint ClientIP; //IP地址 byte[] buffer, data; //接收缓存 bool blFlag = true; //标识是否第一次发送信息 bool ISPort = false; //判断端口打开 int SendNum1, ReceiveNum1, DisNum1; //记录窗体加载时的已发送\已接收\丢失的数据报 int SendNum2, ReceiveNum2, DisNum2; //记录当前已发送\已接收\丢失的数据报 int SendNum3, ReceiveNum3, DisNum3; //缓存已发送\已接收\丢失的数据报 int port; //端口号 #endregion Frm_Main 窗体加载时,初始化已发送、已接收和丢失的数据报,并使用全局变量记录,实现代码如下: //初始化已发送、已接收和丢失的数据报 private void Form1_Load(object sender, EventArgs e) { if (blFlag == true) { IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); //创建一个IPGlobalProperties 对象 UdpStatistics myUdpStat = null; //声明UdpStatistics 对象 myUdpStat = NetInfo.GetUdpIPv4Statistics(); //创建UdpStatistics 对象 第19章 加密与解密技术 837 SendNum1 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); //记录发送的数据报 ReceiveNum1 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); //记录接收的数据报 DisNum1 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); //记录丢失的数据报 } } 单击“设置”按钮,使用指定的端口号连接服务器端与客户端,并开始接收消息。“设置”按钮的Click 事件的代码如下: private void button4_Click(object sender, EventArgs e) //设置端口号 { try { port = Convert.ToInt32(textBox4.Text); //记录端口号 CheckForIllegalCrossThreadCalls = false; //指定线程中可以调用窗体的控件对象 buffer = new byte[1024]; data = new byte[1024]; Server = new IPEndPoint(IPAddress.Any, port); //创建服务器端 Client = new IPEndPoint(IPAddress.Broadcast, port); //创建客户端 ClientIP = (EndPoint)Server; //获取服务器端IP 地址 //创建Socket 对象 mySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); //设置Socket 网络操作 mySocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.Broadcast, 1); mySocket.Bind(Server); //绑定服务器端 //开始接收消息 mySocket.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref ClientIP, new AsyncCallback(StartLister), null); ISPort = true; //打开指定端口号 } catch { } } 单击“发送”按钮,首先判断是否有打开的端口,如果没有,弹出提示信息,否则根据发送和接收的消息 计算已发送、已接收和丢失的数据报,并显示在相应的文本框中,然后使用DES对要发送的消息进行加密发送。 “发送”按钮的Click事件的代码如下: //发送信息 private void button2_Click(object sender, EventArgs e) { if (ISPort == true) //判断是否有打开的端口号 { IPGlobalProperties NetInfo = IPGlobalProperties.GetIPGlobalProperties(); UdpStatistics myUdpStat = null; myUdpStat = NetInfo.GetUdpIPv4Statistics(); try { if (blFlag == false) //非第一次发送 { SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); textBox1.Text = Convert.ToString(SendNum2 - SendNum3); textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum3); textBox3.Text = Convert.ToString(DisNum2 - DisNum3); } SendNum2 = Int32.Parse(myUdpStat.DatagramsSent.ToString()); ReceiveNum2 = Int32.Parse(myUdpStat.DatagramsReceived.ToString()); DisNum2 = Int32.Parse(myUdpStat.IncomingDatagramsDiscarded.ToString()); SendNum3 = SendNum2; //记录本次的发送数据报 ReceiveNum3 = ReceiveNum2; //记录本次的接收数据报 DisNum3 = DisNum2; //记录本次的丢失数据报 if (blFlag == true) //第一次发送 { textBox1.Text = Convert.ToString(SendNum2 - SendNum1); textBox2.Text = Convert.ToString(ReceiveNum2 - ReceiveNum1); textBox3.Text = Convert.ToString(DisNum2 - DisNum1); blFlag = false; C#开发实战1200 例(第II卷) 838 } } catch (Exception ex) { MessageBox.Show(ex.Message, "提示信息", MessageBoxButtons.OK, MessageBoxIcon.Information); } string str = EncryptDES(rtbSend.Text, "mrsoftxk"); //加密要发送的信息 data = Encoding.Unicode.GetBytes(str); mySocket.SendTo(data, data.Length, SocketFlags.None, Client); //发送消息 rtbSend.Text = ""; } else { MessageBox.Show("请首先打开端口!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); button4.Focus(); } } 上面的代码中用到了EncryptDES 方法,该方法为自定义的、返回值类型为string 的方法,主要用来使用 DES 加密数据报,它有两个string 类型的参数,分别用来表示待加密的字符串和加密密钥,返回值为加密后的 字符串。EncryptDES 方法的实现代码如下: #region DES 加密字符串 /// ///DES 加密字符串 /// ///待加密的字符串 ///加密密钥,要求为8 位 ///加密成功返回加密后的字符串,失败返回源字符串 public string EncryptDES(string str, string key) { try { byte[] rgbKey = Encoding.UTF8.GetBytes(key.Substring(0, 8)); //将加密密钥转换为字节数组 byte[] rgbIV = Keys; //记录原始密钥数组 byte[] inputByteArray = Encoding.UTF8.GetBytes(str); //将加密字符串转换为字节数组 DESCryptoServiceProvider myDES = new DESCryptoServiceProvider(); //创建加密对象 MemoryStream MStream = new MemoryStream(); //创建内存数据流 //创建加密流对象 CryptoStream CStream = new CryptoStream(MStream, myDES.CreateEncryptor(rgbKey, rgbIV), CryptoStreamMode.Write); CStream.Write(inputByteArray, 0, inputByteArray.Length); //向加密流中写入数据 CStream.FlushFinalBlock(); //释放加密流对象 return Convert.ToBase64String(MStream.ToArray()); //返回内存流中的数据 } catch { return str; } } #endregion 秘 笈心法 心法领悟575:如何根据标点符号分行? 根据标点符号分行时,首先要使用string 类的Split 方法分割字符串,然后再通过“\n”回车换行符将分割 的字符串换行显示。根据标点符号分行的代码如下: string oldstr = textBox1.Text.Trim(); string[] newstr = oldstr.Split('。'); for (int i = 0; i < newstr.Length; i++) { if (richTextBox1.Text == "") richTextBox1.Text = newstr[i].ToString(); else richTextBox1.Text += "\n" + newstr[i].ToString(); } 第19章 加密与解密技术 839 实例576 使用one-time pad算法加密数据 光盘位置:光盘\MR\19\576 高级 趣味指数: 实 例说明 在密码学里,有一种理想的加密方案,叫做一次一密乱码本,即 one-time pad 算法,该算法是最安全的加密算法,双方一旦安全交换 了密钥,之后交换信息的过程就可以保证绝对安全。本实例使用C# 实现了one-time pad 加密算法,实例运行效果如图19.6 所示。  注意:程序中使用one-time pad 算法时,一定要保证密钥和密文 的长度是一样的。 关 键技术 本实例在实现one-time pad 加密算法时,主要用到了Encoding 类的GetBytes 方法和GetString 方法,下面 分别对它们进行详细介绍。 (1)Encoding 类的GetBytes方法 Encoding 类表示字符编码,其GetBytes方法主要用来将一组字符编码为一个字节序列,该方法为可重载方 法,本实例中用到的它的重载形式如下: public virtual byte[] GetBytes(string s) 参数说明  s:字符串。  返回值:一个字节数组,包含对指定的字符集进行编码的结果。  说明:Encoding 类位于System.Text 命名空间下。 (2)Encoding 类的GetString方法 Encoding 类的GetString方法主要用来将一个字节序列解码为一个字符串,该方法为可重载方法,本实例中 用到的它的重载形式如下: public virtual string GetString(byte[] bytes) 参数说明  bytes:包含要解码的字节序列的字节数组。  返回值:包含指定字节序列解码结果的字符串。 设 计过程 (1) 打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为OneTimePadArithmetic。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加4 个TextBox 控件,分别用来输入 要加密的数据和密钥,以及显示加密后的数据和解密后的数据;添加两个Button控件,分别用来实现使用one-time pad 算法加密数据和解密数据的功能。 (3)程序主要代码如下。 在Frm_Main 窗体中输入要加密的数据和密钥后,单击“加密”按钮,使用one-time pad 算法对输入的数据 进行加密,实现代码如下: private void button1_Click(object sender, EventArgs e) { textBox2.Text = ""; //清空文本框 Encoding encoding = Encoding.Default; //获取字符编码 byte[] btData = encoding.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 byte[] btKey = encoding.GetBytes(textBox4.Text); //将密钥转换为字节数组 图19.6 使用one-time pad 算法加密数据 C#开发实战1200 例(第II卷) 840 if (btData.Length == btKey.Length) //判断长度是否相等 { byte[] btEncrypt = Encrypt(btData, btKey); //加密数据 for (int i = 0; i < btEncrypt.Length; i++) //遍历加密后的字节数组 { textBox2.Text += btEncrypt[i]; //显示在文本框中 } } } 上面的代码中用到了Encrypt 方法,该方法为自定义的、返回值类型为byte[]的方法,主要用来对指定的数 据使用one-time pad 算法进行加密。Encrypt方法的实现代码如下: public static byte[] Encrypt(byte[] btData, byte[] btKey) { if (btKey.Length != btData.Length) //判断长度是否相等 { MessageBox.Show("请确保要加密数据的长度与密钥的长度一致!"); } byte[] btResult = new byte[btData.Length]; //声明一个字节数组,用来存储加密数据 for (int i = 0; i < btResult.Length; ++i) //遍历字节数组 { btResult[i] = (byte)(btKey[i] ^ btData[i]); //为字节数组赋值 } return btResult; //返回得到的加密数据 } 单击“解密”按钮,调用Encrypt 方法对加密过的数据进行逆向加密,并返回一个byte[]数组,然后使用 Encoding 类的GetString方法从该数组中获取解密字符串。“解密”按钮的Click事件的代码如下: private void button2_Click(object sender, EventArgs e) { Encoding encoding = Encoding.Default; //获取字符编码 byte[] btData = encoding.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 byte[] btKey = encoding.GetBytes(textBox4.Text); //将密钥转换为字节数组 if (btData.Length == btKey.Length) //判断长度是否相等 { byte[] btDecrypt = Encrypt(Encrypt(btData, btKey), btKey); //解密数据 textBox3.Text = encoding.GetString(btDecrypt); //将解密后的字节数组转换为字符串并显示 } } 秘 笈心法 心法领悟576:如何在字符串中添加多个空格? 开发程序时,有时会根据需要在字符串中添加一些空格,这时可以使用string 类的Insert方法,该方法可以 在字符串中的指定位置插入一个新的字符串(包括空格)。在字符串中添加空格的代码如下: textBox3.Text = textBox1.Text.Insert(Convert.ToInt32(textBox2.Text.Trim()), " "); 实例577 使用伪随机数加密技术加密用户登录密码 光盘位置:光盘\MR\19\577 高级 趣味指数: 实 例说明 为了保障用户登录密码的安全,本实例使用伪随机数技术对用 户的登录密码进行加密,运行本实例,当用户在“登录密码”文本 框中输入登录密码时,程序会自动将使用过伪随机数加密技术加密 过的登录密码显示在下面的“加密密码”文本框中,单击“登录” 按钮,程序对“加密密码”文本框中的加密数据进行解密,然后再 与用户输入的登录密码相比较,如果相同,则登录成功;否则,登 录失败。实例运行效果如图19.7 所示。 图19.7 使用伪随机数加密技术 加密用户登录密码 第19章 加密与解密技术 841 关 键技术 本实例对用户登录密码加密时用到伪随机数加密技术,伪随机数加密技术实质上就是通过伪随机数序列使 登录密码字符串的字节值发生变化而产生密文,由于相同的初值能得到相同的随机数序列,因此,可以采用同 样的伪随机数序列来对密文进行解密。产生伪随机数时主要用到Random 类,该类表示伪随机数生成器,它是 一种能够产生满足某些随机性统计要求的数字序列的设备,其Next方法用来返回随机数,语法格式如下: public virtual int Next(int maxValue) 参数说明  maxValue:要生成的随机数的上界(随机数不能取该上界值),maxValue 必须大于等于零。  返回值:大于等于零且小于maxValue 的32 位带符号整数,即返回值的范围通常包括零但不包括 maxValue;不过,如果maxValue 等于零,则返回maxValue。 设 计过程 (1)打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为PRanDataEncrypt。 (2)更改默认窗体Form1 的Name属性为Frm_Main,在该窗体中添加3 个TextBox 控件,分别用来输入 登录用户、登录密码和显示加密密码;添加两个Button 控件,分别用来执行用户登录和清空文本框操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码中,首先定义加密用户密码所用的伪随机数,代码如下: //定义加密用户密码所用的伪随机数 private string randStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; 当在“登录密码”文本框中输入登录密码时,实时将使用伪随机数加密过的登录密码显示在“加密密码” 文本框中,实现代码如下: private void textBox2_TextChanged(object sender, EventArgs e) { textBox3.Text = EncryptPwd(textBox2.Text); //显示加密后的用户登录密码 } 上面的代码中用到EncryptPwd 方法,该方法为自定义的、返回值类型为string 的方法,主要用来使用伪随 机数技术加密用户登录密码,它有一个参数,用来表示用户登录密码。EncryptPwd 方法的实现代码如下: /// /// 使用伪随机数加密用户登录密码 /// /// 用户登录密码 /// 加密后的用户登录密码 private string EncryptPwd(string str) { byte[] btData = Encoding.Default.GetBytes(str); //将登录密码转换为字节数组 int j, k, m; int len = randStr.Length; //记录伪随机数长度 StringBuilder sb = new StringBuilder(); //创建StringBuilder对象 Random rand = new Random(); //创建Random 对象 for (int i = 0; i < btData.Length; i++) { j = (byte)rand.Next(6); //产生伪随机数 btData[i] = (byte)((int)btData[i] ^ j); //使用伪随机数对密码字节数组进行移位 k = (int)btData[i] % len; m = (int)btData[i] / len; m = m * 8 + j; sb.Append(randStr.Substring(k, 1) + randStr.Substring(m, 1)); //组合加密字符串 } return sb.ToString(); //返回生成的加密字符串 } 单击“登录”按钮,判断“加密密码”文本框是否为空。如果不为空,调用DecryptPwd 方法解密“加密 密码”文本框中的字符串;然后使用解密后的字符串与“登录密码”文本框中的字符串相比较,如果相同,则 用户登录成功;否则,弹出提示信息。“登录”按钮的Click事件代码如下: C#开发实战1200 例(第II卷) 842 private void button1_Click(object sender, EventArgs e) { if (textBox3.Text != "") { if (DecryptPwd(textBox3.Text) == textBox2.Text) //对加密过的登录密码进行解密 MessageBox.Show("用户登录成功!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information); else MessageBox.Show("用户密码错误!", "错误", MessageBoxButtons.OK, MessageBoxIcon.Error); } } 上面的代码中用到了DecryptPwd 方法,该方法为自定义的、返回值类型为string 的方法,主要用来解密用 户登录密码,它有一个参数,主要用来表示经过加密的用户登录密码。DecryptPwd 方法的实现代码如下: /// /// 解密用户登录密码 /// /// 经过加密的用户登录密码 /// 解密后的用户登录密码 private string DecryptPwd(string str) { try { int j, k, m, n = 0; int len = randStr.Length; //获取伪随机数长度 byte[] btData = new byte[str.Length / 2]; //定义一个字节数组,并指定长度 for (int i = 0; i < str.Length; i += 2) //对登录密码进行解密 { k = randStr.IndexOf(str[i]); m = randStr.IndexOf(str[i + 1]); j = m / 8; m = m - j * 8; btData[n] = (byte)(j * len + k); btData[n] = (byte)((int)btData[n] ^ m); n++; } return Encoding.Default.GetString(btData); //返回解密后的登录密码 } catch { return ""; } } 秘 笈心法 心法领悟577:如何将字符串颠倒输出? 颠倒输出字符串时,可以先将要输出的字符串保存到一个char 类型的数组中,然后使用Array 类的Reverse 方法。将字符串颠倒输出的代码如下: string str1 = textBox1.Text.Trim(); char[] charstr = str1.ToCharArray(); Array.Reverse(charstr); string str2 = new string(charstr); textBox2.Text = str2; 实例578 以XML格式导入导出密钥 光盘位置:光盘\MR\19\578 高级 趣味指数: 实 例说明 本实例主要实现以XML 格式导入导出密钥,从而实现对数据进行加密和解密的功能。运行本实例,首先 在窗体中显示生成的公钥和私钥,然后输入明文数据,单击“加密”按钮,对输入的明文数据进行加密;单击 “解密”按钮,对加密后的数据进行解密。实例运行效果如图19.8 所示。 第19章 加密与解密技术 843 图19.8 以XML 格式导入导出密钥 关 键技术 本实例实现时主要用到了RSACryptoServiceProvider 类的ToXmlString方法、Encrypt 方法和Decrypt 方法, 下面对本实例中用到的关键技术进行详细讲解。 (1)RSACryptoServiceProvider 类的ToXmlString方法 RSACryptoServiceProvider 类用来使用加密服务提供程序(CSP)提供的RSA 算法的实现执行不对称加密和 解密,其ToXmlString 方法主要用来创建并返回包含当前RSA 对象的密钥的XML 字符串,该方法的语法格式 如下: public override string ToXmlString(bool includePrivateParameters) 参数说明  includePrivateParameters:true 表示同时包含RSA公钥和私钥,false 表示仅包含公钥。  返回值:包含当前RSA对象的密钥的XML字符串。  说明:RSACryptoServiceProvider 类位于System.Security.Cryptography 命名空间下。 (2)RSACryptoServiceProvider 类的Encrypt方法 该方法主要使用RSA算法对数据进行加密,其语法格式如下: public byte[] Encrypt(byte[] rgb,bool fOAEP) 参数说明  rgb:要加密的数据。  fOAEP:如果为true,则使用OAEP 填充(仅在运行Microsoft Windows XP 或更高版本的计算机上可用) 执行直接的RSA 加密;如果为false,则使用PKCS#1 1.5 版填充。  返回值:字节数组,表示已加密的数据。 (3)RSACryptoServiceProvider 类的Decrypt方法 该方法主要使用RSA算法对数据进行解密,其语法格式如下: public byte[] Decrypt(byte[] rgb,bool fOAEP) 参数说明  rgb:要解密的数据。  fOAEP:如果为true,则使用OAEP 填充(仅在运行Microsoft Windows XP 或更高版本的计算机上可用) 执行直接的RSA 解密;如果为false,则使用PKCS#1 1.5 版填充。  返回值:字节数组,表示已解密的数据,它是加密前的原始纯文本。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为KeyToXML。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加5 个TextBox 控件,分别用来显示 C#开发实战1200 例(第II卷) 844 公钥、显示私钥、输入明文数据、显示加密后的数据和显示解密后的数据;添加两个Button 控件,分别用来执 行数据加密和解密操作。 (3)程序主要代码如下。 在Frm_Main 窗体的后台代码中,首先创建RSACryptoServiceProvider 对象,并且定义一个字节数组,用来 存储临时数据,代码如下: RSACryptoServiceProvider RSACrypto = new RSACryptoServiceProvider(); //创建RSA 算法加密解密对象 byte[] M_bt_Data; //定义一个字节数组,用来存储临时数据 Frm_Main 窗体加载时,在文本框中显示程序自动生成的公钥和私钥数据,代码如下: private void Frm_Main_Load(object sender, EventArgs e) { this.textBox1.Text = RSACrypto.ToXmlString(true); //显示生成的公钥 this.textBox2.Text = RSACrypto.ToXmlString(false); //显示生成的私钥 } 当用户输入明文数据之后,单击“加密”按钮,调用RSACryptoServiceProvider 类的Encrypt方法对数据进 行加密,并且使用Encoding 类的UTF8 编码方式的GetString 方法得到加密后的数据,显示在文本框中。“加密” 按钮的Click事件代码如下: private void button1_Click(object sender, EventArgs e) { if (textBox3.Text != "") //判断是否输入了要加密的数据 { byte[] P_bt_Encrypt = Encoding.UTF8.GetBytes(textBox3.Text); //将要加密的数据转换为字节数组 M_bt_Data = RSACrypto.Encrypt(P_bt_Encrypt, false); //加密数据 textBox4.Text = Encoding.UTF8.GetString(M_bt_Data); //显示加密数据 } } 单击“解密”按钮,调用RSACryptoServiceProvider 类的Decrypt方法对加密过的数据进行解密,并且使用 Encoding 类的UTF8 编码方式的GetString 方法得到解密后的数据,显示在文本框中。“解密”按钮的Click 事 件代码如下: private void button2_Click(object sender, EventArgs e) { if (textBox4.Text != "") //判断是否有加密过的数据 { byte[] P_bt_Decrypt = RSACrypto.Decrypt(M_bt_Data, false); //对数据进行解密 textBox5.Text = Encoding.UTF8.GetString(P_bt_Decrypt); //显示解密数据 } } 秘 笈心法 心法领悟578:如何判断字符串是否为日期格式? 判断字符串是否为日期格式时,可以使用正则表达式。验证日期格式的正则表达式主要有以下3 种: \b(?\d{2,4})/(?\d{1,2})/(?\d{1,2})\b 或 \b(?\d{2,4})-(?\d{1,2})-(?\d{1,2})\b 或 \b(?\d{2,4})年(?\d{1,2})月(?\d{1,2})日\b 实例579 以参数格式导入导出密钥 光盘位置:光盘\MR\19\579 高级 趣味指数: 实 例说明 本实例主要实现以参数格式导入导出密钥,从而实现对数据进行加密和解密的功能。运行本实例,在窗体 第19章 加密与解密技术 845 中输入明文数据,单击“加密”按钮,对输入的明文数据进行加密;单击“解 密”按钮,对加密后的数据进行解密。实例运行效果如图19.9 所示。 关 键技术 本实例实现时主要用到了RSACryptoServiceProvider 类的ExportParameters 方法、ImportParameters 方法、Encrypt 方法和Decrypt 方法,下面对本实例 中用到的关键技术进行详细讲解。 (1)RSACryptoServiceProvider 类的ExportParameters 方法 该方法主要用来导出RSAParameters标准参数,其语法格式如下: public override RSAParameters ExportParameters(bool includePrivateParameters) 参数说明  includePrivateParameters:如果要包括私有参数,则为true;否则为false。  返回值:RSA 算法的标准参数。 (2)RSACryptoServiceProvider 类的ImportParameters 方法 该方法主要用来导入指定的RSAParameters标准参数,其语法格式如下: public override void ImportParameters(RSAParameters parameters) 参数说明 parameters:RSA 算法的标准参数。  说明:关于RSACryptoServiceProvider 类的Encrypt 方法和Decrypt 方法的详细讲解,请参见实例578 中的 关键技术。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为KeyToParameter。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加3 个TextBox 控件,分别用来输入 明文数据、显示加密后的数据和解密后的数据;添加两个Button 控件,分别用来执行数据加密和解密操作。 (3)程序主要代码如下。 Frm_Main 窗体的后台代码中,首先创建RSACryptoServiceProvider 对象和RSAParameters 标准参数对象, 并且定义一个字节数组,用来存储临时数据,代码如下: RSACryptoServiceProvider RSACrypto; //声明RSA 算法加密解密对象 RSAParameters RSAParame; //声明RSAParameters 参数对象 byte[] M_bt_Data; //定义一个字节数组,用来存储临时数据 在Frm_Main 窗体的构造函数中,调用RSACryptoServiceProvider 类的ImportParameters 方法导入 RSAParameters标准参数,实现代码如下: public Frm_Main() { InitializeComponent(); RSACrypto = new RSACryptoServiceProvider(); //初始化RSA 算法加密解密对象 RSAParame = RSACrypto.ExportParameters(true); //初始化RSAParameters 参数 RSACrypto.Clear(); //清空RSACryptoServiceProvider 对象 RSACrypto = new RSACryptoServiceProvider(); //初始化RSA 算法加密解密对象 RSACrypto.ImportParameters(RSAParame); //导入密钥 } 当用户输入明文数据之后,单击“加密”按钮,调用RSACryptoServiceProvider 类的Encrypt方法对数据进 行加密,并且使用Encoding 类的UTF8 编码方式的GetString 方法得到加密后的数据,显示在文本框中。“加密” 按钮的Click事件代码如下: private void button1_Click(object sender, EventArgs e) { if (textBox1.Text != "") //判断是否输入了要加密的数据 { 图19.9 以参数格式导入导出密钥 C#开发实战1200 例(第II卷) 846 byte[] P_bt_Encrypt = Encoding.UTF8.GetBytes(textBox1.Text); //将要加密的数据转换为字节数组 M_bt_Data = RSACrypto.Encrypt(P_bt_Encrypt, false); //加密数据 textBox2.Text = Encoding.UTF8.GetString(M_bt_Data); //显示加密数据 } } 单击“解密”按钮,调用RSACryptoServiceProvider 类的Decrypt方法对加密过的数据进行解密,并且使用 Encoding 类的UTF8 编码方式的GetString 方法得到解密后的数据,显示在文本框中。“解密”按钮的Click 事 件代码如下: private void button2_Click(object sender, EventArgs e) { if (textBox2.Text != "") //判断是否有加密过的数据 { byte[] P_bt_Decrypt = RSACrypto.Decrypt(M_bt_Data, false); //对数据进行解密 textBox3.Text = Encoding.UTF8.GetString(P_bt_Decrypt); //显示解密数据 } } 秘 笈心法 心法领悟579:巧截字符串中的数字。 截取字符串中的数字时,可以先使用CharEnumerator 对象的MoveNext 方法循环访问字符串中的每个字符, 并将字符用System.Text.Encoding 类中ASCII 编码方式的GetBytes 方法进行编码,然后判断经过编码之后的字符 的ASCII码值是否介于48和57之间,如果是,则将其显示在textBox文本框中。截取字符串中数字的代码如下: CharEnumerator CEnumerator = textBox1.Text.GetEnumerator(); while (CEnumerator.MoveNext()) { byte[] array = new byte[1]; array = System.Text.Encoding.ASCII.GetBytes(CEnumerator.Current.ToString()); int asciicode = (short)(array[0]); if (asciicode >= 48 && asciicode <= 57) { textBox2.Text += CEnumerator.Current.ToString(); } } 19.2 文件的加密与解密 实例580 文本文件加密与解密 光盘位置:光盘\MR\19\580 高级 趣味指数: 实 例说明 在本实例的窗体中,首先选择要加密或解密的文本文件,然后单击“加 密”或“解密”按钮对文本文件进行加密或解密。实例运行效果如图19.10 所示。 关 键技术 本实例实现时主要用到了System.Security.Cryptography命名空间下的 RijndaelManaged 类的CreateDecryptor 方法、CreateEncryptor 方法和CryptoStream 类的Write 方法,下面对本实 例中用到的关键技术进行详细讲解。 (1)RijndaelManaged 类 该类是访问System.Security.Cryptography.Rijndael 对称加密算法的托管版本,其语法格式如下: public sealed class RijndaelManaged : Rijndael 图19.10 文本文件加密与解密 第19章 加密与解密技术 847  注意:此算法支持128、192或256 位的密钥长度。 (2)CreateDecryptor 方法 该方法位于RijndaelManaged 类中,使用指定的Key和初始化向量(IV)创建对称的Rijndael 解密器对象, 其语法格式如下: public override IcryptoTransform CreateDecryptor (byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的机密密钥。  rgbIV:用于对称算法的IV。  返回值:对称的Rijndael 解密器对象。 (3)CreateEncryptor 方法 该方法位于RijndaelManaged 类中,使用指定的Key和初始化向量(IV)创建对称的Rijndael 加密器对象, 其语法格式如下: public override ICryptoTransform CreateEncryptor (byte[] rgbKey,byte[] rgbIV) 参数说明  rgbKey:用于对称算法的机密密钥。  rgbIV:用于对称算法的IV。  返回值:对称的Rijndael 加密器对象。  说明:关于CryptoStream 类的Write 方法的详细讲解,请参见实例575中的关键技术。 设 计过程 (1) 打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为EncryptTextFileOne。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加一个TextBox 控件,用来显示文本 文件路径;添加一个OpenFileDialog 控件,用来选择要加密或解密的文本文件;添加3 个Button 控件,用来执 行选择文本文件、加密和解密操作。 (3)程序主要代码如下。 单击“加密”按钮实现对选择的文本文件进行加密,“加密”按钮的Click事件的代码如下: private void button2_Click(object sender, EventArgs e) { if (textBox1.Text == "") //若未选择要加密的文本文件 { MessageBox.Show("请选择要加密的文件"); } //如果没有选择则弹出提示 else { try{ string strPath = textBox1.Text; //加密文件的路径 int intLent=strPath.LastIndexOf("\\")+1; //设置截取的起始位置 int intLong = strPath.Length; //设置截取的长度 string strName = strPath.Substring(intLent,intLong-intLent); //要加密的文件名称 int intTxt = strName.LastIndexOf("."); //设置截取的起始位置 int intTextLeng = strName.Length; //设置截取的长度 string strTxt = strName.Substring(intTxt,intTextLeng-intTxt); //取出文件的扩展名 strName = strName.Substring(0,intTxt); //加密后的文件名及路径 string strOutName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + "Out" + strTxt; //加密文件密钥 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 }; byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; RijndaelManaged myRijndael = new RijndaelManaged(); FileStream fsOut = File.Open(strOutName, FileMode.Create, FileAccess.Write); FileStream fsIn = File.Open(strPath, FileMode.Open, FileAccess.Read); //写入加密文本文件 CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateEncryptor(key, IV), CryptoStreamMode.Write); BinaryReader br = new BinaryReader(fsIn); //创建阅读器来读加密文本 csDecrypt.Write(br.ReadBytes((int)fsIn.Length), 0, (int)fsIn.Length); //将数据写入加密文本 C#开发实战1200 例(第II卷) 848 csDecrypt.FlushFinalBlock(); csDecrypt.Close(); //关闭CryptoStream 对象 fsIn.Close(); //关闭FileStream 对象 fsOut.Close(); //关闭FileStream 对象 if (MessageBox.Show("加密成功!加密后的文件名及路径为:\n" + strOutName + ",是否删除源文件", "信息提示", MessageBoxButtons. YesNo) == DialogResult.Yes) { File.Delete(strPath); //删除指定文件 textBox1.Text = ""; //清空文本框 }else { textBox1.Text = ""; } } catch (Exception ee) //如果出现异常 { MessageBox.Show(ee.Message); //输出异常信息 } } } 单击“解密”按钮实现对加密的文本文件进行解密,“解密”按钮的Click事件代码如下: private void button3_Click(object sender, EventArgs e) { if (textBox1.Text == "") //若未选择要解密的文件 { MessageBox.Show("请选择要解密的文件路径"); //如果没有选择则弹出提示 } else { string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; //设置截取字符串的起始位置 int intLong = strPath.Length; //设置截取长度 string strName = strPath.Substring(intLent, intLong - intLent); //要加密的文件名称 int intTxt = strName.LastIndexOf("."); //截取字符串的起始位置 int intTextLeng = strName.Length; //截取长度 strName = strName.Substring(0, intTxt); //获取扩展名 if (strName.LastIndexOf("Out") != -1) { strName = strName.Substring(0, strName.LastIndexOf("Out")); } else { strName = strName + "In"; } //加密后的文件名及路径 string strInName = strPath.Substring(0, strPath.LastIndexOf("\\") + 1) + strName + ".txt"; //解密文件密钥 byte[] key = { 24, 55, 102, 24, 98, 26, 67, 29, 84, 19, 37, 118, 104, 85, 121, 27, 93, 86, 24, 55, 102, 24, 98, 26, 67, 29, 9, 2, 49, 69, 73, 92 }; byte[] IV ={ 22, 56, 82, 77, 84, 31, 74, 24, 55, 102, 24, 98, 26, 67, 29, 99 }; RijndaelManaged myRijndael = new RijndaelManaged(); //创建RijndaelManaged 对象 //创建FileStream 对象 FileStream fsOut = File.Open(strPath, FileMode.Open, FileAccess.Read); CryptoStream csDecrypt = new CryptoStream(fsOut, myRijndael.CreateDecryptor(key, IV), CryptoStreamMode.Read); StreamReader sr = new StreamReader(csDecrypt); //把文件读出来 StreamWriter sw = new StreamWriter(strInName); //解密后写入一个新文件 sw.Write(sr.ReadToEnd()); sw.Flush(); sw.Close(); sr.Close(); fsOut.Close(); if (MessageBox.Show("解密成功!解密后的文件名及路径为:"+strInName+",是否删除源文件", "信息提示", MessageBoxButtons.YesNo) == DialogResult.Yes) { File.Delete(strPath); //删除指定文件 textBox1.Text = ""; //清空文本框 } else { 第19章 加密与解密技术 849 textBox1.Text = ""; } } } 秘 笈心法 心法领悟580:如何存储变长字符串? 在程序中存储变长字符串时,需要使用StringBuilder对象。相对于string 对象来说,StringBuilder 对象是可 变的,不用生成中间对象,因此,在连接的字符串较多或字符串长度较长时,通常都使用StringBuilder 对象。 实例581 利用图片加密文件 光盘位置:光盘\MR\19\581 高级 趣味指数: 实 例说明 本实例在加密时,使用指定的图片生成加密密钥,然后对文本文件进 行加密;在解密时,使用加密时的图片生成解密密钥,然后对加密的文本 文件进行解密。运行本实例,首先打开一张图片,用来生成加密或解密的 密钥,然后选择要加密或解密的文本文件,最后单击“加密”或“解密” 按钮,实现对文本文件的加密或解密。实例运行效果如图19.11 所示。 关 键技术 本实例实现时主要用到了RC2CryptoServiceProvider 类、BinaryWriter 类的Write 方法、File 类的Delete 方法和Copy 方法,下面对本实例中用到 的关键技术进行详细讲解。 (1)RC2CryptoServiceProvider 类 该类定义访问RC2算法的加密服务提供程序(CSP)实现的包装对象,无法继承此类。 (2)BinaryWriter 类 该类以二进制形式将基元类型写入流,并支持用特定的编码写入字符串,其构造器的语法格式如下: public BinaryWriter (Stream output) 参数说明 output:表示输出流。 (3)BinaryWriter 类的Write 方法 该方法将一个无符号字节写入当前流,并将流的位置提升一个字节,其语法格式如下: public virtual void Write (byte value) 参数说明 value:表示要写入的无符号字节。 (4)File 类的Delete 方法 File 类提供用于创建、复制、删除、移动和打开文件的静态方法,并协助创建FileStream 对象,该类是个 静态类,其Delete方法用于删除指定的文件,如果指定的文件不存在,则引发异常。该方法的语法格式如下: public static void Delete (string path) 参数说明 path:表示要删除的文件的名称。 (5)File 类的Copy 方法 该方法将现有文件复制到新文件,不允许改写同名的文件,其语法格式如下: public static void Copy (string sourceFileName,string destFileName) 图19.11 利用图片加密文件 C#开发实战1200 例(第II卷) 850 参数说明  sourceFileName:要复制的文件。  destFileName:目标文件的名称,不能是一个目录或现有文件。 设 计过程 (1) 打开Visual Studio 2008开发环境,新建一个Windows窗体应用程序,并将其命名为EncryptTextFileTwo。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加一个TextBox 控件,用来显示加密 或解密文件的路径;添加一个OpenFileDialog 控件,用来选择要加密或解密的文件和打开密钥的图片;添加4 个Button 控件,分别用来执行加密、解密、打开文件和打开图片操作;添加一个PictureBox 控件,用于显示密 钥图片。 (3)程序主要代码如下。 单击“加密”按钮,实现利用图片对文本文件进行加密的功能,“加密”按钮的Click 事件的代码如下: private void button3_Click(object sender, EventArgs e) { try { if (pictureBox1.ImageLocation==null) //判断是否选择了图片 { MessageBox.Show("请选择一幅图片用于加密"); return; } //如果没有选择则弹出提示 if (textBox1.Text == "") //若未选择需要加密的文件 { MessageBox.Show("请选择加密文件路径"); return; } //如果没有选择则弹出提示 //图片流 FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //加密文件流 FileStream fsText = new FileStream(textBox1.Text, FileMode.Open, FileAccess.Read); //初始化对称算法的密钥和向量 byte[] bykey = new byte[16]; //定义存储密钥的字节数组 byte[] byIv = new byte[8]; //定义存储向量的字节数组 fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区 fsPic.Read(byIv, 0, 8); //把图片流写入向量缓冲区 //临时加密文件 string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; int intLong = strPath.Length; string strName = strPath.Substring(intLent, intLong - intLent); //要加密的文件名称 string strLinPath = "C:\\" + strName; //临时加密文件路径 FileStream fsOut = File.Open(strLinPath, FileMode.Create, FileAccess.Write); //开始加密,首先创建RC2CryptoServiceProvider 对象 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider(); BinaryReader br = new BinaryReader(fsText); //创建BinaryReader 对象 //创建CryptoStream 对象,用于写入临时加密文件 CryptoStream cs = new CryptoStream(fsOut, desc.CreateEncryptor(bykey, byIv), CryptoStreamMode.Write); cs.Write(br.ReadBytes((int)fsText.Length), 0, (int)fsText.Length); //写入加密流 cs.FlushFinalBlock(); cs.Flush(); cs.Close(); fsPic.Close(); fsText.Close(); fsOut.Close(); File.Delete(textBox1.Text.TrimEnd()); //删除原文件 File.Copy(strLinPath, textBox1.Text); //复制加密文件 File.Delete(strLinPath); //删除临时文件 MessageBox.Show("加密成功"); pictureBox1.ImageLocation = null; textBox1.Text = ""; } catch (Exception ee) { MessageBox.Show(ee.Message); } } 第19章 加密与解密技术 851 单击“解密”按钮,实现利用图片对加密的文本文件进行解密的功能,“解密”按钮的Click事件的代码如下: private void button4_Click(object sender, EventArgs e) { try { //图片流 FileStream fsPic = new FileStream(pictureBox1.ImageLocation, FileMode.Open, FileAccess.Read); //解密文件流 FileStream fsOut = File.Open(textBox1.Text, FileMode.Open, FileAccess.Read); //初始化对称算法的密钥和向量 byte[] bykey = new byte[16]; //定义存储密钥的字节数组 byte[] byIv = new byte[8]; //定义存储向量的字节数组 fsPic.Read(bykey, 0, 16); //把图片流写入密钥缓冲区 fsPic.Read(byIv, 0, 8); //把图片流写入向量缓冲区 //创建临时解密文件 string strPath = textBox1.Text; //加密文件的路径 int intLent = strPath.LastIndexOf("\\") + 1; //获取不含文件名的路径长度 int intLong = strPath.Length; //获取含文件名的路径长度 //获取要解密文件的名称,即加密文件的名称 string strName = strPath.Substring(intLent, intLong - intLent); string strLinPath = "C:\\" + strName; //临时解密文件路径 FileStream fs = new FileStream(strLinPath, FileMode.Create, FileAccess.Write); //开始解密,首先创建RC2CryptoServiceProvider 对象 RC2CryptoServiceProvider desc = new RC2CryptoServiceProvider(); //创建CryptoStream 对象,用于读取加密文件 CryptoStream csDecrypt = new CryptoStream(fsOut, desc.CreateDecryptor(bykey, byIv), CryptoStreamMode.Read); BinaryReader sr = new BinaryReader(csDecrypt); //创建BinaryReader 对象 BinaryWriter sw = new BinaryWriter(fs); //创建BinaryWriter 对象 sw.Write(sr.ReadBytes(Convert.ToInt32(fsOut.Length))); //写入解密流 sw.Flush(); sw.Close(); sr.Close(); fs.Close(); fsOut.Close(); fsPic.Close(); csDecrypt.Flush(); File.Delete(textBox1.Text.TrimEnd()); //删除原文件 File.Copy(strLinPath, textBox1.Text); //复制加密文件 File.Delete(strLinPath); //删除临时文件 MessageBox.Show("解密成功"); //弹出提示信息 pictureBox1.ImageLocation = null; //清空图片 textBox1.Text = ""; //清空文本框 } catch (Exception ee) //如果出现异常 { MessageBox.Show(ee.Message); //输出异常 } } 秘 笈心法 心法领悟581:如何去除字符串尾空格? 去除字符串尾空格需要使用string 类的Trim 方法,该方法用来从字符串的开始和末尾处移除空白字符的所 有匹配项。例如,下面的代码用来去掉textBox1 文本框中字符串的尾空格,并将结果显示在textBox2 文本框中: textBox2.Text = textBox1.Text.Trim(); 实例582 对文件进行加密保护 光盘位置:光盘\MR\19\582 高级 趣味指数: 实 例说明 随着计算机的普及,文件的安全越来越重要,本实例使用C#制作了一个对文件进行加密保护的实例。运行 C#开发实战1200 例(第II卷) 852 本实例,选择要加密或解密的文件,用程序来判断是否是加密过的文件, 如果不是,输入加密密码,单击“加密”按钮,加密已选择的文件;如果 是,输入解密密码,单击“解密”按钮,解密选择的加密文件。实例运行 效果如图19.12 所示。 关 键技术 本实例制作对文件进行加密保护程序时,首先选择要加密或解密的文 件,并输入加密或解密密码,然后启动一个新的线程,使用输入的密码对 指定的文件进行加密或解密操作。另外,如果对文件执行的是加密操作,则加密成功后删除原文件。具体实现 过程中,主要用到了DES 类的CreateEncryptor 和CreateDecryptor 方法、CryptoStream 类的构造函数及其Write 方法。  说明:关于DES 类的CreateEncryptor 方法和CreateDecryptor 方法、CryptoStream 类的构造函数及其Write 方法的详细讲解,请参见实例575中的关键技术。 设 计过程 (1)打开Visual Studio 2008 开发环境,新建一个Windows窗体应用程序,并将其命名为ProtectFile。 (2)更改默认窗体Form1 的Name 属性为Frm_Main,在该窗体中添加一个OpenFileDialog 控件,用来显 示“打开”对话框;添加两个TextBox 控件,分别用来显示选择的文件路径和输入加密、解密密码;添加3 个 Button控件,分别用来执行选择加密或解密的文件、加密文件和解密文件操作;添加一个ProgressBar控件,用 来显示加密或解密的进度。 (3)程序主要代码如下。 Frm_Main 窗体加载时,首先将加密文件
本书也是一本介绍图像技术的教材,但它有不同的视点和方式。至少有两点值得指出: 首先,作者完全采用了一种问答的形式来组织和介绍相关内容。全书从头到尾共设计了472个问题(很多是由学生提出来的),有问有答,循序渐进,逐步将各种图像技术依次介绍。这种形式除能帮助课堂教学外,也很适合自学,因为每一段都解决了一个疑问,对自学者会很有吸引力。书中还有383个详细的示例,不仅方便读者学习,对讲授相关课程的教师也是一个很好的资源。 其次,作者对基本内容和高级内容进行了划分。但与许多教材中这两部分内容不相重合、后者是前者的延伸不同,该书两部分内容密切相关、后者对应前者的更深层次。从其安排来看,基本内容是主干,而高级内容(放在63个框内,且有161个配合示例,编号前均加B)则分布在书中与相关基本内容对应的位置。如果把基本内容看作一个主程序,那么这些高级内容部分就像子程序,随时可在需要处调用。 本书是一本篇幅较大的书,从结构上看,有7章共27节。全书共有编了号的图307个(其中10个为彩图)、表格25个、公式1892个。另外有一个约80篇参考文献的目录,以及可进行索引的近400个术语。全书译成中文约合100万字(也包括图片、绘图、表格、公式等)。本书可作为已具有初步图像技术知识的相关专业高年级本科生和低年级研究生的专业基础课教材,也可供从事图像应用相关领域的科研技术人员参考。 译者基本忠实原书的结构和文字风格进行了翻译。为方便阅读,对书中问答中的问题按章节进行了编号。考虑到书中分散介绍了40多个具体算法,译文中归纳增加了一个算法列表。另外,对原书的索引,考虑中文的习惯进行了一些调整,并按中文次序进行了排列,希望能更好地服务于读者。 封面 -27 封底 -26 书名 -25 版权 -24 译者序 -19 前言 -18 目录 -16 第1章 导论 1 1.0.1 为什么要处理图像? 1 1.0.2 什么是一幅图像? 1 1.0.3 什么是一幅数字图像? 1 1.0.4 什么是一个光谱带? 1 1.0.5 为什么大多数图像处理算法都参照灰度图像进行,而实际中遇到的都是彩色图像? 2 1.0.6 一幅数字图像是如何形成的? 2 1.0.7 如果一个传感器对应物理世界中的一个小片,如何能让多个传感器对应场景中的同一个小片? 2 1.0.8 什么是图像中一个像素位置亮度的物理含义? 3 1.0.9 为什么图像常用512×512,256×256,128×128 等来表示? 4 1.0.10 需要多少个比特以存储一幅图像? 5 1.0.11 什么决定了一幅图像的质量? 5 1.0.12 什么会使得图像模糊? 5 1.0.13 图像分辨率是什么含义? 5 1.0.14 “良好对比度”是什么含义? 7 1.0.15 图像处理的目的是什么? 8 1.0.16 如何进行图像处理? 8 1.0.17 图像处理中使用非线性操作符吗? 9 1.0.18 什么是线性操作符? 9 1.0.19 如何来定义线性操作符? 9 1.0.20 一个成像装置的点扩散函数和一个线性操作符之间有什么联系? 9 1.0.21 一个线性操作符如何变换一幅图像? 9 1.0.22 点扩散函数的含义是什么? 10 B1.1 在连续空间中一个点源的正式定义 10 1.0.23 实际中如何描述一个线性操作符作用在一幅图像上的效果? 15 1.0.24 对一幅图像可使用多于一个线性操作符吗? 18 1.0.25 线性操作符使用的次序会导致结果的不同吗? 18 B1.2 因为矩阵运算次序是不能互换的,如果改变使用移不变线性操作符的次序会发生什么情况? 18 B1.3 什么是堆叠操作符? 24 1.0.26 对矩阵H结构上可分离性的假设意味着什么? 30 1.0.27 如何能将一个可分离变换写成矩阵的形式? 31 1.0.28 可分离性假设的含义是什么? 32 B1.4 可分离矩阵方程的正式推导 32 1.0.29 本章要点 34 1.0.30 式(1.108)在线性图像处理中的意义是什么? 34 1.0.31 这本书有些什么内容呢? 36 第2章 图像变换 37 2.0.1 本章概况 37 2.0.2 如何能定义一幅基本图像? 37 2.0.3 什么是两个矢量的外积? 37 2.0.4 如何可将一幅图像展开成矢量的外积? 37 2.0.5 如何选择矩阵hc和hr? 39 2.0.6 什么是酉矩阵? 39 2.0.7 酉矩阵的逆是什么样的? 39 2.0.8 如何能构建一个酉矩阵? 40 2.0.9 如何选择矩阵U和V以使表达g的比特数比f少? 40 2.0.10 什么是矩阵对角化? 40 2.0.11 可以对角化任何矩阵吗? 40 2.1 奇异值分解 40 2.1.1 如何能对角化一幅图像? 40 B2.1 可将任何图像都展开成矢量的外积吗? 43 2.1.2 如何计算图像对角化所需的矩阵U,V和Λ.? 44 B2.2 如果矩阵ggT 的本征值为负会如何? 44 2.1.3 什么是对一幅图像的奇异值分解? 47 2.1.4 能将一幅本征图像分解成多幅本征图像吗? 48 2.1.5 如何可用SVD 来近似一幅图像? 49 B2.3 SVD 的直观解释是什么? 49 2.1.6 什么是用SVD 近似一幅图像的误差? 50 2.1.7 如何能最小化重建误差? 51 2.1.8 任何图像都可以从某一组基本图像扩展出来吗? 56 2.1.9 什么是完备和正交的离散函数集合? 56 2.1.10 存在正交归一化离散值函数的完备集合吗? 57 2.2 哈尔、沃尔什和哈达玛变换 57 2.2.1 哈尔函数是如何定义的? 57 2.2.2 沃尔什函数是如何定义的? 57 B2.4 用拉德马赫函数定义的沃尔什函数 58 2.2.3 如何能用哈尔或沃尔什函数来生成图像基? 58 2.2.4 实际中如何用哈尔或沃尔什函数构建图像变换矩阵? 58 2.2.5 哈尔变换的基元图像看起来是什么样的? 61 2.2.6 可以定义元素仅为+1 或.1 的正交矩阵吗? 65 B2.5 对沃尔什函数的排列方式 65 2.2.7 哈达玛/沃尔什变换的基图像看起来是什么样的? 67 2.2.8 沃尔什和哈尔变换的优点和缺点各是什么? 69 2.2.9 什么是哈尔小波? 70 2.3 离散傅里叶变换 71 2.3.1 傅里叶变换的离散形式(DFT )是怎样的? 71 B2.6 离散傅里叶反变换是什么样的? 72 2.3.2 如何能将傅里叶变换写成矩阵形式? 72 2.3.3 用于DFT 的矩阵U是酉矩阵吗? 74 2.3.4 DFT 用来扩展图像的基元图像是什么样的? 76 2.3.5 为什么离散傅里叶变换比其他变换得到了更广泛的应用? 78 2.3.6 什么是卷积定理? 79 B2.7 如果一个函数是两个其他函数的卷积,它的DFT 与另两个函数的DFT 是什么关系? 79 2.3.7 如何显示一幅图像的离散傅里叶变换? 83 2.3.8 当图像旋转后其离散傅里叶变换将会怎么样? 84 2.3.9 当图像平移后其离散傅里叶变换将会怎么样? 85 2.3.10 图像的平均值与其DFT 有什么联系? 88 2.3.11 一幅图像放缩后其DFT 会如何变化? 89 B2.8 什么是快速傅里叶变换? 92 2.3.12 DFT 有哪些优点和缺点? 93 2.3.13 可以有实值的DFT 吗? 94 2.3.14 可以有纯虚部的DFT 吗? 96 2.3.15 一幅图像可以有纯实部或纯虚部值的DFT 吗? 101 2.4 偶对称离散余弦变换(EDCT) 101 2.4.1 什么是偶对称离散余弦变换? 101 B2.9 逆1-D 偶离散余弦变换的推导 106 2.4.2 2-D 时的逆偶余弦变换是怎样的? 107 2.4.3 用偶余弦变换扩展一幅图像时的基图像是怎样的? 107 2.5 奇对称离散余弦变换(ODCT) 109 2.5.1 什么是奇对称离散余弦变换? 109 B2.10 推导1-D 逆奇离散余弦变换 112 2.5.2 2-D 时的逆奇余弦变换是怎样的? 113 2.5.3 用奇余弦变换扩展一幅图像时的基图像是怎样的? 113 2.6 偶反对称离散正弦变换(EDST) 115 2.6.1 什么是偶反对称离散正弦变换? 115 B2.11 逆1-D 偶离散正弦变换的推导 118 2.6.2 2-D 时的逆偶正弦变换是怎样的? 119 2.6.3 用偶正弦变换扩展一幅图像时的基图像是怎样的? 119 2.6.4 如果在计算图像的EDST 前没有消除其均值会发生什么情况? 121 2.7 奇反对称离散正弦变换(ODST) 122 2.7.1 什么是奇反对称离散正弦变换? 122 B2.12 推导1-D 逆奇离散正弦变换 125 2.7.2 2-D 时的逆奇正弦变换是怎样的? 126 2.7.3 用奇正弦变换扩展一幅图像时的基图像是怎样的? 126 2.7.4 本章要点 128 第3章 图像的统计描述 130 3.0.1 本章概况 130 3.0.2 为什么需要对图像的统计描述? 130 3.1 随机场 130 3.1.1 什么是一个随机场? 130 3.1.2 什么是一个随机变量? 130 3.1.3 什么是一个随机试验? 131 3.1.4 如何用计算机做一个随机试验? 131 3.1.5 如何描述随机变量? 131 3.1.6 一个事件的概率是多少? 131 3.1.7 什么是一个随机变量的分布函数? 132 3.1.8 什么是一个随机变量取一个特殊值的概率? 133 3.1.9 什么是一个随机变量的概率密度函数? 133 3.1.10 如何描述许多随机变量? 134 3.1.11 n个随机变量互相之间有什么联系? 135 3.1.12 如何定义一个随机场? 138 3.1.13 如何能将在同一个随机场中的两个随机变量联系在一起? 139 3.1.14 如何能将在两个不同随机场中的两个随机变量联系在一起? 140 3.1.15 如果仅有系综图像中的一幅图像,可以计算期望值吗? 142 3.1.16 何时一个随机场相对于均值均匀? 142 3.1.17 何时一个随机场相对于自相关函数均匀? 142 3.1.18 如何计算一个随机场的空间统计? 143 3.1.19 实际中如何计算一幅图像随机场的空间自相关函数? 143 3.1.20 什么时候一个随机场相对于均值遍历? 144 3.1.21 什么时候一个随机场相对于自相关函数遍历? 144 3.1.22 什么是遍历性的含义? 145 B3.1 遍历性,模糊逻辑和概率理论 146 3.1.23 如何可以构建一个基元图像的基,从而用最优的方式描述完整的图像集合? 146 3.2 卡洛变换 147 3.2.1 什么是卡洛变换? 147 3.2.2 为什么一个图像集合的自协方差矩阵对角化定义了描述集合中图像所需的基? 147 3.2.3 如何变换一幅图像以使其自协方差矩阵成为对角的? 149 3.2.4 如果系综相对于自相关是平稳的,一组图像的系综自相关矩阵的形式是怎么样的? 154 3.2.5 如何根据一幅图像的矢量表达,从1-D 自相关函数得到其2-D 自相关矩阵? 155 3.2.6 如何能变换图像使其自相关矩阵成为对角的? 157 3.2.7 实际中如何计算一幅图像的卡洛变换? 158 3.2.8 如何计算系综图像的卡洛(K-L)变换? 158 3.2.9 遍历性假设切合实际吗? 158 B3.2 当一幅图像被表示成一个矢量时,如何计算该图像的空间自相关矩阵? 159 3.2.10 期望变换后图像的均值真正为0 吗? 162 3.2.11 如何能用一幅图像的卡洛变换来近似该图像? 162 3.2.12 将一幅图像的卡洛展开截断而近似该图像的误差是什么? 163 3.2.13 用卡洛变换展开一幅图像的基图像是什么样的? 163 B3.3 使用卡洛变换近似一幅图像的误差是多少? 167 3.3 独立分量分析 173 3.3.1 什么是独立分量分析(ICA)? 173 3.3.2 什么是鸡尾酒会问题? 174 3.3.3 如何解鸡尾酒会问题? 174 3.3.4 中心极限定理说些什么? 174 3.3.5 当讨论鸡尾酒会问题时说“x1(t)的采样比s1(t)或s2(t)的采样更趋向于高斯分布”是什么含义?是谈论x1(t)的时间采样还是谈论在给定时间x1(t)的所有可能版本? 174 3.3.6 如何测量非高斯性? 177 3.3.7 如何计算一个随机变量的矩? 178 3.3.8 峰度是如何定义的? 178 3.3.9 负熵是如何定义的? 180 3.3.10 熵是如何定义的? 180 B3.4 在所有方差相同的概率密度函数中,高斯函数具有最大的熵 182 3.3.11 如何计算负熵? 182 B3.5 用矩对负熵的近似推导 186 B3.6 用非二次函数近似负熵 187 B3.7 选择非二次函数以近似负熵 190 3.3.12 如何使用中心极限定理来解鸡尾酒会问题? 194 3.3.13 ICA 如何用于图像处理? 194 3.3.14 如何搜索独立分量? 195 3.3.15 如何白化数据? 196 3.3.16 如何从白化数据中选取独立分量? 196 B3.8 拉格朗日乘数法如何工作? 197 B3.9 如何选择一个能最大化负熵的方向? 198 3.3.17 实际中如何在图像处理中进行ICA? 202 3.3.18 如何将ICA 用于信号处理? 208 3.3.19 什么是独立分量分析的主要特点? 213 3.3.20 将ICA 应用于图像处理和信号处理有什么不同? 213 3.3.21 本章要点 213 第4章 图像增强 216 4.0.1 什么是图像增强? 216 4.0.2 如何能增强一幅图像? 216 4.0.3 什么是线性滤波器? 216 4.1 线性滤波器理论基础 216 4.1.1 如何定义一个2-D 滤波器? 216 4.1.2 频率响应函数和滤波器的单位采样响应是如何联系的? 217 4.1.3 为什么关心在实域中的滤波器函数? 217 4.1.4 h(k, l)需要满足什么条件才能用作卷积滤波器? 217 B4.1 2-D 理想低通滤波器的单位采样响应是什么样的? 218 4.1.5 1-D 和2-D 理想低通滤波器之间有什么联系? 221 4.1.6 如何可在实域中实现无穷延伸的滤波器? 222 B4.2 z-变换 222 4.1.7 可以为了方便而在实域中直接定义一个滤波器吗? 227 4.1.8 可以在实域中定义一个滤波器,但在频域中没有旁瓣吗? 228 4.2 消减高频噪声 228 4.2.1 一幅图像中会有什么种类的噪声? 228 4.2.2 什么是脉冲噪声? 228 4.2.3 什么是高斯噪声? 229 4.2.4 什么是加性噪声? 229 4.2.5 什么是乘性噪声? 229 4.2.6 什么是齐次噪声? 229 4.2.7 什么是零均值噪声? 229 4.2.8 什么是有偏噪声? 229 4.2.9 什么是独立噪声? 229 4.2.10 什么是不相关噪声? 230 4.2.11 什么是白噪声? 230 4.2.12 零均值不相关噪声与白噪声间有什么联系? 230 4.2.13 什么是iid 噪声? 231 4.2.14 可能有不是独立同分布的白噪声吗? 232 B4.3 一个随机变量的函数的概率密度函数 235 4.2.15 为什么噪声常与高频有关? 238 4.2.16 如何对待乘性噪声? 239 B4.4 德尔塔函数的傅里叶变换 239 B4.5 维纳-辛钦定理 239 4.2.17 对高斯噪声的假设在图像中合理吗? 240 4.2.18 如何消除散粒噪声? 240 4.2.19 什么是排序滤波器? 240 4.2.20 什么是中值滤波器? 240 4.2.21 什么是最频值滤波? 241 4.2.22 如何减小高斯噪声? 241 4.2.23 可以像加权平均滤波器那样对中值滤波器和最频值滤波器加权吗? 246 4.2.24 可以使用第2 章中的线性方法来对图像滤波吗? 247 4.2.25 如何处理图像中的混合噪声? 248 4.2.26 能在平滑图像时避免模糊它吗? 248 4.2.27 什么是边缘自适应平滑? 249 B4.6 有效计算局部方差 250 4.2.28 均移算法是如何工作的? 250 4.2.29 什么是非各向同性扩散? 252 B4.7 尺度空间和热力方程 252 B4.8 梯度,散度和拉普拉斯 253 B4.9 对一个积分相对于一个参数求导 255 B4.10 从热力学方程到非各向同性扩散算法 255 4.2.30 实际中如何实现非各向同性扩散? 256 4.3 消减低频干扰 257 4.3.1 什么时候会产生低频干扰? 257 4.3.2 变化的照明在高频也有体现吗? 257 4.3.3 还有哪些其他情况需要减少低频? 258 4.3.4 理想高通滤波器是什么样的? 258 4.3.5 如何用非线性滤波器来增强图像中的小细节? 262 4.3.6 什么是非锐化掩膜? 262 4.3.7 如何局部地使用非锐化掩膜算法? 263 4.3.8 局部自适应非锐化掩膜是如何工作的? 264 4.3.9 视网膜皮层理论算法是如何工作的? 265 B4.11 用视网膜皮层理论算法对哪些灰度值拉伸的最多? 266 4.3.10 如何增强受到变化照明影响的图像? 267 4.3.11 什么是同态滤波? 267 4.3.12 什么是光度立体视觉? 268 4.3.13 平场校正是什么意思? 268 4.3.14 平场校正是如何进行的? 268 4.4 直方图操作 269 4.4.1 什么是一幅图像的直方图? 269 4.4.2 什么时候需要改变图像的直方图? 269 4.4.3 如何改变一幅图像的直方图? 269 4.4.4 什么是直方图操作? 270 4.4.5 什么会影响一幅图像的语义信息内容? 270 4.4.6 如何能执行直方图操作并同时保留图像的信息内容? 270 4.4.7 什么是直方图均衡化? 271 4.4.8 为什么直方图均衡化程序一般并不产生具有平坦直方图的图像? 271 4.4.9 实际中如何进行直方图均衡化? 271 4.4.10 可能得到具有完全平坦直方图的图像吗? 273 4.4.11 如果不希望图像具有平坦的直方图应如何做? 273 4.4.12 实际中如何进行直方图双曲化? 273 4.4.13 如何结合随机加法进行直方图双曲化? 274 4.4.14 为什么在直方图均衡化外还需要其他处理? 275 4.4.15 如果图像具有不均匀的对比度怎么办? 275 4.4.16 可以在增加纯粹亮度过渡区的对比度时避免损坏平坦结构吗? 276 4.4.17 如何能通过仅拉伸纯粹亮度过渡区的灰度值来增强一幅图像? 277 4.4.18 实际中如何执行成对的图像增强? 278 4.5 通用去模糊算法 280 4.5.1 最频值滤波如何帮助去图像模糊? 281 4.5.2 可以在最频值滤波器中使用边缘自适应窗吗? 282 4.5.3 如何可使用均移作为通用的去模糊算法? 283 4.5.4 什么是滑降对比度增强? 283 4.5.5 实际中如何进行滑降对比度增强? 284 4.5.6 本章要点 287 第5章 图像恢复 290 5.0.1 什么是图像恢复? 290 5.0.2 为什么图像需要恢复? 290 5.0.3 什么是图像配准? 290 5.0.4 图像恢复是如何进行的? 290 5.0.5 图像增强和图像恢复的区别是什么? 290 5.1 齐次线性图像恢复:逆滤波 290 5.1.1 如何对齐次线性图像退化建模? 290 5.1.2 图像恢复问题可如何解决? 291 5.1.3 如何可以获得退化过程的频率响应函数H.(u, v)的信息? 291 5.1.4 如果已知退化过程的频率响应函数,解决图像恢复的问题是否很容易? 298 5.1.5 在频率响应函数为零处,频率会发生什么情况? 299 5.1.6 频率响应函数和图像的零点总相同吗? 299 5.1.7 如何避免噪声的放大? 299 5.1.8 实际中如何使用逆滤波? 301 5.1.9 可以定义一个自动考虑模糊图像中噪声的滤波器吗? 306 5.2 齐次线性图像恢复:维纳滤波 307 5.2.1 如何能将图像恢复问题描述成一个最小均方误差估计问题? 307 5.2.2 图像恢复问题有线性最小均方解吗? 307 5.2.3 什么是图像恢复问题的线性最小均方误差解? 308 B5.1 最小均方误差解 308 B5.2 从图像相关函数的傅里叶变换到它们的频谱密度 313 B5.3 维纳滤波器的推导 313 5.2.4 维纳滤波和逆滤波之间有什么联系? 314 5.2.5 如何确定噪声场的频谱密度? 315 5.2.6 如果不知道未知图像的统计特性,还有可能使用维纳滤波器吗? 315 5.2.7 实际中如何使用维纳滤波? 316 5.3 齐次线性图像恢复:约束矩阵求逆 319 5.3.1 如果假设退化过程是线性的,为什么要使用卷积定理而不通过解线性方程组来反演其效果? 319 5.3.2 式(5.146 )看起来非常直观,为什么还需要考虑其他方法? 320 5.3.3 有可以对矩阵H求逆的方法吗? 320 5.3.4 什么时候矩阵块轮换? 321 5.3.5 什么时候矩阵轮换? 321 5.3.6 为什么块轮换矩阵可以方便地求逆? 321 5.3.7 什么是一个轮换矩阵的本征值和本征矢量? 321 5.3.8 有关一个矩阵本征值和本征矢量的知识如何帮助对矩阵的求逆? 322 5.3.9 如何确定描述线性退化过程的矩阵H是块轮换的? 326 5.3.10 如何对角化一个块轮换矩阵? 327 B5.4 式(5.189)的证明 327 B5.5 矩阵H的转置是怎么样的? 328 5.3.11 如何克服矩阵求逆对噪声的极度敏感性? 334 5.3.12 如何将约束结合进矩阵的求逆? 335 B5.6 约束矩阵求逆滤波器的推导 338 5.3.13 维纳滤波器和约束矩阵求逆滤波器有什么联系? 339 5.3.14 实际中如何使用约束矩阵求逆? 341 5.4 非齐次线性图像恢复:旋转变换 344 5.4.1 如何对线性但非齐次的图像退化建模? 344 5.4.2 当退化矩阵不是轮换矩阵时如何使用约束矩阵求逆? 351 5.4.3 如果矩阵H非常大不能求逆怎么办? 353 B5.7 用于对大线性方程组求逆的雅克比法 354 B5.8 用于对大线性方程组求逆的高斯-赛德尔法 356 5.4.4 在例5.41、例5.43、例5.44 和例5.45 中构建的矩阵H满足使用高斯-赛德尔法或雅克比法的条件吗? 356 5.4.5 如果矩阵H不满足高斯-赛德尔法所需的条件会怎么样? 357 5.4.6 实际中如何使用梯度下降算法? 358 5.4.7 如果不知道矩阵H怎么办? 359 5.5 非线性图像恢复:MAP 估计 359 5.5.1 MAP 估计是什么意思? 359 5.5.2 如何将图像恢复问题公式化为一个MAP 估计问题? 360 5.5.3 给定退化模型和退化图像如何选择最可能的恢复像素值的组合? 360 B5.9 概率:先验,后验,条件 360 5.5.4 代价函数的最小值是唯一的吗? 361 5.5.5 如何从能最小化代价函数的所有可能解中选出一个来? 361 5.5.6 可以对一个组态x结合后验和先验概率吗? 362 B5.10 巴斯维尔定理 364 5.5.7 一般如何模型化需要最小化以恢复图像的代价函数? 366 5.5.8 当模型化联合概率密度函数时,温度参数并不改变概率取最大值的组态,那为什么要使用它? 367 5.5.9 温度参数是如何在解空间中允许聚焦或离焦的? 367 5.5.10 如何模型化组态的先验概率? 368 5.5.11 如果图像具有真正的不连续性会发生什么情况? 368 5.5.12 如何最小化代价函数? 369 5.5.13 如何从前一个解构建一个可能的新解? 369 5.5.14 如何知道何时停止迭代? 371 5.5.15 在模拟退火中如何减小温度? 371 5.5.16 实际中如何利用重要中心采样器进行模拟退火? 371 5.5.17 实际中如何利用吉伯斯采样器进行模拟退火? 372 B5.11 如何根据给定的概率密度函数取出一个随机数? 373 5.5.18 为什么模拟退火很慢? 375 5.5.19 如何能加快模拟退火? 375 5.5.20 如何能粗化组态空间? 376 5.6 几何图像恢复 376 5.6.1 如何会产生几何失真? 376 5.6.2 为什么镜头会导致失真? 377 5.6.3 如何恢复一幅几何失真的图像? 377 5.6.4 如何执行空间变换? 377 5.6.5 如何模型化镜头失真? 377 5.6.6 如何模型化非均匀失真? 379 5.6.7 如何确定空间变换模型的参数? 379 5.6.8 为什么需要灰度插值? 379 B5.12 检测线的哈夫变换 382 5.6.9 本章要点 386 第6章 图像分割和边缘检测 388 6.0.1 本章概况 388 6.0.2 图像分割和边缘检测的准确目的是什么? 388 6.1 图像分割 388 6.1.1 如何将一幅图像分成均匀的区域? 388 6.1.2 “标记”一幅图像是什么含义? 388 6.1.3 如果直方图中的谷没有被很明确地定义应怎么办? 389 6.1.4 如何最小化误分像素的数量? 389 6.1.5 如何选择最小误差阈值? 390 6.1.6 什么是目标和背景像素正态分布时的最小误差阈值? 393 6.1.7 什么是最小误差阈值方程两个解的含义? 394 6.1.8 如何估计代表目标和背景的高斯概率密度函数的参数? 395 6.1.9 最小误差阈值化方法的缺点是什么? 398 6.1.10 有能不依赖于目标和背景像素分布模型的方法吗? 398 B6.1 大津方法的推导 399 6.1.11 大津方法有什么缺点吗? 401 6.1.12 如何能对在照明变化的场合下获得的图像取阈值? 402 6.1.13 如果根据lnf(x, y)的直方图来对图像取阈值,是根据成像表面的反射性质来阈值化吗? 402 B6.2 两个随机变量和的概率密度函数 402 6.1.14 如何解决照明变化情况下直接阈值化算法会失败的问题? 403 6.1.15 如果直方图只有一个峰应怎么办? 404 6.1.16 灰度阈值化方法有什么缺点吗? 405 6.1.17 如何分割包含不均匀但感觉均匀区域的图像? 406 6.1.18 可以通过考虑像素的空间接近度来改进直方图化方法吗? 408 6.1.19 有考虑像素空间接近度的分割方法吗? 408 6.1.20 如何选择种子像素? 408 6.1.21 分裂和合并法如何工作? 409 6.1.22 什么是形态学图像重建? 409 6.1.23 如何用形态学图像重建确定水线算法所需的种子? 411 6.1.24 如何计算梯度幅度图? 411 6.1.25 在用g对f的形态学重建中,为生成模板g而从f中减去的数起什么作用? 412 6.1.26 结构元素的形状和尺寸在用g对f的形态学重建中起什么作用? 413 6.1.27 如何使用梯度幅度图像以帮助用水线算法分割图像? 419 6.1.28 在水线算法中使用梯度幅度图像有什么缺点吗? 419 6.1.29 可以用滤波来分割图像吗? 424 6.1.30 如何使用均移算法去分割图像? 424 6.1.31 什么是一个图? 425 6.1.32 能用一个图表示一幅图像吗? 425 6.1.33 如何借助一幅图像的图表达来分割它? 425 6.1.34 什么是归一化割算法? 426 B6.3 归一化割算法作为一个本征值问题 426 B6.4 如何最小化瑞利商? 433 6.1.35 实际中如何使用归一化图割算法? 435 6.1.36 与考虑像素间的相似性相对,可以通过考虑区域间的不相似性来分割图像吗? 436 6.2 边缘检测 436 6.2.1 如何测量相邻像素间的不相似性? 436 6.2.2 什么是最小可选的窗? 437 6.2.3 当图像中有噪声时会怎么样? 438 B6.5 如何选择用于边缘检测的3×3 模板的权重? 439 6.2.4 参数K的最优值是什么? 440 B6.6 索贝尔滤波器的推导 440 6.2.5 在通常情况下,如何确定一个像素是否为边缘像素呢? 444 6.2.6 实际中如何执行线性边缘检测? 445 6.2.7 索贝尔模板对所有图像都合用吗? 448 6.2.8 如果由于图像中有很显著的噪声而需要一个较大的模板, 如何选择模板的权重? 448 6.2.9 可以使用对边缘的最优滤波器以一种最优方式检测图像中的直线吗? 450 6.2.10 什么是阶跃边缘和直线间的基本差别? 450 B6.7 将一个随机噪声与一个滤波器卷积 454 B6.8 将一个有噪边缘信号与一个滤波器卷积后的信噪比计算 455 B6.9 良好局部性测度的推导 455 B6.10 虚假极值计数的推导 457 6.2.11 边缘检测能导致图像分割吗? 458 6.2.12 什么是滞后边缘连接? 458 6.2.13 滞后边缘连接能导致封闭的边缘轮廓吗? 459 6.2.14 什么是拉普拉斯-高斯边缘检测法? 460 6.2.15 有可能同时检测边缘和直线吗? 461 6.3 相位一致性和单基因信号 461 6.3.1 什么是相位一致性? 461 6.3.2 什么是1-D 数字信号的相位一致性? 462 6.3.3 如何能借助相位一致性检测直线和边缘? 462 6.3.4 为什么相位一致性与信号的局部能量最大值重合? 462 6.3.5 如何测量相位一致性? 463 6.3.6 能否简单地平均谐波分量的相位来测量相位一致性? 463 6.3.7 实际中如何测量相位一致性? 465 6.3.8 如何测量信号的局部能量? 466 6.3.9 为什么需要与两个基信号卷积以得到局部信号在基信号上的投影? 467 B6.11 连续傅里叶变换的一些性质 470 6.3.10 如果只需计算信号的局部能量,为什么不在实域的局部窗口中用帕赛瓦尔定理来计算? 477 6.3.11 如何决定使用哪个滤波器计算局部能量? 478 6.3.12 实际中如何计算一个1-D 信号的局部能量? 481 6.3.13 如何能判断局部能量的最大值对应一个对称或反对称的特征? 481 6.3.14 如何计算2-D 时的相位一致性和局部能量? 487 6.3.15 什么是解析信号? 487 6.3.16 如何推广希尔伯特变换到2-D? 487 6.3.17 如何计算一幅图像的里斯变换? 487 6.3.18 如何使用单基因信号? 488 6.3.19 如何选择要使用的偶滤波器? 488 6.3.20 本章要点 493 第7章 多光谱图像处理 495 7.0.1 什么是多光谱图像? 495 7.0.2 多光谱图像有哪些特殊的问题? 495 7.0.3 本章概述 496 7.1 多光谱图像处理 496 7.1.1 为什么会希望用其他带来替换多光谱图像的带? 496 7.1.2 一般如何从多光谱图像构建一幅灰度图像? 496 7.1.3 如何从一幅包含最大量图像信息的多光谱图像构建单个带? 496 7.1.4 什么是主分量分析? 497 B7.1 如何测量信息? 497 7.1.5 实际中如何进行主分量分析? 498 7.1.6 使用一幅图像的主分量而不是原始带的优点是什么? 499 7.1.7 使用一幅图像的主分量而不是原始带的缺点是什么? 499 7.1.8 如果对其他分量不感兴趣,有可能仅计算出一幅多光谱图像的第1 个主分量吗? 504 B7.2 用于估计一个矩阵的最大本征值的功率法 504 7.1.9 什么是光谱恒常性问题? 506 7.1.10 什么影响一个像素的光谱标记? 506 7.1.11 什么是反射函数? 506 7.1.12 成像几何影响一个像素的光谱标记吗? 506 7.1.13 成像几何如何影响一个像素所接收的光能量? 506 7.1.14 如何对朗伯表面的成像过程建模? 507 7.1.15 如何能消除一个像素的光谱对成像几何的依赖性? 507 7.1.16 如何能消除一个像素的光谱对照明源光谱的依赖性? 507 7.1.17 如果有不止一个照明源会发生什么情况? 508 7.1.18 如何能消除一个像素的光谱标记对成像几何和照明光谱的依赖性? 508 7.1.19 如果成像表面不是由相同材料构成时怎么办? 509 7.1.20 什么是光谱分解问题? 509 7.1.21 如何解决线性光谱分解问题? 510 7.1.22 可以对纯材料使用光谱库吗? 510 7.1.23 当已知纯分量的光谱时如何解线性光谱分解问题? 510 7.1.24 有可能不计算矩阵Q的逆吗? 513 7.1.25 如果库光谱是在与混合光谱不同的波长进行的采样会发生什么问题? 513 7.1.26 如果不知道在混合物质中有哪些纯物质可能存在会发生什么问题? 514 7.1.27 如果不知道纯材料的光谱如何解线性光谱分解问题? 515 7.2 彩色视觉的物理学和心理物理学 518 7.2.1 什么是彩色? 518 7.2.2 从工程的观点看彩色有什么感兴趣的地方? 518 7.2.3 哪些因素影响从一个暗物体感知到的彩色? 519 7.2.4 什么导致日光的变化? 520 7.2.5 如何能模型化日光的变化? 520 B7.3 标准光源 522 7.2.6 什么是天然材料的观测变化? 523 7.2.7 一旦光线到达传感器会发生什么情况? 529 7.2.8 一个传感器有可能对不同的材料产生相同的记录吗? 530 7.2.9 人类视觉系统是如何实现彩色恒常性的? 531 7.2.10 彩色视觉的三基色理论讲了什么? 531 7.2.11 用什么来定义一个彩色系统? 531 7.2.12 三刺激值是如何确定的? 531 7.2.13 所有的单色参考刺激都可以通过简单调节基色光的强度来匹配吗? 532 7.2.14 所有人都需要相同强度的基色光以匹配同样的单色参考刺激吗? 533 7.2.15 谁是具有正常彩色视觉的人? 533 7.2.16 什么是最常使用的彩色系统? 533 7.2.17 什么是CIE-RGB 彩色系统? 533 7.2.18 什么是XYZ 彩色系统? 534 7.2.19 如何在3-D 空间中表达彩色? 534 7.2.20 如何在2-D 空间中表达彩色? 534 7.2.21 什么是色度图? 535 B7.4 一些3-D 几何中有用的定理 536 7.2.22 CIE-RGB 彩色系统中的色度图是什么样的? 538 7.2.23 人的大脑是如何感知彩色强度的? 539 7.2.24 在CIE-RGB 彩色系统中是如何定义零发光线的呢? 539 7.2.25 XYZ 彩色系统是如何定义的? 540 7.2.26 XYZ 彩色系统中的色度图是什么样的? 542 7.2.27 实际中可能用虚的基色生成一个彩色系统吗? 542 7.2.28 如何模型化一个特定人观察彩色的方式? 542 7.2.29 如果不同的观察者需要不同强度的基色光以看到白色,如何在不同观察者间校正彩色? 543 7.2.30 如何使用参考白色? 543 7.2.31 sRGB 彩色系统是如何定义的? 544 7.2.32 如果将一个彩色的所有三刺激值都翻倍它会变化吗? 545 7.2.33 用彩色系统的语言对一个彩色的描述与用日常语言的描述有什么联系? 545 7.2.34 如何比较彩色? 545 7.2.35 什么是一个测度? 545 7.2.36 能用欧氏测度来测量两个彩色的差别吗? 546 7.2.37 哪些是感知均匀的彩色空间? 546 7.2.38 Luv彩色空间是如何定义的? 546 7.2.39 Lab彩色空间是如何定义的? 547 7.2.40 如何选择(Xn, Yn, Zn)的值? 547 7.2.41 如何从Luv的值计算RGB 的值? 548 7.2.42 如何从Lab的值计算RGB 的值? 548 7.2.43 如何测量感知的饱和度? 549 7.2.44 如何测量饱和度感知的差别? 549 7.2.45 如何测量感知的色调? 549 7.2.46 色调角是如何定义的? 549 7.2.47 如何测量色调感知的差别? 550 7.2.48 什么影响人感知彩色的方式? 551 7.2.49 彩色的时间上下文是什么意思? 551 7.2.50 彩色的空间上下文是什么意思? 551 7.2.51 为什么当谈论空间频率时与距离有关系? 552 7.2.52 如何解释对彩色感知的空间依赖性? 552 7.3 实用彩色图像处理 553 7.3.1 对人类彩色视觉的研究如何影响进行图像处理的方式? 553 7.3.2 感知均匀彩色空间实际中有多感知均匀? 553 7.3.3 应如何将图像的RGB 值转换到Luv或Lab彩色空间中? 553 7.3.4 在图像处理应用中如何测量色调和饱和度? 557 7.3.5 如何能在图像处理中模仿彩色感知的空间依赖性? 561 7.3.6 同色异谱现象与图像处理有什么联系? 563 7.3.7 如何解决一个工业监视应用中的同色异谱问题? 564 7.3.8 什么是蒙特卡洛方法? 565 7.3.9 如何从多光谱图像中消除噪声? 566 7.3.10 如何对矢量排序? 566 7.3.11 如何处理多光谱图像中的混合噪声? 567 7.3.12 如何增强一幅彩色图像? 568 7.3.13 如何恢复多光谱图像? 572 7.3.14 如何压缩彩色图像? 572 7.3.15 如何分割多光谱图像? 572 7.3.16 实际中如何使用k-均值聚类方法? 573 7.3.17 如何提取多光谱图像的边缘? 574 7.3.18 本章要点 574 附录A 算法列表 576 附录B 参考文献注解 578 附录C 参考文献 580 附录D 索引 584

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧