<?xml version="1.0" encoding="UTF-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:admin="http://webns.net/mvcb/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns="http://purl.org/rss/1.0/">
<channel rdf:about="http://www.zhangheng.net/BLOG">
<title>Yeman BLOG</title>
<link>http://www.zhangheng.net/BLOG</link>
<description>Yeman BLOG</description>
<dc:language>zh-cn</dc:language>
<dc:creator>webmaster@loveyuki.com</dc:creator>
<items>
<rdf:Seq>
<item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=544"><title><![CDATA[LOST 迷失 (最终季) 图]]></title><description><![CDATA[[img]attachments/month_1005/74v0_00lost2.jpg[/img]<br>[img]attachments/month_1005/74v0_00lost.jpg[/img]<br>[img]attachments/month_1005/2yq5_01jack.jpg[/img]<br>[img]attachments/month_1005/2yq5_02kate.jpg[/img]<br>[img]attachments/month_1005/nkcq_03locke.jpg[/img]]]></description><content:encoded><![CDATA[<img src="attachments/month_1005/74v0_00lost2.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/74v0_00lost.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/2yq5_01jack.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/2yq5_02kate.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/nkcq_03locke.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/yvn2_04sayid.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/oles_05ben.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/wtlz_06claire.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/gd6j_07frank.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/oles_08hugo.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/if8l_09llana.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/b91e_10sawyer.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/31s7_11jin_soo.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/b91e_14Sun.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/96xb_12Miles.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><img src="attachments/month_1005/a8zd_13Richard.jpg" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br>]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=544</link><dc:subject>其他</dc:subject><dc:creator>admin</dc:creator><dc:date>2010-5-25 9:06:41</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=543"><title><![CDATA[关注LED投影]]></title><description><![CDATA[明基&nbsp;GP1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;ANSI流明&nbsp;&nbsp;&nbsp;&nbsp;800×600&nbsp;&nbsp;&nbsp;&nbsp;2000:1<br><br>LG&nbsp;HX300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;300ANSI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1024*768&nbsp;&nbsp;&nbsp;<br>LG&nbsp;HS200G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;200流明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;800*600&nbsp;&nbsp;&nbsp;4:3&nbsp;&nbsp;&nbsp;&nbsp;HDMI&nbsp;&nbsp;&nbsp;&nbsp;支持FM调频<br>LG&nbsp;HS102G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160流明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;800×600&nbsp;&nbsp;4：3/16：9&nbsp;&nbsp;2000：1&nbsp;]]></description><content:encoded><![CDATA[明基&nbsp;GP1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;100&nbsp;ANSI流明&nbsp;&nbsp;&nbsp;&nbsp;800×600&nbsp;&nbsp;&nbsp;&nbsp;2000:1<br><br>LG&nbsp;HX300&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;300ANSI&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1024*768&nbsp;&nbsp;&nbsp;<br>LG&nbsp;HS200G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;200流明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;800*600&nbsp;&nbsp;&nbsp;4:3&nbsp;&nbsp;&nbsp;&nbsp;HDMI&nbsp;&nbsp;&nbsp;&nbsp;支持FM调频<br>LG&nbsp;HS102G&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;160流明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;800×600&nbsp;&nbsp;4：3/16：9&nbsp;&nbsp;2000：1&nbsp;<br><br>三星SP-P400B&nbsp;&nbsp;150流明&nbsp;&nbsp;&nbsp;&nbsp;800*600&nbsp;1000：1&nbsp;&nbsp;&nbsp;&nbsp;16:9/4:3<br>三星SP-410M&nbsp;&nbsp;&nbsp;170流明&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1000:1&nbsp;&nbsp;&nbsp;USB接口<br>三星&nbsp;F10M&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;1000流明&nbsp;&nbsp;&nbsp;1024×768&nbsp;&nbsp;&nbsp;&nbsp;HDMI<br><br>宏碁K10<br><br>戴尔M109S&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;50流明&nbsp;&nbsp;&nbsp;858×600&nbsp;&nbsp;&nbsp;800:1<br><br>东芝TDP-F10&nbsp;&nbsp;&nbsp;100流明&nbsp;&nbsp;&nbsp;1500：1<br><br>卡西欧&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;2000流明&nbsp;&nbsp;1280×800&nbsp;&nbsp;LED+激光<br>卡西欧XJ-A140&nbsp;&nbsp;&nbsp;1024×768&nbsp;&nbsp;&nbsp;2500流明]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=543</link><dc:subject>其他</dc:subject><dc:creator>admin</dc:creator><dc:date>2010-5-15 22:17:35</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=541"><title><![CDATA[MEncoder的基础用法]]></title><description><![CDATA[[down=attachments/month_1004/07zd_MEncoder.rar]点击下载此文件[/down]<br><br>[down=attachments/month_1005/nkcq_winmenc.rar]winmenc下载[/down]<br><br>[b]10.1.&nbsp;选择编解码器及容器格式[/b]]]></description><content:encoded><![CDATA[<img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1004/07zd_MEncoder.rar" target="_blank">点击下载此文件</a><br><br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1005/nkcq_winmenc.rar" target="_blank">winmenc下载</a><br><br><strong>10.1.&nbsp;选择编解码器及容器格式</strong><br><br>编码使用的音频及视频编码器分别通过-oac及&nbsp;-ovc选项指定例如输入如下命令&nbsp;<br><br><strong>mencoder&nbsp;-ovc&nbsp;help</strong><br>可列出你机器上相应版本的MEncoder所支持的所有视频编码。下列选择也是可用的：&nbsp;<br><br>音频编码器：&nbsp;<br><br>音频编码器名称&nbsp;描述&nbsp;<br>mp3lame&nbsp;&nbsp;&nbsp;通过LAME编码为VBR，ABR或CBR格式的MP3文件&nbsp;<br>lavc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;利用libavcodec中的一个编码器&nbsp;&nbsp;<br>faac&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FAAC&nbsp;AAC音频编码器&nbsp;<br>toolame&nbsp;&nbsp;&nbsp;&nbsp;MPEG音频Layer&nbsp;2编码器&nbsp;<br>twolame&nbsp;&nbsp;&nbsp;&nbsp;基于tooLAME的MPEG音频Layer&nbsp;2编码器&nbsp;<br>pcm&nbsp;&nbsp;&nbsp;&nbsp;未压缩的PCM音频&nbsp;<br>copy&nbsp;&nbsp;&nbsp;不要重新编码，这是复制已压缩的各桢&nbsp;<br><br>频编码器：&nbsp;<br><br>是频编码器名称&nbsp;描述&nbsp;<br>lavc&nbsp;使用libavcodec中的一个是频编码器&nbsp;&nbsp;<br>xvid&nbsp;Xvid,&nbsp;MPEG-4高级简单格式(ASP)编码器&nbsp;<br>x264&nbsp;x264,&nbsp;MPEG-4高级视频编码(AVC),&nbsp;AKA&nbsp;H.264编码器&nbsp;<br>nuv&nbsp;nuppel视频，为一些实时程序所用&nbsp;<br>raw&nbsp;未压缩的视频桢&nbsp;<br>copy&nbsp;不要重新编码，只是复制已压缩的各桢&nbsp;<br>frameno&nbsp;用于三通道编码（不推荐）&nbsp;<br><br><br>输出容器格式通过-of选项选择。输入：&nbsp;<br><br><strong>mencoder&nbsp;-of&nbsp;help</strong><br>以便列出你机器上相应版本的MEncoder所支持的所有容器。如下选项也是可用的&nbsp;<br><br>容器格式：&nbsp;<br><br>容器格式名称&nbsp;描述&nbsp;<br>lavf&nbsp;由libavformat&nbsp;支持的一种容器&nbsp;<br>avi&nbsp;音-视频混合&nbsp;<br>mpeg&nbsp;MPEG-1及MPEG-2节目流&nbsp;<br>rawvideo&nbsp;原始视频流（未经混合&nbsp;-&nbsp;只含一视频流）&nbsp;<br>rawaudio&nbsp;原始音频流（未经混合&nbsp;-&nbsp;只含一音频流）&nbsp;<br><br>AVI容器是MEncoder的基本容器格式，也就是说它能够被最好的处理，MEncoder也是为之而设计。如上所述，其他容器格式也可被使用，但你使用的时候可能遇到问题。&nbsp;<br><br>libavformat容器：&nbsp;<br><br>如果你选择了libavformat&nbsp;来做输出文件的混编（通过使用-of&nbsp;lavf选项），适当的容器将由文件扩展名而定。你也可以通过libavformat的&nbsp;format选项强制一种容器格式。&nbsp;<br><br>libavformat容器名称&nbsp;描述&nbsp;<br>mpg&nbsp;MPEG-1及MPEG-2节目流&nbsp;<br>asf&nbsp;高级流格式&nbsp;<br>avi&nbsp;音-视频混合&nbsp;<br>wav&nbsp;波形音频&nbsp;<br>swf&nbsp;Macromedia&nbsp;Flash&nbsp;<br>flv&nbsp;Macromedia&nbsp;Flash视频&nbsp;<br>rm&nbsp;RealMedia&nbsp;<br>au&nbsp;SUN&nbsp;AU&nbsp;<br>nut&nbsp;NUT开放容器（实验中，不兼容标准）&nbsp;<br>mov&nbsp;QuickTime&nbsp;<br>mp4&nbsp;MPEG-4格式&nbsp;<br>dv&nbsp;Sony数字视频容器&nbsp;<br><br>如你所见，libavformat允许&nbsp;MEncoder把媒体混合到各种格式的容器内。不巧的是，因为MEncoder从开始设计的时候没有支持AVI之外的其他容器，你要小心最终生成的文件。请多次检查以确认音频/视频同步是正确的以及文件能在&nbsp;MPlayer之外的播放器中播放。&nbsp;<br><br>例&nbsp;10.1.&nbsp;编码为Macromedia&nbsp;Flash格式<br><br>生成Macromedia&nbsp;Flash视频，以便在安装有Macromedia&nbsp;Flash插件的网页浏览器中播放：&nbsp;<br><br>mencoder&nbsp;input.avi&nbsp;-o&nbsp;output.flv&nbsp;-of&nbsp;lavf&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;abr:br=56&nbsp;-srate&nbsp;22050&nbsp;-ovc&nbsp;lavc&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-lavcopts&nbsp;vcodec=flv:vbitrate=500:mbd=2:mv0:trell:v4mv:cbp:last_pred=3<br><br><br><strong>10.2.&nbsp;选择输入文件或设备</strong><br><br>MEncoder可以从文件或直接从DVD或VCD的盘片进行编码。秩序在命令行中包含文件名以便从文件进行编码，或&nbsp;dvd://标题数或&nbsp;vcd://轨道数以便从DVD标题或VCD轨道进行编码。如果你已经把DVD复制到你的硬盘上（你可以使用像dvd&nbsp;back&nbsp;up&nbsp;这样的工具，大多数系统上都有），然后想从副本进行编码，你仍需使用&nbsp;dvd://语法，加上附带了指向DVD副本的根目录的&nbsp;-dvd-device选项。&nbsp;-dvd-device及-cdrom-device选项也能用于覆盖用来直接从光盘中直接读取数据的设备的路径，如果缺省的&nbsp;/dev/dvd及/dev/cdrom在你的系统上步工作的话。&nbsp;<br><br>当从DVD进行编码时，最好是选其中的一章或几章进行编码。为此你可以使用-chapter选项。例如-chapter&nbsp;1-4将只编码DVD中的1至4章。如果你针对包含1400MB数据的两张CD进行编码，这将非常有用，因为你可以确定只在一章的边缘处分割，而不是在一个场景中间。&nbsp;<br><br>如果你有张被支持的电视卡，你也可以通过播放电视节目的设备进行编码。使用tv://channelnumber为文件名，并用-tv配置各种截取选项。&nbsp;DVB输入工作原理类似。<br><br><strong>10.3.&nbsp;编码为双通道MPEG-4&nbsp;(&quot;DivX&quot;)</strong><br><br>之所以这样命名，是因为这种编码两次对文件进行编码。第一次编码（配音通道）生成一些几兆大的临时文件(*.log)，先不要删除它们（你可以删除AVI或者通过重定向到/dev/null&nbsp;而不生成视频）。第二次编码时，生成了双通道输出文件，使用的即是从临时文件提供的比特律数据。生成文件会有更好的图像质量。如果这是你第一次听说，你可以在互联网上找到相关参考。&nbsp;<br><br>例&nbsp;10.2.&nbsp;复制音轨<br><br>双通道编码在复制音轨时将DVD的第二个轨道转换成MPEG-4&nbsp;(&quot;DivX&quot;)&nbsp;AVI。&nbsp;<br><br>mencoder&nbsp;dvd://2&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:vpass=1&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;/dev/null<br>mencoder&nbsp;dvd://2&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell:vpass=2&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><br>例&nbsp;10.3.&nbsp;对音轨编码<br><br>将一个DVD编码成MPEG-4&nbsp;(&quot;DivX&quot;)&nbsp;AVI，音轨采用MP3格式使用这个方法的时候要当心，因为有时它可能造成音/视频不同步。&nbsp;<br><br>mencoder&nbsp;dvd://2&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:vpass=1&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;vbr=3&nbsp;-o&nbsp;/dev/null<br>mencoder&nbsp;dvd://2&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell:vpass=2&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-oac&nbsp;mp3lame&nbsp;-lameopts&nbsp;vbr=3&nbsp;-o&nbsp;output.avi<br><br><strong>10.4.&nbsp;编码为Sony&nbsp;PSP视频格式</strong><br><br>MEncoder支持到Sony&nbsp;PSP的视频格式转换，但是依赖于&nbsp;PSP软件修改，对不同软件限制也许会有不同。如果你遵守如下守则，你将不会遇到什么问题：&nbsp;<br><br>比特律：不应超过每秒1500kb，然而过去的版本&nbsp;几乎支持任何比特律只要头文件声明其不是太高。&nbsp;<br><br>维数：PSP视频的长宽应是16的倍数，并且长*宽的&nbsp;积应&lt;=&nbsp;64000。&nbsp;在一些情况下，PSP可能播放更高分辨率的文件。&nbsp;<br><br>音频：其采样率针对MPEG-4应为24kHz，针对H.264&nbsp;为48kHz。&nbsp;<br><br><br>例&nbsp;10.4.&nbsp;编码到PSP<br><br><br>mencoder&nbsp;-ofps&nbsp;30000/1001&nbsp;-af&nbsp;lavcresample=24000&nbsp;-vf&nbsp;harddup&nbsp;-of&nbsp;lavf&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-oac&nbsp;lavc&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;aglobal=1:vglobal=1:vcodec=mpeg4:acodec=aac&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-lavfopts&nbsp;format=psp:i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;input.video&nbsp;-o&nbsp;output.psp<br><br>注意你可以通过&nbsp;-info&nbsp;name=MovieTitle为视频摄者标题。<br><br><strong>10.5.&nbsp;编码为MPEG格式</strong><br><br>MEncoder可生成MPEG&nbsp;(MPEG-节目流)格式的文件。通常，当你使用MPEG-1或MPEG-2视频，是因为你的编码受限于SVCD,&nbsp;VCD,&nbsp;或DVD。这些格式所需的特别要求将在&nbsp;VCD及DVD生成指南&nbsp;中进行解释&nbsp;section.&nbsp;<br><br>要改变MEncoder的输出文件格式，使用&nbsp;-of&nbsp;mpeg选项。&nbsp;<br><br>例如：&nbsp;<br><br>mencoder&nbsp;input.avi&nbsp;-of&nbsp;mpeg&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg1video&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-oac&nbsp;copy&nbsp;other_options&nbsp;-o&nbsp;output.mpg<br><br>可生成为只有有限多媒体支持的系统进行播放的MPEG-1文件，例如默认安装的Windows：&nbsp;<br><br>mencoder&nbsp;input.avi&nbsp;-of&nbsp;mpeg&nbsp;-mpegopts&nbsp;format=mpeg1:tsaf:muxrate=2000&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-o&nbsp;output.mpg&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp2:abitrate=224&nbsp;-ovc&nbsp;lavc&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-lavcopts&nbsp;vcodec=mpeg1video:vbitrate=1152:keyint=15:mbd=2:aspect=4/3<br><br>同上，但使用了libavformat&nbsp;MPEG混合器：&nbsp;<br><br>mencoder&nbsp;input.avi&nbsp;-o&nbsp;VCD.mpg&nbsp;-ofps&nbsp;25&nbsp;-vf&nbsp;scale=352:288,harddup&nbsp;-of&nbsp;lavf&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-lavfopts&nbsp;format=mpg:i_certify_that_my_video_stream_does_not_use_b_frames&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-oac&nbsp;lavc&nbsp;-lavcopts&nbsp;acodec=mp2:abitrate=224&nbsp;-ovc&nbsp;lavc&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-lavcopts&nbsp;vcodec=mpeg1video:vrc_buf_size=327:keyint=15:vrc_maxrate=1152:vbitrate=1152:vmax_b_frames=0<br><br><br>提示：<br>如果由于某种原因，第二次编码的效果不能令你满意，你可以使用另外一种比特律重新执行视频编码，只要你保存了前一次编码中生成的统计文件。这是可行因为生成统计文件的主要目的是记录每桢的复杂度，不是特别依赖于比特律。然而，你要注意的是如果所有编码按照与最终生成文件的比特律相差不大的参数执行程序，你将得到最佳效果。<br><br><strong>10.6.&nbsp;改变电影大小</strong><br><br>经常出现要改变电影图片大小的需求。原因可能是多样的：减小文件大小，网络带宽等等。大多数人甚至在将DVD或SVCD转换成DivX&nbsp;AVI时也改变影片大小。如果你想改变影片大小，阅读保持长宽比一节&nbsp;<br><br>变换过程由scale视频滤镜处理：&nbsp;-vf&nbsp;scale=宽:高。输出质量可由-sws选项调节。如果没有设置，MEncoder将使用2：双三次。&nbsp;<br><br>用法：&nbsp;<br><br>mencoder&nbsp;input.mpg&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-vf&nbsp;scale=640:480&nbsp;-o&nbsp;output.avi<br><br><strong>10.7.&nbsp;媒体流复制</strong><br>MEncoder能以两种方式处理输入媒体流：&nbsp;编码或复制。本节是关于复制的。&nbsp;<br><br>视频流&nbsp;(选项-ovc&nbsp;copy)：&nbsp;一系列工作可以完成的很好&nbsp;:)&nbsp;好像把FLI或VIVO或MPEG-1视频放入（不是转换）到&nbsp;一个AVI文件中！当然，只有MPlayer能播放这样的文&nbsp;件:)并且也许它并没有生活上的实际价值。实际意义上：当只有音频流要被编码（&nbsp;例如从无压缩的PCM到MP3）时，视频流才可能有用。&nbsp;<br><br>音频流&nbsp;(选项-oac&nbsp;copy)：&nbsp;直接的。你可能提取一个外部音频文件（MP3，WAV）并将其合成到一个输出媒体流里。&nbsp;为此可使用-audiofile&nbsp;文件名选项。&nbsp;<br><br>使用-oac&nbsp;copy从一种容器格式复制到另一种容器格式时，你可能需要使用-fafmttag选项以保持原始文件的音频格式标签。例如，如果你将一个使用AAC音频的NSV文件转换到AVI容器中，音频格式文件标签可能是错误的，需要被转换。对于详细的音频格式标签，查看codecs.conf。&nbsp;<br><br>例子：&nbsp;<br><br>mencoder&nbsp;input.nsv&nbsp;-oac&nbsp;copy&nbsp;-fafmttag&nbsp;0x706D&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell&nbsp;-o&nbsp;output.avi<br><br><strong>10.8.&nbsp;从多个输入图像文件进行编码(JPEG,&nbsp;PNG,&nbsp;TGA等)</strong><br><br>MEncoder可以通过一个或多个JPEG,&nbsp;PNG,&nbsp;TGA,&nbsp;或其他图片文件制作电影。使用简单的桢复制，它能生成MJPEG&nbsp;(移动JPEG),&nbsp;MPNG&nbsp;(移动PNG)或MTGA&nbsp;(移动TGA)&nbsp;文件。&nbsp;<br><br>进程描述：<br><br>MEncoder使用libjpeg&nbsp;（当解码PNG时，它将使用libpng）将输入图片进行&nbsp;解码。&nbsp;<br><br>MEncoder然后将解码好的图片送到被选定的视频压缩器中&nbsp;(DivX4,&nbsp;Xvid,&nbsp;FFmpeg&nbsp;msmpeg4等)。&nbsp;<br><br>例子.&nbsp;&nbsp;关于-mf选项的解释在man页中。&nbsp;<br><br>使用当前目录下所有JPEG文件生成MPEG-4文件。&nbsp;<br><br>mencoder&nbsp;mf://*.jpg&nbsp;-mf&nbsp;w=800:h=600:fps=25:type=jpg&nbsp;-ovc&nbsp;lavc&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><br>使用当前目录中的一些JPEG文件生成MPEG-4文件。&nbsp;<br><br>mencoder&nbsp;mf://frame001.jpg,frame002.jpg&nbsp;-mf&nbsp;w=800:h=600:fps=25:type=jpg&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><br>使用显示指示的一系列JPEG文件生成MPEG-4文件（当前目录下的list.txt包含被用做源的文件列表，一个一行）：&nbsp;<br><br>mencoder&nbsp;mf://@list.txt&nbsp;-mf&nbsp;w=800:h=600:fps=25:type=jpg&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><br>使用当前目录下所有JPEG文件生成移动JPEG（MJPEG）文件：&nbsp;<br><br>mencoder&nbsp;mf://*.jpg&nbsp;-mf&nbsp;w=800:h=600:fps=25:type=jpg&nbsp;-ovc&nbsp;copy&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><br>使用当前目录下所有PNG文件生成未压缩的文件：&nbsp;<br><br>mencoder&nbsp;mf://*.png&nbsp;-mf&nbsp;w=800:h=600:fps=25:type=png&nbsp;-ovc&nbsp;raw&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><br>注意<br>宽度必须是4的倍数，这是原始RGB&nbsp;AVI文件格式的限制。&nbsp;<br><br><br>使用当前目录下所有PNG文件生成移动PNG&nbsp;(MPNG)文件：&nbsp;<br><br>mencoder&nbsp;mf://*.png&nbsp;-mf&nbsp;w=800:h=600:fps=25:type=png&nbsp;-ovc&nbsp;copy&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><br>使用当前目录下的所有TGA文件生成移动TGA&nbsp;(MTGA)文件：&nbsp;<br><br>mencoder&nbsp;mf://*.tga&nbsp;-mf&nbsp;w=800:h=600:fps=25:type=tga&nbsp;-ovc&nbsp;copy&nbsp;-oac&nbsp;copy&nbsp;-o&nbsp;output.avi<br><br><strong>10.9.&nbsp;将DVD子标题提取到VOBsub文件</strong><br><br>MEncoder能将DVD子标题提取到VOBsub格式的文件中。它们是一对由.idx及.sub结尾的文件组成。并且经常被压缩成一个.rar文件。&nbsp;MPlayer可通过&nbsp;-vobsub及-vobsubid选项播放这些文件。&nbsp;<br><br>你可以通过-vobsubout指定输出文件的基础名（例如不包括&nbsp;.idx或.sub后缀），对于生成文件子标题的索引使用-vobsuboutindex。&nbsp;<br><br>如果不是从DVD输入，你应该使用-ifo来表明构建生成的.idx文件所需的.ifo文件。&nbsp;<br><br>如果输入不是DVD并且你没有.ifo文件，你需使用&nbsp;-vobsubid选项以使其知道放入.idx&nbsp;文件的语言标识。&nbsp;<br><br>如果.sub及.idx文件存在，每次执行都回添加子标题。所以你再开始前需要手动清除这些文件。&nbsp;<br><br>例&nbsp;10.5.&nbsp;在做双通道编码时从DVD复制子标题<br><br>rm&nbsp;subtitles.idx&nbsp;subtitles.sub<br>mencoder&nbsp;dvd://1&nbsp;-oac&nbsp;copy&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:vpass=1&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-vobsubout&nbsp;subtitles&nbsp;-vobsuboutindex&nbsp;0&nbsp;-sid&nbsp;2<br>mencoder&nbsp;dvd://1&nbsp;-oac&nbsp;copy&nbsp;-ovc&nbsp;lavc&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell:vpass=2&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-vobsubout&nbsp;subtitles&nbsp;-vobsuboutindex&nbsp;1&nbsp;-sid&nbsp;5<br><br><br>例&nbsp;10.6.&nbsp;从一个MPEG文件复制法文子标题<br><br>rm&nbsp;subtitles.idx&nbsp;subtitles.sub<br>mencoder&nbsp;movie.mpg&nbsp;-ifo&nbsp;movie.ifo&nbsp;-vobsubout&nbsp;subtitles&nbsp;-vobsuboutindex&nbsp;0&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-vobsuboutid&nbsp;fr&nbsp;-sid&nbsp;1&nbsp;-nosound&nbsp;-ovc&nbsp;copy<br><br><br><strong>10.10.&nbsp;保持视频画面比例</strong><br><br>DVD及SVCD(例如MPEG-1/2)文件包含画面比例，此信息可用来指示播放器应如何显示视频流，所以显示的人不会有个鸡蛋头（例如480x480&nbsp;+&nbsp;4:3&nbsp;=&nbsp;640x480）。然而当编码为AVI(DivX)&nbsp;文件时，你要小心AVI头信息里没有包含这些值。重新设置这些比例是非常讨厌并且很花时间，应该有更好的方法！&nbsp;<br><br>还有<br><br>MPEG-4有个独特的特点：视频流可以包含它需要的画面比例。是的，正像MPEG-1/2&nbsp;(DVD,&nbsp;SVCD)及H.263文件一样。可惜的是，除了MPlayer几乎没有播放器支持这项MPEG-4属性。&nbsp;<br><br>这种特性之可以与&nbsp;libavcodec的&nbsp;mpeg4编码器一同使用。记住：虽然&nbsp;MPlayer可以正常播放所生成的文件，其他播放器可能使用错误的图象比例。&nbsp;<br><br>你应剪切电影图像上下方的黑条。针对cropdetect及&nbsp;crop滤镜的用法参考man页。&nbsp;<br><br>用法&nbsp;<br><br>mencoder&nbsp;sample-svcd.mpg&nbsp;-vf&nbsp;crop=714:548:0:14&nbsp;-oac&nbsp;copy&nbsp;-ovc&nbsp;lavc&nbsp;\<br>&nbsp;&nbsp;&nbsp;&nbsp;-lavcopts&nbsp;vcodec=mpeg4:mbd=2:trell:autoaspect&nbsp;-o&nbsp;output.avi<br><br><br>==========================================<br>==========================================<br>想將四千多張的jpg以30fps轉H264的視頻有沒較簡單的方法?<br><br>你的图片有编号吗？有的话用mencoder&nbsp;+&nbsp;x264<br>比如你的文件名是xxx0001.jpg&nbsp;~&nbsp;xxx4000.jpg，分辨率是WxH<br><br>那么用下面的命令行<br><br>mencoder&nbsp;mf://xxx%04d.jpg&nbsp;-ovc&nbsp;raw&nbsp;-vf&nbsp;format=i420&nbsp;-of&nbsp;rawvideo&nbsp;-o&nbsp;-&nbsp;-really-quiet&nbsp;|&nbsp;x264&nbsp;-&nbsp;WxH&nbsp;--fps&nbsp;30&nbsp;-o&nbsp;xxx.mp4<br><br>由&nbsp;sm977&nbsp;于&nbsp;11-25-2009&nbsp;22:59&nbsp;发表:&nbsp;<br><br>不太明白LS的命令行<br>mf://xxx%04d.jpg是什麽?<br>假設圖片是A0001.jpg至A4000.jpg,怎麼指定文件名?<br><br>mf://表示读入图片序列，%04d是C语言里的转义符，%d表示整数，4表示4位数，0表示不足4位的前面补0<br><br>楼主的情况用mf://A%04d.jpg，如果要路径的话加在mf://后面，比如mf://C:\A%04d.jpg<br><br>由&nbsp;roozhou&nbsp;于&nbsp;11-26-2009&nbsp;20:12&nbsp;发表:&nbsp;<br><br>你的jpg是什么类型的？没有特殊要求的话，选个preset再设置一下crf就可以了<br><br>由&nbsp;sm977&nbsp;于&nbsp;11-26-2009&nbsp;20:18&nbsp;发表:&nbsp;<br><br>怎麼选preset?怎麼设置crf?<br>只用過megui一些簡單功能,實在不懂命令行的設定<br><br><br>--------------------------------------------------------------------------------<br>由&nbsp;roozhou&nbsp;于&nbsp;11-26-2009&nbsp;22:07&nbsp;发表:&nbsp;<br><br>--preset&nbsp;fast&nbsp;--crf&nbsp;20<br>就是这样啊<br>backup<br>]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=541</link><dc:subject>摄影_色彩</dc:subject><dc:creator>admin</dc:creator><dc:date>2010-3-31 15:52:38</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=540"><title><![CDATA[SONY V505可以升级到Dothan核心CPU]]></title><description><![CDATA[SONY&nbsp;V505,&nbsp;Dothan,&nbsp;CPU,&nbsp;PM735,&nbsp;BIOS,&nbsp;R0062G2<br>--------------------------------------------------------------------<br><br>&nbsp;&nbsp;&nbsp;&nbsp;在网上看到855PM可以支持Dothan核心CPU，但是有人将SONY&nbsp;V505&nbsp;CPU升级到Dothan后只能运行在600MHz，我从网上找到一个R0062G2的BIOS，经测试支持PM735，运行正常。<br>]]></description><content:encoded><![CDATA[SONY&nbsp;V505,&nbsp;Dothan,&nbsp;CPU,&nbsp;PM735,&nbsp;BIOS,&nbsp;R0062G2<br>--------------------------------------------------------------------<br><br>&nbsp;&nbsp;&nbsp;&nbsp;在网上看到855PM可以支持Dothan核心CPU，但是有人将SONY&nbsp;V505&nbsp;CPU升级到Dothan后只能运行在600MHz，我从网上找到一个R0062G2的BIOS，经测试支持PM735，运行正常。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;想升级SONY&nbsp;V505的可以升级这个BIOS试试，请确认是不是855PM芯片版的。<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;哪位有120G以上的硬盘试试这个BIOS是否支持大硬盘，可以的话通知一下。<br><br>&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1003/R0062G2.rar" target="_blank">R0062G2.rar</a><br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1004/eb4i_WinPhlash.rar" target="_blank">WinPhlash&nbsp;For&nbsp;VAIO</a><br><br><img src="attachments/month_1003/b92f_v505.GIF" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" /><br><br><br>]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=540</link><dc:subject>其他</dc:subject><dc:creator>admin</dc:creator><dc:date>2010-3-25 21:34:10</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=539"><title><![CDATA[VB.NET 二进制文件操作]]></title><description><![CDATA[VB.NET有很多值得学习的地方，这里我们主要介绍VB.NET二进制文件。大家都知道所有文件的存储其实质都是二进制的，VB.NET二进制文件往往由两部分组成，一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息，以BMP等图象文件为例，它们的文件头中存放了是何种图形格式、图象大小、调色板等信息，要显示图象时先读取文件头以获得文件的详细信息，然后再按其格式把图象内容显示出来。用二进制方式可以操作任何的文件，当然至关重要的一点是要清楚了解所操作文件的文件头结构。<br>&nbsp;&nbsp;&nbsp;&nbsp;VB.NET二进制文件操作主要应用的方法和函数有：Open,Close,Get,Put等。<br><br>Open：在For后面的打开模式要用Binary。<br>Close:关闭文件。]]></description><content:encoded><![CDATA[VB.NET有很多值得学习的地方，这里我们主要介绍VB.NET二进制文件。大家都知道所有文件的存储其实质都是二进制的，VB.NET二进制文件往往由两部分组成，一部分是文件头另一部分存放了文件的内容。文件头通常存放与文件格式有关的信息，以BMP等图象文件为例，它们的文件头中存放了是何种图形格式、图象大小、调色板等信息，要显示图象时先读取文件头以获得文件的详细信息，然后再按其格式把图象内容显示出来。用二进制方式可以操作任何的文件，当然至关重要的一点是要清楚了解所操作文件的文件头结构。<br>&nbsp;&nbsp;&nbsp;&nbsp;VB.NET二进制文件操作主要应用的方法和函数有：Open,Close,Get,Put等。<br><br>Open：在For后面的打开模式要用Binary。<br>Close:关闭文件。<br>Get:在指定位置取得文件的内容，如果省略位置则从当前位置读取。<br>Put:在指定位置写入文件，如果省略位置参数就从当前位置写。<br><br>下面结合代码讲解VB.NET二进制文件的操作<br><br>下述程序完成了将两个文件结合成一个文件以及将这个结合后的文件再拆分成原来的两个文件。文件头的结构是自己定义的，非常简单，共8个字节（也就是两个长整型的长度），前4个字节存放第一个文件的长度，后4个字节存放第二个文件的长度。为了更直观地表达文件的结构，现假设有两个文件，第一个文件长度是100字节，第二个文件是200字节，那么合并后得到的文件应该是308字节。按顺序来看，文件的结构是：<br><br>4第一文件的长度<br>4第二文件的长度<br>100第一文件的二进制内容<br>200第二文件的二进制内容<br><br>除了文件头的8字节长度是固定的后面的长度都会因文件的不同而变化的。<br><br>‘实现文件的合并&nbsp;&nbsp;<br>Private&nbsp;Sub&nbsp;MergeFile()&nbsp;&nbsp;<br>Dim&nbsp;strFileName1&nbsp;As&nbsp;String&nbsp;&#39;第一个文件&nbsp;&nbsp;<br>Dim&nbsp;strFileName2&nbsp;As&nbsp;String&nbsp;&#39;第二个文件&nbsp;&nbsp;<br>Dim&nbsp;strOutput&nbsp;As&nbsp;String&nbsp;&#39;合并后的文件&nbsp;&nbsp;<br>Dim&nbsp;aryContent()&nbsp;As&nbsp;Byte&nbsp;&#39;用来读取文件的数组，每次读取前要重定义&nbsp;&nbsp;<br>strFileName1&nbsp;=&nbsp;&quot;c:\a.bmp&quot;&nbsp;<br>strFileName2&nbsp;=&nbsp;&quot;c:\.bmp&quot;&nbsp;<br>strOutput&nbsp;=&nbsp;&quot;c:\out.bmp&quot;&nbsp;<br>&#39;注意下面三个Open语句都是用Binary模式打开的&nbsp;&nbsp;<br>Open&nbsp;strOutput&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#100&nbsp;&nbsp;<br>Open&nbsp;strFileName1&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#1&nbsp;&nbsp;<br>Open&nbsp;strFileName2&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#2&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;LOF(1)&nbsp;&#39;取得第一文件的长度，并把它写入到合并文件的文件头中&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;LOF(2)&nbsp;&#39;取得第二文件的长度，并写入到合并文件的文件头中&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(LOF(1)&nbsp;-&nbsp;1)&nbsp;&#39;重定义数组，为读取文件做准备&nbsp;&nbsp;<br>Get&nbsp;#1,&nbsp;,&nbsp;aryContent()&nbsp;&#39;取得第一文件的内容到数组&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;aryContent()&nbsp;&#39;把第一文件的内容写到合并文件中&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(LOF(2)&nbsp;-&nbsp;1)&nbsp;&nbsp;<br>Get&nbsp;#2,&nbsp;,&nbsp;aryContent()&nbsp;&nbsp;<br>Put&nbsp;#100,&nbsp;,&nbsp;aryContent()&nbsp;&nbsp;<br>&#39;关闭文件&nbsp;&nbsp;<br>Close&nbsp;#1&nbsp;&nbsp;<br>Close&nbsp;#2&nbsp;&nbsp;<br>Close&nbsp;#100&nbsp;&nbsp;<br>End&nbsp;Sub&nbsp;&nbsp;<br>‘实现文件的拆分&nbsp;&nbsp;<br>Private&nbsp;Sub&nbsp;SplitFile()&nbsp;&nbsp;<br>Dim&nbsp;strFileName1&nbsp;As&nbsp;String&nbsp;&nbsp;<br>Dim&nbsp;strFileName2&nbsp;As&nbsp;String&nbsp;&nbsp;<br>Dim&nbsp;strFileSplit&nbsp;As&nbsp;String&nbsp;&nbsp;<br>Dim&nbsp;aryContent()&nbsp;As&nbsp;Byte&nbsp;&nbsp;<br>Dim&nbsp;lngLOF(1)&nbsp;As&nbsp;Long&nbsp;&#39;存放从文件头取得的两个文件的长度&nbsp;&nbsp;<br>strFileName1&nbsp;=&nbsp;&quot;c:\a2.bmp&quot;&nbsp;<br>strFileName2&nbsp;=&nbsp;&quot;c:\2.bmp&quot;&nbsp;<br>strFileSplit&nbsp;=&nbsp;&quot;c:\out.bmp&quot;&nbsp;<br>Open&nbsp;strFileSplit&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#100&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;,&nbsp;lngLOF(0)&nbsp;&#39;取得第一文件的长度&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;,&nbsp;lngLOF(1)&nbsp;&#39;第二文件的长度&nbsp;&nbsp;<br>Open&nbsp;strFileName1&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#1&nbsp;&nbsp;<br>Open&nbsp;strFileName2&nbsp;For&nbsp;Binary&nbsp;As&nbsp;#2&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(lngLOF(0)-1)&nbsp;&#39;用第一文件的长度重定义数组，为读取第一文件做准备&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;9,&nbsp;aryContent()&nbsp;&#39;从第9字节，即文件后面开始读取第一文件的内容&nbsp;&nbsp;<br>Put&nbsp;#1,&nbsp;,&nbsp;aryContent()&nbsp;&#39;把取得的内容写入到拆分文件中&nbsp;&nbsp;<br>ReDim&nbsp;aryContent(lngLOF(1)-1)&nbsp;&nbsp;<br>Get&nbsp;#100,&nbsp;9&nbsp;+&nbsp;lngLOF(0)&nbsp;+&nbsp;1,&nbsp;aryContent()&nbsp;&#39;从第9字节再加上第一文件的长度处开始读取第二文件的内容，这里可以清楚地看到文件头的作用了&nbsp;&nbsp;<br>Put&nbsp;#2,&nbsp;,&nbsp;aryContent&nbsp;&nbsp;<br>Close&nbsp;#1&nbsp;&nbsp;<br>Close&nbsp;#2&nbsp;&nbsp;<br>Close&nbsp;#100&nbsp;&nbsp;<br>MsgBox&nbsp;&quot;拆分完成。&quot;,&nbsp;vbInformation&nbsp;<br><br><br>文本文件由于没有格式所以它的读写都比较简单和直观，而用二进制操作文件时其实质就是对文件头的理解，如果不知道文件头的结构那就无法对文件进行处理了，知道了文件头所包含的信息后，对文件的操作其实就是按规则进行Get、Put罢了。<br>]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=539</link><dc:subject>程序设计</dc:subject><dc:creator>admin</dc:creator><dc:date>2010-2-26 11:43:43</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=537"><title><![CDATA[刚做了几个字典，分享一下，大家试试。]]></title><description><![CDATA[今天自己做了几个字典，大家试试看，多提意见。<br><br>日期字典（19600101-20101231），顺序经过优化。<br><br>[down=attachments/month_1002/qnft_1960_2010.rar]下载日期字典[/down]]]></description><content:encoded><![CDATA[今天自己做了几个字典，大家试试看，多提意见。<br><br>日期字典（19600101-20101231），顺序经过优化。<br><br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1002/qnft_1960_2010.rar" target="_blank">下载日期字典</a><br><br>弱密码（碰运气吧）<br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1002/if8m_NUM8.rar" target="_blank">下载弱密码字典</a><br><br>两个字名字拼音字典（不足8位加123）<br><img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_1002/olds_NAME2.rar" target="_blank">下载名字拼音字典</a><br><br>还有一个手机号码字典生成器，可以生成各城市的手机号字典，2010年最新数据，由于太大暂时不供下载了，放个图大家看看。<br><img src="attachments/month_1002/63u0_shouji.JPG" border="0" onload="javascript:DrawImage(this);"  alt="按此在新窗口打开图片" onmouseover="this.style.cursor='hand';" onclick="window.open(this.src);" />]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=537</link><dc:subject>其他</dc:subject><dc:creator>admin</dc:creator><dc:date>2010-2-22 0:53:51</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=530"><title><![CDATA[验证码识别技术（转）]]></title><description><![CDATA[一、验证码的基础知识<br><br>　　1.&nbsp;验证码的主要目标是强迫人机交互来抵抗机器主动化攻击的。<br><br>　　2.&nbsp;大部分的验证码设计者并不得要领，不了解图像处理，机器视觉，模式识别，人工智能的基础概念。]]></description><content:encoded><![CDATA[一、验证码的基础知识<br><br>　　1.&nbsp;验证码的主要目标是强迫人机交互来抵抗机器主动化攻击的。<br><br>　　2.&nbsp;大部分的验证码设计者并不得要领，不了解图像处理，机器视觉，模式识别，人工智能的基础概念。<br><br>　　3.&nbsp;应用验证码，可以发财，当然要犯法：比如招商银行密码只有6位，验证码形同虚设，计算机很快就能破解一个有钱的账户，很多帐户是可以网上交易的。<br><br>　　4.&nbsp;也有设计的对比好的，比如Yahoo,Google,Microsoft等。而国内Tencent的中文验证码虽然难，但算不上好。<br><br>　　二、人工智能，模式辨认，机器视觉,免费视频聊天室，图像处置的基础知识<br><br>　　1)主要流程：<br><br>　　比如wo们要从一副图片中，识别出验证码;比如wo们要从一副图片中，检测并识别出一张人脸。&nbsp;大概有哪些步骤呢?<br><br>　　1.图像采集：验证码呢,激情聊天室，就直接通过HTTP抓HTML，然后剖析出图片的url，然后下载保留就可以了。&nbsp;如果是人脸检测识别，一般要通过视屏采集装备，采集回来，通过A/D转操作，存为数字图片或者视频频。<br><br>　　2.预处理：检测是准确的图像款式，转换到适合的格局，紧缩，剪切出ROI，去除噪音，灰度化，转换颜色空间这些。<br><br>　　3.检测：车牌检测识别体系要先找到车牌的大概地位，人脸检测体系要找出图片中所有的人脸(包含疑似人脸);验证码识别呢，主要是找出文字所在的主要区域。<br><br>　　4.前处置：人脸检测和识别，会对人脸在辨认前作一些校订，比如面内面外的旋转，扭曲等。wo这里的验证码识别，“一般”要做文字的切割<br><br>　　5.训练：通过各种模式识别，机器学习算法，来挑选和训练适合数量的训练集。不是训练的样本越多越好。过学习，泛化才能差的问题可能在这里呈现。这一步不是必需的，有些识别算法是不须要训练的。<br><br>　　6.识别：输入待识别的处理后的图片，转换成分类器须要的输入格局，然后通过输出的类和置信度，来断定大概可能是哪个字母。识别实质上就是分类。<br><br>　　2)要害概念：<br><br>　　图像处理：一般指针对数字图像的某种数学处理。比如投影，钝化，锐化，细化，边沿检测，二值化，紧缩，各种数据变换等等。<br><br>　　1.二值化：一般图片都是彩色的，依照真切水平，可能很多级别。为了下降计算庞杂度，便利后续的处理，如果在不丧失要害信息的情形下，能将图片处理成黑白两种颜色，那就最好不过了。<br><br>　　2.细化：找出图像的骨架，图像线条可能是很宽的，通细致化将宽度将为1,激情网站，某些处所可能大于1。不同的细化算法，可能有不同的差别，比如是否更靠近线条中间，比如是否坚持联通行等。<br><br>　　3.边缘检测：重要是懂得边缘的概念。边沿实际上是图像中图像像素属性变化激烈的地方。可能通过一个固定的门限值来断定，也可能是自适应的。门限可能是图像全局的，也可能是局部的。不能说那个就必定好，不过大部分时候，自适应的局部的门限可能要好点。被分析的，可能是色彩，也可能是灰度图像的灰度。<br><br>　　机器视觉：利用计算机来模式实现人的视觉。&nbsp;比如物体检测，定位，识别。依照对图像理解的层次的差异，分高阶和低阶的理解。<br><br>　　模式识别：对事物或者现象的某种表现方法(数值，文字，wo们这里重要想说的是数值)，通过一些处理和剖析，来描写，归类，懂得，说明这些事物，现象及其某种抽象。<br><br>　　人工智能：这种概念对比宽，上面这些都属于人工智能这个大的方向。简略点不要过火学院派的懂得就是，把人类的很“智能”的东西给模仿出来协助生物的人来处理问题，特殊是在盘算机里面。<br>三、常见的验证码的破解分析<br><br>　　以<a target="_blank" href="http://libcaca.zoy.org/wiki/PWNtcha">http://libcaca.zoy.org/wiki/PWNtcha</a>这里PWNtcha项目中的材料为例分析，各种验证码的破解。(办法很多，仅仅从wo个人乍看之下感到可行的方式来分析)<br><br>　　1)Authimage<br><br><br>使用的反破解技术：<br><br>　　1.不持续的点组成字符<br><br>　　2.有必定水平的倾斜<br><br>　　设计不好的地方：<br><br>　　1.通过纵横的直方图投影，可以找到字幕区域<br><br>　　2.通过Hough变换，恰当的参数，可以找到近似的横线，可以做倾斜改正<br><br>　　3.字符串的倾斜式面内的，没有太多的破解难度<br><br>　　4.字母宽度一定，大小一定<br><br><br>　　2)Clubic<br><br><br>使用的反破解技能：<br><br>　　1.字符是手写体<br><br>　　设计不好的处所：<br><br>　　1.检测切割阶段没有任何技术含量，属于设计的比较丑的<br><br>　　2.只有数字，而且手写体变化不大<br><br>　　3.表面看起来对识别阶段有难度，细心分析，发明几乎不用任何高档的训练识别算法，就<br><br>　　固定的招某些像素点是否有颜色就够了<br><br>　　3)linuxfr.org<br><br><br>使用的反破解技能：<br><br>　　1.背景色彩块<br><br>　　2.远景的横线或矩形<br><br>　　设计不好的处所：<br><br>　　1.背景色是单一色块，有形状，通过Region-Growth区域增加来很容易把背景给去掉<br><br>　　2.前景色是尺度的线条，颜色单一<br><br>　　3.字母无粘连<br><br>　　4.都是印刷体<br><br>　　4)Ourcolony<br><br><br>使用的反破解技术：<br><br>　　1.设计的太低级，不屑于去评价<br><br>　　设计不好的地方：<br><br>　　1.这种验证码，设计的最丑，但还是能把菜鸟搞定，究竟学盘算机的少，搞这个破解的更少，正所谓隔行如隔山<br><br>　　5)LiveJournal<br><br><br>使用的反破解技能：<br><br>　　1.这个设计略微好点，使用个随机噪音，而且作为远景<br><br>　　2.字母地位粗细都有变化<br><br>　　设计不好的地方：<br><br>　　1.字母没有粘连<br><br>　　2.噪音类型单一<br><br>　　3.通过在X轴的直方图投影，能正确分割字幕<br><br>　　4.然后在Y周作直方图投影,能准肯定位高度<br><br>　　5.识别阶段，都是印刷体，简单地很<br>四、网上的一些高档验证码<br><br>　　1)ICQ<br><br><br>2)IMDb<br><br><br>3)MS&nbsp;MVPS<br><br><br>4)MVN&nbsp;Forum<br><br><br>　　这些类型是被很多人以为比较难得类型，分析一下可以发明，字符检测，定位和分割都不难。&nbsp;唯一影响识别率的是IMDBb和MVPS这两类，字体变形略大。<br><br>　　总体来说，这些类型的破解也不难，很容易做到50%以上的识别率。<br>&nbsp;&nbsp;<br>五、高等验证码的破解分析<br><br>　　时光关系，wo简单介绍如何应用图像处理和模式识别技术，主动识别比较高等的验证码。<br><br>　　(以风头正劲的Google为例)<br><br><br>1)至少从目前的AI的发展水平看，没有简单的做法能主动处理各种不同的验证码，即使才能很强，那么体系自然也十分庞杂强盛。所以，要想在很简略的算法实现比拟高等的验证码破解，必需分析不同验证码算法的特色：<br><br>　　作为一般的图像处理和计算机视觉，会斟酌色彩，纹理，形状等直接的特性，同时也考虑直方图，灰度等统计特性，还斟酌FFT，Wavelet等各种变换后的特征。但最终目的都是Dimension&nbsp;Reduction(降维)然后利于识别，不仅仅是速度的考虑。从图像的角度看，很多系统都斟酌转换为灰度级甚者黑白图片。<br><br>　　Google的图片可以看出，色彩变化是虚晃一枪，不存在任何处理难度。难度是字体变形和字符粘连。<br><br>　　如果能胜利的分割字符，那么后期识别无论是用SVM等分类算法，还是分析笔顺比划走向来硬识别，都相对好做。<br><br>　　2)图像处理和粘连分割<br><br>　　代码中的part1目录重要完成图像预处置和粘连字符分割<br><br>　　001：将图像从jpg等格局转换为位图便于处理<br><br>　　002：采取Fix/Adaptive的Threshold门限算法，将图片Bin-Value二值化。(可用003算法)<br><br>　　003：采取OSTU分水岭算法，将图片Bin-Value二值化。(更通用，大部分时候后果更好)<br><br>　　005：获取ROI感兴致的区域。<br><br>　　006：Edge&nbsp;Trace边缘跟踪。<br><br>　　007：Edge&nbsp;Detection边界检测。<br><br>　　008：Thin细化去骨架。<br><br>　　009：做了一些Tidy收拾。(这个一般要依据特定的Captcha算法调整)<br><br>　　010：做切割,注意图片中红色的交叉点。<br><br>　　011：将边沿检测和骨干交叉点监测的图像合并。(合并进程可以做分析:&nbsp;比如X坐标偏移门限分析，交叉点区域纹理剖析，线条走势分析，等等各种方式，找出更可能的切分点和分别后部件的组合管理。)<br><br><br>注：在这里，wo们可以看到，根本的部件(字母是分割开了，但可以造成统一字母的被切割成多个Component。&nbsp;一种做法是：利用先验知识，做分割;&nbsp;另外一种做法是，和第二部分的识别联合起来。&nbsp;比如依照从左至右，尝试增长component来识别，如果不能识别而且component的总宽度，总面积还比较小，继续增添。&nbsp;当然不消除拒识的可能性。)<br><br>　　3)字符部件组合和识别。<br><br>　　part2的代码展现了切割后的字母组合，和基于svm的字符识别的训练和识别进程。<br><br>　　Detection.cpp中展现了ImageSpam检测进程中的一些字符分割和组合，layout的分析和利用的简单技术。&nbsp;而Google的验证码的识别，完整可以不用到，仅做参考。<br><br>　　SVM及使用：<br><br>　　实质上，SVM是一个分类器，原始的SVM是一个两类分类的分类器。可以通过1:1或者1:n的方法来组合成一个多类分类的分类器。&nbsp;天生通过核函数的使用支撑高维数据的分类。从几何意义上讲，就是找到最能表现类别特性的那些向量(支撑向量SV),然后找到一条线，能最大化分类的Margin。<br><br>　　libSVM是一个不错的实现。<br><br>　　训练间断和识别阶段的数据收拾和归一化是一样的。这里的简略做法是：<br><br>　　首先：<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#define&nbsp;SVM_MAX&nbsp;+0.999&nbsp;<br>　　#define&nbsp;SVM_MIN&nbsp;+0.001&nbsp;<br><br><br>　　其次：<br><br>　　扫描黑白待识别字幕图片的每个像素，如果为0(黑色，是字母上的像素),那么svm中该地位就SVM_MAX,反之则反。<br><br>　　最后：<br><br>　　训练阶段，在svm的input的前面，为该类打上标志，即是那一个字母。<br><br>　　识别阶段，当然这个类别标志是SVM分类出来。<br><br>　　注意：<br><br>　　如果是SVM菜鸟，最好找一个在SVM外边做了包装的工具，比如样本选择，交叉验证，核函数选择这些，让程序自动选择和分析。<br><br>六、对验证码设计的一些建议<br><br>　　1.在噪音等类型的使用上，努力让字符和用来混杂的远景和背景不容易区分。努力让坏人(噪音)长得和好人(字母)一样。<br><br>　　2.特别好的验证码的设计，要努力施展人类长于而AI算法不善于的。&nbsp;比如粘连字符的分割和手写体(通过印刷体做特殊的变形也可以)。&nbsp;而不要一味的去加一些看起来比拟庞杂的噪音或者其ta的花哨的东西。即使ni做的足够繁杂，但如果人也难识别，显然别人以为ni是没事找抽型的。<br><br>　　3.&nbsp;从专业的机器视觉的角度说，验证码的设计，必定要让破解者在识别阶段，重复在低阶视觉和高阶视觉之间多重复几次能力辨认出来。&nbsp;这样可以大大下降破解难度和破解的正确率。<br><br>　　七、慎重声名<br><br>　　1.这个问题，本身是人工智能，盘算机视觉，模式识别范畴的一个难题。作为破解者来说，是出于劣势位置。要做的很好，是很难得。总体来说，wo走的是比拟学院派的线路，能真正的破解难度对比高的验证码，不同于网上很多不太入流的破解方式。wo能做的只有应用有限的知识，抛砖引玉而已。很多OCR的技术，特殊是离线手写体中文等文字识别的技术，个人了解有限的很，都不敢在这里乱写。]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=530</link><dc:subject>程序设计</dc:subject><dc:creator>admin</dc:creator><dc:date>2009-12-4 13:58:18</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=529"><title><![CDATA[Ajax手册(转)]]></title><description><![CDATA[XMLHttpRequest<br>提供客户端同http服务器通讯的协议<br><br>Dim&nbsp;HttpReq&nbsp;As&nbsp;New&nbsp;MSXML2.XMLHTTP30&nbsp;<br>HttpReq.open&nbsp;&quot;GET&quot;,&nbsp;&quot;http://localhost/books.xml&quot;,&nbsp;False&nbsp;]]></description><content:encoded><![CDATA[XMLHttpRequest<br>提供客户端同http服务器通讯的协议<br><br>Dim&nbsp;HttpReq&nbsp;As&nbsp;New&nbsp;MSXML2.XMLHTTP30&nbsp;<br>HttpReq.open&nbsp;&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;False&nbsp;<br>HttpReq.send&nbsp;<br>MsgBox&nbsp;HttpReq.responseText<br><br>备注<br>客户端可以通过XmlHttp对象(MSXML2.XMLHTTP.3.0)向http服务器发送请求并使用微软XML文档对象模型Microsoft&amp;reg;&nbsp;XML&nbsp;Document&nbsp;Object&nbsp;Model&nbsp;(DOM)处理回应。<br><br>XMLHttpRequest成员<br>属性<br><br>onreadystatechange&nbsp;指定当readyState属性改变时的事件处理句柄。只写&nbsp;<br>readyState&nbsp;&nbsp;&nbsp;&nbsp;返回当前请求的状态，只读.&nbsp;<br>responseBody&nbsp;&nbsp;&nbsp;&nbsp;将回应信息正文以unsigned&nbsp;byte数组形式返回.只读&nbsp;<br>responseStream&nbsp;以Ado&nbsp;Stream对象的形式返回响应信息。只读&nbsp;<br>responseText&nbsp;将响应信息作为字符串返回.只读&nbsp;<br>responseXML&nbsp;将响应信息格式化为Xml&nbsp;Document对象并返回，只读&nbsp;<br>status&nbsp;返回当前请求的http状态码.只读&nbsp;<br>statusText&nbsp;&nbsp;&nbsp;&nbsp;返回当前请求的响应行状态，只读<br><br><br>*&nbsp;表示此属性是W3C文档对象模型的扩展.<br><br>方法<br><br>abort&nbsp;取消当前请求&nbsp;<br>getAllResponseHeaders&nbsp;获取响应的所有http头&nbsp;<br>getResponseHeader&nbsp;从响应信息中获取指定的http头&nbsp;<br>open&nbsp;创建一个新的http请求，并指定此请求的方法、URL以及验证信息(用户名/密码)&nbsp;<br>send&nbsp;发送请求到http服务器并接收回应&nbsp;<br>setRequestHeader&nbsp;单独指定请求的某个http头<br><br><br>onreadystatechange<br>指定当readyState属性改变时的事件处理句柄<br><br>语法<br>oXMLHttpRequest.onreadystatechange&nbsp;=&nbsp;funcMyHandler;<br><br>如下的例子演示当XMLHTTPRequest对象的readyState属性改变时调用HandleStateChange函数，当数据接收完毕后（readystate&nbsp;==&nbsp;4）此页面上的一个按钮将被激活<br><br>var&nbsp;xmlhttp=null;&nbsp;<br>function&nbsp;PostOrder(xmldoc)&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.5.0&quot;);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.Open(&quot;POST&quot;,&nbsp;&quot;<a target="_blank" href="http://myserver/orders/processorder.asp&quot;">http://myserver/orders/processorder.asp&quot;</a>,&nbsp;false);&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.onreadystatechange=&nbsp;HandleStateChange;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.Send(xmldoc);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;myButton.disabled&nbsp;=&nbsp;true;&nbsp;<br>}&nbsp;<br>function&nbsp;HandleStateChange()&nbsp;<br>{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(xmlhttp.readyState&nbsp;==&nbsp;4)&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;myButton.disabled&nbsp;=&nbsp;false;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;Result&nbsp;=&nbsp;&quot;&nbsp;+&nbsp;xmlhttp.responseXML.xml);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>}<br><br>备注<br>此属性只写，为W3C文档对象模型的扩展.<br><br>readyState<br>返回XMLHTTP请求的当前状态<br><br>语法<br>lValue&nbsp;=&nbsp;oXMLHttpRequest.readyState;<br><br>var&nbsp;XmlHttp;&nbsp;<br>XmlHttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);<br><br>function&nbsp;send()&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlHttp.onreadystatechange&nbsp;=&nbsp;doHttpReadyStateChange;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlHttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/sample.xml&quot;">http://localhost/sample.xml&quot;</a>,&nbsp;true);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;XmlHttp.send();&nbsp;<br>}<br><br>function&nbsp;doHttpReadyStateChange()&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(XmlHttp.readyState&nbsp;==&nbsp;4)&nbsp;{&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;alert(&quot;Done&quot;);&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br>}<br><br>备注<br>变量，此属性只读，状态用长度为4的整型表示.定义如下：<br><br><br>0&nbsp;(未初始化)&nbsp;对象已建立，但是尚未初始化（尚未调用open方法）&nbsp;<br>1&nbsp;(初始化)&nbsp;对象已建立，尚未调用send方法&nbsp;<br>2&nbsp;(发送数据)&nbsp;send方法已调用，但是当前的状态及http头未知&nbsp;<br>3&nbsp;(数据传送中)&nbsp;已接收部分数据，因为响应及http头不全，这时通过responseBody和responseText获取部分数据会出现错误，&nbsp;<br>4&nbsp;(完成)&nbsp;数据接收完毕,此时可以通过通过responseBody和responseText获取完整的回应数据<br><br><br>responseBody<br>返回某一格式的服务器响应数据<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.responseBody;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseBody);<br><br>备注<br>变量，此属性只读，以unsigned&nbsp;array格式表示直接从服务器返回的未经解码的二进制数据。<br><br>responseStream<br>以Ado&nbsp;Stream对象的形式返回响应信息<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.responseStream;<br><br>备注<br>变量，此属性只读，以Ado&nbsp;Stream对象的形式返回响应信息。<br><br>responseText<br>将响应信息作为字符串返回<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.responseText;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseText);<br><br>备注<br>变量，此属性只读，将响应信息作为字符串返回。<br>XMLHTTP尝试将响应信息解码为Unicode字符串，XMLHTTP默认将响应数据的编码定为UTF-8，如果服务器返回的数据带BOM(byte-order&nbsp;mark)，XMLHTTP可以解码任何UCS-2&nbsp;(big&nbsp;or&nbsp;little&nbsp;endian)或者UCS-4&nbsp;数据。注意，如果服务器返回的是xml文档，此属性并不处理xml文档中的编码声明。你需要使用responseXML来处理。<br><br>responseXML<br>将响应信息格式化为Xml&nbsp;Document对象并返回<br><br>语法<br>var&nbsp;objDispatch&nbsp;=&nbsp;oXMLHttpRequest.responseXML;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseXML.xml);<br><br>备注<br>变量，此属性只读，将响应信息格式化为Xml&nbsp;Document对象并返回。如果响应数据不是有效的XML文档，此属性本身不返回XMLDOMParseError，可以通过处理过的DOMDocument对象获取错误信息。<br><br>status<br>返回当前请求的http状态码<br><br>语法<br>lValue&nbsp;=&nbsp;oXMLHttpRequest.status;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.status);<br><br>返回值<br>长整形标准http状态码，定义如下：<br><br>Number&nbsp;&nbsp;&nbsp;&nbsp;Description&nbsp;&nbsp;<br>100<br>Continue<br><br>101<br>Switching&nbsp;protocols<br><br>200<br>OK<br><br>201<br>Created<br><br>202<br>Accepted<br><br>203<br>Non-Authoritative&nbsp;Information<br><br>204<br>No&nbsp;Content<br><br>205<br>Reset&nbsp;Content<br><br>206<br>Partial&nbsp;Content<br><br>300<br>Multiple&nbsp;Choices<br><br>301<br>Moved&nbsp;Permanently<br><br>302<br>Found<br><br>303<br>See&nbsp;Other<br><br>304<br>Not&nbsp;Modified<br><br>305<br>Use&nbsp;Proxy<br><br>307<br>Temporary&nbsp;Redirect<br><br>400<br>Bad&nbsp;Request<br><br>401<br>Unauthorized<br><br>402<br>Payment&nbsp;Required<br><br>403<br>Forbidden<br><br>404<br>Not&nbsp;Found<br><br>405<br>Method&nbsp;Not&nbsp;Allowed<br><br>406<br>Not&nbsp;Acceptable<br><br>407<br>Proxy&nbsp;Authentication&nbsp;Required<br><br>408<br>Request&nbsp;Timeout<br><br>409<br>Conflict<br><br>410<br>Gone<br><br>411<br>Length&nbsp;Required<br><br>412<br>Precondition&nbsp;Failed<br><br>413<br>Request&nbsp;Entity&nbsp;Too&nbsp;Large<br><br>414<br>Request-URI&nbsp;Too&nbsp;Long<br><br>415<br>Unsupported&nbsp;Media&nbsp;Type<br><br>416<br>Requested&nbsp;Range&nbsp;Not&nbsp;Suitable<br><br>417<br>Expectation&nbsp;Failed<br><br>500<br>Internal&nbsp;Server&nbsp;Error<br><br>501<br>Not&nbsp;Implemented<br><br>502<br>Bad&nbsp;Gateway<br><br>503<br>Service&nbsp;Unavailable<br><br>504<br>Gateway&nbsp;Timeout<br><br>505<br>HTTP&nbsp;Version&nbsp;Not&nbsp;Supported<br><br><br>备注<br>长整形，此属性只读，返回当前请求的http状态码,此属性仅当数据发送并接收完毕后才可获取。<br><br>statusText<br>返回当前请求的响应行状态<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.statusText;<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.statusText);<br><br>备注<br>字符串，此属性只读，以BSTR返回当前请求的响应行状态,此属性仅当数据发送并接收完毕后才可获取。<br><br>abort<br>取消当前请求<br><br>语法<br>oXMLHttpRequest.abort();<br><br>备注<br>调用此方法后，当前请求返回UNINITIALIZED&nbsp;状态。<br><br>getAllResponseHeaders<br>获取响应的所有http头<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.getAllResponseHeaders();<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/sample.xml&quot;">http://localhost/sample.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.getAllResponseHeaders());<br><br>输出由web服务器返回的http头信息:<br><br>Server:Microsoft-IIS/5.1&nbsp;<br>X-Powered-By:ASP.NET&nbsp;<br>Date:Sat,&nbsp;07&nbsp;Jun&nbsp;2003&nbsp;23:23:06&nbsp;GMT&nbsp;<br>Content-Type:text/xml&nbsp;<br>Accept-Ranges:bytes&nbsp;<br>Last&nbsp;Modified:Sat,&nbsp;06&nbsp;Jun&nbsp;2003&nbsp;17:19:04&nbsp;GMT&nbsp;<br>ETag:&quot;a0e2eeba4f2cc31:97f&quot;&nbsp;<br>Content-Length:9<br><br>备注<br>每个http头名称和值用冒号分割，并以\r\n结束。当send方法完成后才可调用该方法。<br><br>getResponseHeader<br>从响应信息中获取指定的http头<br><br>语法<br>strValue&nbsp;=&nbsp;oXMLHttpRequest.getResponseHeader(bstrHeader);<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;MSXML2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://localhost/sample.xml&quot;">http://localhost/sample.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.getResponseHeader(&quot;Server&quot;));<br><br>输出http头中的server列：当前web服务器的版本及名称。<br><br>备注<br>当send方法成功后才可调用该方法。如果服务器返回的文档类型为&quot;text/xml&quot;,&nbsp;则这句话xmlhttp.getResponseHeader(&quot;Content-Type&quot;);将返回字符串&quot;text/xml&quot;。可以使用getAllResponseHeaders方法获取完整的http头信息。<br><br>open<br>创建一个新的http请求，并指定此请求的方法、URL以及验证信息<br><br>语法<br>oXMLHttpRequest.open(bstrMethod,&nbsp;bstrUrl,&nbsp;varAsync,&nbsp;bstrUser,&nbsp;bstrPassword);<br><br>参数<br>bstrMethod<br>http方法，例如：POST、GET、PUT及PROPFIND。大小写不敏感。<br><br>bstrUrl<br>请求的URL地址，可以为绝对地址也可以为相对地址。<br><br>varAsync[可选]<br>布尔型，指定此请求是否为异步方式，默认为true。如果为真，当状态改变时会调用onreadystatechange属性指定的回调函数。<br><br>bstrUser[可选]<br>如果服务器需要验证，此处指定用户名，如果未指定，当服务器需要验证时，会弹出验证窗口。<br><br>bstrPassword[可选]<br>验证信息中的密码部分，如果用户名为空，则此值将被忽略。<br><br>下面的例子演示从服务器请求book.xml,并显示其中的book字段。<br><br>var&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&quot;<a target="_blank" href="http://localhost/books.xml&quot;">http://localhost/books.xml&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>var&nbsp;book&nbsp;=&nbsp;xmlhttp.responseXML.selectSingleNode(&quot;//book[@id=&#39;bk101&#39;]&quot;);&nbsp;<br>alert(book.xml);<br><br>备注<br>调用此方法后，可以调用send方法向服务器发送数据。<br><br>send<br>发送请求到http服务器并接收回应<br><br>语法<br>oXMLHttpRequest.send(varBody);<br><br>参数<br>varBody&nbsp;<br>欲通过此请求发送的数据。<br><br>xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP.3.0&quot;);&nbsp;<br>xmlhttp.open(&quot;GET&quot;,&nbsp;&quot;<a target="_blank" href="http://hi.baidu.com/ailiss&quot;">http://hi.baidu.com/ailiss&quot;</a>,&nbsp;false);&nbsp;<br>xmlhttp.send();&nbsp;<br>alert(xmlhttp.responseXML.xml);<br><br>备注<br>此方法的同步或异步方式取决于open方法中的bAsync参数，如果bAsync&nbsp;==&nbsp;False，此方法将会等待请求完成或者超时时才会返回，如果bAsync&nbsp;==&nbsp;True，此方法将立即返回。<br><br>This&nbsp;method&nbsp;takes&nbsp;one&nbsp;optional&nbsp;parameter,&nbsp;which&nbsp;is&nbsp;the&nbsp;requestBody&nbsp;to&nbsp;use.&nbsp;The&nbsp;acceptable&nbsp;VARIANT&nbsp;input&nbsp;types&nbsp;are&nbsp;BSTR,&nbsp;SAFEARRAY&nbsp;of&nbsp;UI1&nbsp;(unsigned&nbsp;bytes),&nbsp;IDispatch&nbsp;to&nbsp;an&nbsp;XML&nbsp;Document&nbsp;Object&nbsp;Model&nbsp;(DOM)&nbsp;object,&nbsp;and&nbsp;IStream&nbsp;*.&nbsp;You&nbsp;can&nbsp;use&nbsp;only&nbsp;chunked&nbsp;encoding&nbsp;(for&nbsp;sending)&nbsp;when&nbsp;sending&nbsp;IStream&nbsp;*&nbsp;input&nbsp;types.&nbsp;The&nbsp;component&nbsp;automatically&nbsp;sets&nbsp;the&nbsp;Content-Length&nbsp;header&nbsp;for&nbsp;all&nbsp;but&nbsp;IStream&nbsp;*&nbsp;input&nbsp;types.<br><br>如果发送的数据为BSTR，则回应被编码为utf-8,&nbsp;必须在适当位置设置一个包含charset的文档类型头。<br><br>If&nbsp;the&nbsp;input&nbsp;type&nbsp;is&nbsp;a&nbsp;SAFEARRAY&nbsp;of&nbsp;UI1,&nbsp;the&nbsp;response&nbsp;is&nbsp;sent&nbsp;as&nbsp;is&nbsp;without&nbsp;additional&nbsp;encoding.&nbsp;The&nbsp;caller&nbsp;must&nbsp;set&nbsp;a&nbsp;Content-Type&nbsp;header&nbsp;with&nbsp;the&nbsp;appropriate&nbsp;content&nbsp;type.<br><br>如果发送的数据为XML&nbsp;DOM&nbsp;object，则回应将被编码为在xml文档中声明的编码，如果在xml文档中没有声明编码，则使用默认的UTF-8。<br><br>If&nbsp;the&nbsp;input&nbsp;type&nbsp;is&nbsp;an&nbsp;IStream&nbsp;*,&nbsp;the&nbsp;response&nbsp;is&nbsp;sent&nbsp;as&nbsp;is&nbsp;without&nbsp;additional&nbsp;encoding.&nbsp;The&nbsp;caller&nbsp;must&nbsp;set&nbsp;a&nbsp;Content-Type&nbsp;header&nbsp;with&nbsp;the&nbsp;appropriate&nbsp;content&nbsp;type.<br><br>setRequestHeader<br>单独指定请求的某个http头<br><br>语法<br>oXMLHttpRequest.setRequestHeader(bstrHeader,&nbsp;bstrValue);<br><br>参数<br>bstrHeader<br>字符串，头名称。<br><br>bstrValue<br>字符串，值。<br><br><br>备注<br>如果已经存在已此名称命名的http头，则覆盖之。此方法必须在open方法后调用。<br><br><br>xml&nbsp;文件<br><br>&lt;&nbsp;script&nbsp;&gt;<br>x&nbsp;=new&nbsp;ActiveXObject(&quot;Microsoft.XMLHTTP&quot;)<br>x.open(&quot;GET&quot;,&quot;<a target="_blank" href="http://keqiji.org/rss/listings.xml&quot;">http://keqiji.org/rss/listings.xml&quot;</a>,false)<br>x.send()<br>if(x.status==200)<br>{<br>d&nbsp;=&nbsp;x.responseXML<br>c&nbsp;=&nbsp;&quot;&lt;table&gt;&quot;<br>nodes&nbsp;=&nbsp;d.selectNodes(&quot;//RECORDS&quot;)&nbsp;<br>for(i&nbsp;=&nbsp;0;i&lt;nodes[0].childNodes.length;i++)<br>{<br>&nbsp;&nbsp;&nbsp;&nbsp;subnodes=nodes[0].childNodes[i].childNodes;<br>&nbsp;&nbsp;&nbsp;&nbsp;j=Math.floor(subnodes.length&nbsp;*&nbsp;Math.random())<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;c+=&quot;&lt;tr&gt;&lt;td&nbsp;style=&#39;color:ff0000;font-weight:bold&#39;&gt;&quot;&nbsp;+&nbsp;&nbsp;&nbsp;nodes[0].childNodes[i].nodeName&nbsp;+&nbsp;&quot;：&lt;/td&gt;&lt;/tr&gt;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;c+=&quot;&lt;tr&gt;&lt;td&gt;&lt;a&nbsp;href=&#39;&quot;&nbsp;+&nbsp;subnodes[j].childNodes[0].text&nbsp;+&nbsp;&quot;&#39;&gt;&quot;&nbsp;+&nbsp;subnodes[j].childNodes[1].text&nbsp;+&nbsp;&quot;&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;c+=&quot;&lt;tr&gt;&lt;td&gt;&quot;&nbsp;+subnodes[j].childNodes[2].text&nbsp;+&nbsp;&quot;&lt;/td&gt;&lt;/tr&gt;&quot;<br>}<br>c&nbsp;+=&nbsp;&quot;&lt;/table&gt;&quot;<br>document.all.t.innerHTML&nbsp;=&nbsp;c<br>}<br>&lt;/script&gt;<br><br><br>Post<br><br>function&nbsp;XHConn()<br>{<br>&nbsp;&nbsp;&nbsp;var&nbsp;xmlhttp,&nbsp;bComplete&nbsp;=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;try&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Msxml2.XMLHTTP&quot;);&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch&nbsp;(e)&nbsp;{&nbsp;try&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;ActiveXObject(&quot;Microsoft.XMLHTTP&quot;);&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch&nbsp;(e)&nbsp;{&nbsp;try&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;new&nbsp;XMLHttpRequest();&nbsp;}<br>&nbsp;&nbsp;&nbsp;catch&nbsp;(e)&nbsp;{&nbsp;xmlhttp&nbsp;=&nbsp;false;&nbsp;}}}<br>&nbsp;&nbsp;&nbsp;if&nbsp;(!xmlhttp)&nbsp;return&nbsp;null;<br>&nbsp;&nbsp;&nbsp;this.connect&nbsp;=&nbsp;function(sURL,&nbsp;sMethod,&nbsp;sVars,&nbsp;fnDone)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!xmlhttp)&nbsp;return&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bComplete&nbsp;=&nbsp;false;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sMethod&nbsp;=&nbsp;sMethod.toUpperCase();<br><br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;try&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(sMethod&nbsp;==&nbsp;&quot;GET&quot;)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.open(sMethod,&nbsp;sURL+&quot;?&quot;+sVars,&nbsp;true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sVars&nbsp;=&nbsp;&quot;&quot;;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.open(sMethod,&nbsp;sURL,&nbsp;true);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.setRequestHeader(&quot;Method&quot;,&nbsp;&quot;POST&nbsp;&quot;+sURL+&quot;&nbsp;HTTP/1.1&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.setRequestHeader(&quot;Content-Type&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&quot;application/x-www-form-urlencoded&quot;);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.onreadystatechange&nbsp;=&nbsp;function(){<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(xmlhttp.readyState&nbsp;==&nbsp;4&nbsp;&amp;&amp;&nbsp;!bComplete)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bComplete&nbsp;=&nbsp;true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fnDone(xmlhttp);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}};<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xmlhttp.send(sVars);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;catch(z)&nbsp;{&nbsp;return&nbsp;false;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true;<br>&nbsp;&nbsp;&nbsp;};<br>&nbsp;&nbsp;&nbsp;return&nbsp;this;<br>}<br><br>]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=529</link><dc:subject>网络网站</dc:subject><dc:creator>admin</dc:creator><dc:date>2009-11-27 17:26:46</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=528"><title><![CDATA[霍夫变换(Hough Transform)(转)]]></title><description><![CDATA[霍夫变换是图像处理中从图像中识别几何形状的基本方法之一，应用很广泛，也有很多改&nbsp;<br>进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;我们先看这样一个问题：设已知一黑白图像上画了一条直线，要求出这条直线所在的位置&nbsp;<br>。我们知道，直线的方程可以用y=k*x+b&nbsp;来表示，其中k和b是参数，分别是斜率和截距。过某一点&nbsp;]]></description><content:encoded><![CDATA[霍夫变换是图像处理中从图像中识别几何形状的基本方法之一，应用很广泛，也有很多改&nbsp;<br>进算法。最基本的霍夫变换是从黑白图像中检测直线(线段)。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;我们先看这样一个问题：设已知一黑白图像上画了一条直线，要求出这条直线所在的位置&nbsp;<br>。我们知道，直线的方程可以用y=k*x+b&nbsp;来表示，其中k和b是参数，分别是斜率和截距。过某一点&nbsp;<br>(x0,y0)的所有直线的参数都会满足方程y0=kx0+b。即点(x0,y0)确定了一族直线。方程y0=kx0+b在&nbsp;<br>参数k--b平面上是一条直线，(你也可以是方程b=-x0*k+y0对应的直线)。这样，图像x--y平面上的&nbsp;<br>一个前景像素点就对应到参数平面上的一条直线。我们举个例子说明解决前面那个问题的原理。设&nbsp;<br>图像上的直线是y=x,&nbsp;我们先取上面的三个点：A(0,0),&nbsp;B(1,1),&nbsp;C(22)。可以求出，过A点的直线&nbsp;<br>的参数要满足方程b=0,&nbsp;过B点的直线的参数要满足方程1=k+b,&nbsp;过C点的直线的参数要满足方程&nbsp;<br>2=2k+b,&nbsp;这三个方程就对应着参数平面上的三条直线，而这三条直线会相交于一点(k=1,b=0)。　同&nbsp;<br>理，原图像上直线y=x上的其它点(如(3,3),(4,4)等)　对应参数平面上的直线也会通过点(k=1,b=0)&nbsp;<br>。这个性质就为我们解决问题提供了方法：&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;首先，我们初始化一块缓冲区，对应于参数平面，将其所有数据置为0.&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;对于图像上每一前景点，求出参数平面对应的直线，把这直线上的所有点的值都加１。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;最后，找到参数平面上最大点的位置，这个位置就是原图像上直线的参数。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;上面就是霍夫变换的基本思想。就是把图像平面上的点对应到参数平面上的线，最后通过&nbsp;<br>统计特性来解决问题。假如图像平面上有两条直线，那么最终在参数平面上就会看到两个峰值点，&nbsp;<br>依此类推。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;在实际应用中，y=k*x+b形式的直线方程没有办法表示x=c形式的直线(这时候，直线的斜&nbsp;<br>率为无穷大)。所以实际应用中，是采用参数方程p=x*cos(theta)+y*sin(theta)。这样，图像平面&nbsp;<br>上的一个点就对应到参数p---theta平面上的一条曲线上。其它的还是一样。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;在看下面一个问题：我们要从一副图像中检测出半径以知的圆形来。这个问题比前一个还&nbsp;<br>要直观。我们可以取和图像平面一样的参数平面，以图像上每一个前景点为圆心，以已知的半径在&nbsp;<br>参数平面上画圆，并把结果进行累加。最后找出参数平面上的峰值点，这个位置就对应了图像上的&nbsp;<br>圆心。在这个问题里，图像平面上的每一点对应到参数平面上的一个圆。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;把上面的问题改一下，假如我们不知道半径的值，而要找出图像上的圆来。这样，一个办&nbsp;<br>法是把参数平面扩大称为三维空间。就是说，参数空间变为x--y--R三维，对应圆的圆心和半径。&nbsp;<br>图像平面上的每一点就对应于参数空间中每个半径下的一个圆，这实际上是一个圆锥。最后当然还&nbsp;<br>是找参数空间中的峰值点。不过，这个方法显然需要大量的内存，运行速度也会是很大问题。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;有什么更好的方法么?我们前面假定的图像都是黑白图像(2值图像)，实际上这些2值图像&nbsp;<br>多是彩色或灰度图像通过边缘提取来的。我们前面提到过，图像边缘除了位置信息，还有方向信息&nbsp;<br>也很重要，这里就用上了。根据圆的性质，圆的半径一定在垂直于圆的切线的直线上，也就是说，&nbsp;<br>在圆上任意一点的法线上。这样，解决上面的问题，我们仍采用2维的参数空间，对于图像上的每&nbsp;<br>一前景点，加上它的方向信息，都可以确定出一条直线，圆的圆心就在这条直线上。这样一来，问&nbsp;<br>题就会简单了许多。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;接下来还有许多类似的问题，如检测出椭圆，正方形，长方形，圆弧等等。这些方法大都&nbsp;<br>类似，关键就是需要熟悉这些几何形状的数学性质。霍夫变换的应用是很广泛的，比如我们要做一&nbsp;<br>个支票识别的任务，假设支票上肯定有一个红颜色的方形印章，我们可以通过霍夫变换来对这个印&nbsp;<br>章进行快速定位，在配合其它手段进行其它处理。霍夫变换由于不受图像旋转的影响，所以很容易&nbsp;<br>的可以用来进行定位。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;霍夫变换有许多改进方法，一个比较重要的概念是广义霍夫变换，它是针对所有曲线的，&nbsp;<br>用处也很大。就是针对直线的霍夫变换也有很多改进算法，比如前面的方法我们没有考虑图像上的&nbsp;<br>这一直线上的点是否连续的问题，这些都要随着应用的不同而有优化的方法。&nbsp;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;顺便说一句，搞图像处理这一行，在理论方面，有几本杂志是要看的，自然是英文杂志，&nbsp;<br>中文期刊好象没有专门的图像处理期刊，当然也有不少涉及这方面的期刊，但事实求是来说，的确&nbsp;<br>比英文杂志水平差很多。&nbsp;<br>]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=528</link><dc:subject>算法</dc:subject><dc:creator>admin</dc:creator><dc:date>2009-11-26 9:42:49</dc:date></item><item rdf:about="http://www.zhangheng.net/BLOG/blogview.asp?logID=526"><title><![CDATA[验证码识别思路]]></title><description><![CDATA[[down=attachments/month_0911/tqiw_code_shibie.rar]点击下载此文件[/down]]]></description><content:encoded><![CDATA[<img src="images/download.gif" align="absmiddle" /> <a href="attachments/month_0911/tqiw_code_shibie.rar" target="_blank">点击下载此文件</a>]]></content:encoded><link>http://www.zhangheng.net/BLOG/blogview.asp?logID=526</link><dc:subject>程序设计</dc:subject><dc:creator>admin</dc:creator><dc:date>2009-11-23 9:49:05</dc:date></item>
</rdf:Seq>
</items>
</channel>
</rdf:RDF>