﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-Skynet-随笔分类-image</title><link>http://www.blogjava.net/Skynet/category/35330.html</link><description /><language>zh-cn</language><lastBuildDate>Mon, 07 Dec 2009 17:28:51 GMT</lastBuildDate><pubDate>Mon, 07 Dec 2009 17:28:51 GMT</pubDate><ttl>60</ttl><item><title>给自己的 图片处理工具 (py2exe)</title><link>http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Mon, 07 Dec 2009 07:12:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/305005.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/305005.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/305005.html</trackback:ping><description><![CDATA[<br />
<br />
工具为&nbsp; dist/myImg.exe<br />
<br />
<br />
工具使用:<br />
在 dist 中<br />
myImg.exe Ratio&nbsp; c:/需要等比压缩图片/*.jpg&nbsp; d:/等比后路径&nbsp;&nbsp; 等比款width&nbsp; 等比高height <br />
myImg.exe Watermark c:/水印图片/x.png&nbsp; c:/需要加水印图片/*.jpg&nbsp; d:/添加水印后图片&nbsp;&nbsp; 加水印width处&nbsp; 加水印height处<br />
<br />
等比压缩实例:<br />
myImg.exe Ratio &nbsp;<br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"img"*.jpg" <br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"MyDropbox"tools"img"src"python"dist"test"toimg2" <br />
&nbsp;&nbsp; &nbsp;600 400<br />
结果在&nbsp; ../dist"test"toimg&nbsp; 目录下 生成 等比图片 testratio_600_400.jpg<br />
<br />
<br />
水印添加实例:<br />
myImg.exe Watermark <br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"img"logo.png"&nbsp; &nbsp;<br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"toimg2"*.jpg" <br />
&nbsp;&nbsp; &nbsp;"C:"Documents and Settings"lky"My Documents"My Dropbox"tools"img"src"python"dist"test"toimg3" <br />
&nbsp;&nbsp; &nbsp;100 220<br />
结果在&nbsp; ../dist"test"toimg3&nbsp; 目录下 生成 等比图片 test_ratio_600_400_watermark_100_220.jpg<br />
<br />
<br />
<br />
安装 python PIL 包<br />
和安装 python py2exe <br />
<br />
工具脚本 py <br />
<br />
<br />
工具编译过程:<br />
python setup.py py2exe <br />
<br />
<br />
<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sys<br />
<br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;imgRatio(imgpath,tpath</span><span style="color: #000000;">=</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">,width</span><span style="color: #000000;">=</span><span style="color: #000000;">600</span><span style="color: #000000;">,height</span><span style="color: #000000;">=</span><span style="color: #000000;">400</span><span style="color: #000000;">):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Image,os<br />
&nbsp;&nbsp;&nbsp;&nbsp;im&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(&nbsp;imgpath&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;im.thumbnail(&nbsp;(width,height)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;imgpath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;os.path.split(imgpath)[</span><span style="color: #000000;">1</span><span style="color: #000000;">]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;os.path.exists(tpath)&nbsp;:&nbsp;os.makedirs(tpath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;im.save(&nbsp;tpath</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">imgpath.split(</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">)[0]</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_ratio_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(width)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(height)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">.jpg</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;)<br />
<br />
<br />
</span><span style="color: #0000ff;">def</span><span style="color: #000000;">&nbsp;imgWatermark(imgwate,imgpath,sw</span><span style="color: #000000;">=</span><span style="color: #000000;">100</span><span style="color: #000000;">,sh</span><span style="color: #000000;">=</span><span style="color: #000000;">50</span><span style="color: #000000;">,tpath</span><span style="color: #000000;">=</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Image,os<br />
&nbsp;&nbsp;&nbsp;&nbsp;baseim&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(&nbsp;imgpath&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;floatim&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(&nbsp;imgwate&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;baseim.paste(&nbsp;floatim,&nbsp;(sw,sh&nbsp;)&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;imgpath&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;os.path.split(imgpath)[</span><span style="color: #000000;">1</span><span style="color: #000000;">]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">not</span><span style="color: #000000;">&nbsp;os.path.exists(tpath)&nbsp;:&nbsp;os.makedirs(tpath)<br />
&nbsp;&nbsp;&nbsp;&nbsp;baseim.save(&nbsp;tpath</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">/</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">imgpath.split(</span><span style="color: #800000;">'</span><span style="color: #800000;">.</span><span style="color: #800000;">'</span><span style="color: #000000;">)[0]</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_watermark_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(sw)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">_</span><span style="color: #800000;">'</span><span style="color: #000000;">+</span><span style="color: #000000;">str(sh)</span><span style="color: #000000;">+</span><span style="color: #800000;">'</span><span style="color: #800000;">.jpg</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;)<br />
&nbsp;&nbsp;&nbsp;&nbsp;<br />
<br />
args&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;sys.argv<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;glob,os<br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Ratio&nbsp;&nbsp;/path/*.jpg&nbsp;&nbsp;/tpath&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;height&nbsp;&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;args[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">Ratio</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;img&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;glob.glob(args[</span><span style="color: #000000;">2</span><span style="color: #000000;">])&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgRatio(os.path.abspath(img),args[</span><span style="color: #000000;">3</span><span style="color: #000000;">],int(args[</span><span style="color: #000000;">4</span><span style="color: #000000;">]),int(args[</span><span style="color: #000000;">5</span><span style="color: #000000;">]))<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">&nbsp;Watermark&nbsp;/path/x.png&nbsp;&nbsp;/path/*.jpg&nbsp;&nbsp;/tpath&nbsp;&nbsp;&nbsp;width&nbsp;&nbsp;height&nbsp;</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">if</span><span style="color: #000000;">&nbsp;args[</span><span style="color: #000000;">1</span><span style="color: #000000;">]&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">'</span><span style="color: #800000;">Watermark</span><span style="color: #800000;">'</span><span style="color: #000000;">&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;img&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;glob.glob(args[</span><span style="color: #000000;">3</span><span style="color: #000000;">])&nbsp;:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;imgWatermark(args[</span><span style="color: #000000;">2</span><span style="color: #000000;">],img,int(args[</span><span style="color: #000000;">5</span><span style="color: #000000;">]),int(args[</span><span style="color: #000000;">6</span><span style="color: #000000;">]),args[</span><span style="color: #000000;">4</span><span style="color: #000000;">])<br />
<br />
<br />
</span></div>
<br />
<br />
py2exe<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">#</span><span style="color: #008000;">!/usr/bin/python</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;-*-&nbsp;coding:&nbsp;utf-8&nbsp;-*-</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;&nbsp;py2exe&nbsp;file</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;1.install&nbsp;py2exe&nbsp;application</span><span style="color: #008000;"><br />
#</span><span style="color: #008000;">&nbsp;2.python&nbsp;setup.py&nbsp;py2exe</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">from</span><span style="color: #000000;">&nbsp;distutils.core&nbsp;</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;setup<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;py2exe<br />
setup(console</span><span style="color: #000000;">=</span><span style="color: #000000;">[</span><span style="color: #800000;">'</span><span style="color: #800000;">myImg.py</span><span style="color: #800000;">'</span><span style="color: #000000;">])<br />
</span></div>
<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/305005.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-12-07 15:12 <a href="http://www.blogjava.net/Skynet/archive/2009/12/07/305005.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>python pil 使用(转)</title><link>http://www.blogjava.net/Skynet/archive/2009/11/28/303986.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Fri, 27 Nov 2009 16:10:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/11/28/303986.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/303986.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/11/28/303986.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/303986.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/303986.html</trackback:ping><description><![CDATA[<br />
<br />
http://www.cnpython.org/docs/100/p_19.html<br />
<br />
<br />
<table align="center" border="0" cellpadding="0" cellspacing="0" width="970">
    <tbody>
        <tr>
            <td valign="top">
            <table border="0" cellpadding="0" cellspacing="0" width="100%">
                <tbody>
                    <tr>
                        <td colspan="2" class="text">
                        <div id="articleBody">
                        <div>
                        <h1><a id="id2" href="http://tech.seety.org/python/python_imaging.html#id1" name="id2">1&nbsp;&nbsp;&nbsp;影像與圖形資料的處理</a></h1>
                        <p>上一回我們談過了圖形介面程式的撰寫，這一次我們要討論圖形 (影像) 本身的處理，而討論的內容將會集中在 Python Imaging Library   (PIL) 這一套程式庫上。</p>
                        <p>PIL
                        是 Python 下最有名的影像處理套件，由許多不同的模組所組成，並且提供了許多的處理功能，允許我們在簡單的 Python
                        程式裡進行影像的處理。使用像 PIL 許樣的程式庫套件可以幫助我們把精力集中在影像處理的工作本身，避免迷失在底層的演算法裡面。</p>
                        <p>由於影像處理牽涉到了大量的數學運算，因此 PIL 中有許多的模組是用 C   語言所寫成的，以提昇處理的效率。不過，在使用的時候，我們當然不必在意這樣的問題，只管放心地用就是了。</p>
                        <div>
                        <h2><a id="pil" href="http://tech.seety.org/python/python_imaging.html#id1" name="pil">1.1&nbsp;&nbsp;&nbsp;PIL 能為你作的事</a></h2>
                        <p>PIL 具備 (但不限於) 以下的能力：</p>
                        <ul>
                            <li>數
                            十種圖檔格式的讀寫能力。常見的 JPEG, PNG, BMP, GIF, TIFF 等格式，都在 PIL 的支援之列。另外，PIL
                            也支援黑白、灰階、自訂調色盤、RGB true color、帶有透明屬性的 RBG true color、CMYK
                            及其它數種的影像模式。相當齊全。 </li>
                            <li>基本的影像資料操作：裁切、平移、旋轉、改變尺寸、調置 (transpose)、剪下與貼上等等。 </li>
                            <li>強化圖形：亮度、色調、對比、銳利度。 </li>
                            <li>色彩處理。 </li>
                            <li>PIL 提供十數種濾鏡 (filter)。當然，這個數目遠遠不能與 Photoshop&#174; 或 GIMP&#174; 這樣的專業特效處理軟體相比；但 PIL   提供的這些濾鏡可以用在 Python 程式裡面，提供批次化處理的能力。 </li>
                            <li>PIL 可以在影像中繪圖製點、線、面、幾何形狀、填滿、文字等等。 </li>
                        </ul>
                        <p>接下來，我們開始一步一步地對 Python/PIL 的影像處理程式設計進行討論。</p>
                        </div>
                        </div>
                        <div>
                        <h1><a id="id3" href="http://tech.seety.org/python/python_imaging.html#id1" name="id3">2&nbsp;&nbsp;&nbsp;轉換圖檔格式</a></h1>
                        <p>市面上有許多影像處理程式，一般人最常用它們來處理的工作大概就是圖檔格式轉換了；這是影像處理軟體最基本的功能，PIL 當然也要支援。</p>
                        <p>假設我們有一個 JPG 檔案，名字叫作 sample01.jpg，那麼，以下的程式會把這個檔案載入 Python：</p>
                        <pre>&gt;&gt;&gt; import Image<br />
                        <br />
                        &gt;&gt;&gt; im = Image.open( "sample01.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>im 這個物件是由 Image.open() 方法所產生出來的 Image 物件。我們可以用 Image   物件內的屬性來查詢關於此檔案的資訊：</p>
                        <pre>&gt;&gt;&gt; print im.format, im.size, im.mode<br />
                        <br />
                        JPEG (2288, 1712) RGB<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>格
                        式字串放在 format 屬性裡，尺寸放在 size 屬性裡，而 (調色盤) 模式放在 mode
                        屬性裡。從以上的執行結果，可以看出來我們讀的確實是一個 JPEG 檔案，檔案的尺寸是 2288 像素寬、1712 像素高，調色盤是 RGB
                        全彩模式。</p>
                        <p>既然我們已經把圖檔讀入了 Python，要處理它就簡單了。利用 Image 類別的 save() 方法，可以把檔案儲存成 PIL 支援的格式：</p>
                        <pre>&gt;&gt;&gt; im.save( "fileout.png" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>如果圖檔很大，這會花上一點時間。Image.save() 方法會根據欲存檔的副檔名，自動判斷要存圖檔的格式 (剛剛我們用的 open() 函式也會這樣作)。</p>
                        <p>save()   可以指定存檔格式。在以下的例子裡，我們把存檔格式指定為 JPEG：</p>
                        <pre>&gt;&gt;&gt; im.save( "fileout.png", "JPEG" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>這時候副檔名是無所謂的。</p>
                        <p>只處理一兩個檔案的時候，使用 Python 直譯器就相當合適。然而若要處理一大群檔案，譬如把一整個目錄的 JPEG 檔轉換為 PNG   檔，那麼寫成一個程式檔會比較方便，例如：</p>
                        <pre>#!/usr/bin/env python<br />
                        <br />
                        <br />
                        <br />
                        from glob import glob<br />
                        <br />
                        from os.path import splitext<br />
                        <br />
                        import Image<br />
                        <br />
                        <br />
                        <br />
                        jpglist = glob( "python_imaging_pix/*.[jJ][pP][gG]" )<br />
                        <br />
                        <br />
                        <br />
                        for jpg in jpglist:<br />
                        <br />
                        im = Image.open(jpg)<br />
                        <br />
                        png = splitext(jpg)[0]+".png"<br />
                        <br />
                        im.save(png)<br />
                        <br />
                        print png<br />
                        <br />
                        <br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>只要在一個放了 *.jpg 或 *.JPG   檔案的目錄裡面執行這個指令稿，它就會把所有的 JPEG 檔轉成 PNG 檔案：</p>
                        <pre>$ ./convertdir.py<br />
                        <br />
                        file0001.png<br />
                        <br />
                        file0002.png<br />
                        <br />
                        .<br />
                        <br />
                        .<br />
                        <br />
                        file9999.png<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>既然 PIL 會從檔名偵測常用的檔案格式，存檔時我們通常都不會指定存檔格式。</p>
                        <p>然
                        而，依據檔案格式的不同，save() 方法提供了不同的選項參數。以 JPEG 而言，它可以接受 quality (從 1 到 100
                        的整數，預設為 75)、optimize (真假值) 及 progression (真假值)。在以下的例子裡，我們以 100 的
                        quality 來儲存 JPEG 檔案：</p>
                        <pre>&gt;&gt;&gt; im.save( "quality100.jpg", quality=100 )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <div>
                        <p>要訣</p>
                        <p>PIL 也支援 EPS (Encapsulate PostScript) 格式的寫入。TeX 的使用者可以利用 PIL   來簡單地把圖檔轉成 EPS 以供 TeX compiler 使用。</p>
                        </div>
                        </div>
                        <div>
                        <h1><a id="id4" href="http://tech.seety.org/python/python_imaging.html#id1" name="id4">3&nbsp;&nbsp;&nbsp;改變影像與製作縮圖</a></h1>
                        <p>在了解了基本的圖檔轉換之後，我們來看看如何對影像進行尺寸方面的修改。PIL 對 Image 物件提供了 resize 方法，以執行影像的縮放工作。用我們的 sample01.jpg 檔案來當例子：</p>
                        <pre>&gt;&gt;&gt; im = Image.open( "sample01.jpg" )<br />
                        <br />
                        &gt;&gt;&gt; print im.size<br />
                        <br />
                        (2288, 1712)<br />
                        <br />
                        &gt;&gt;&gt; width = 400<br />
                        <br />
                        &gt;&gt;&gt; ratio = float(width)/im.size[0]<br />
                        <br />
                        &gt;&gt;&gt; height = int(im.size[1]*ratio)<br />
                        <br />
                        &gt;&gt;&gt; nim = im.resize( (width, height), Image.BILINEAR )<br />
                        <br />
                        &gt;&gt;&gt; print nim.size<br />
                        <br />
                        (400, 299)<br />
                        <br />
                        &gt;&gt;&gt; nim.save( "resized.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>然後我們就會得到比較小的 resized.jpg：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/resized.jpg" alt="python_imaging_pix/resized.jpg" height="299" width="400" /></div>
                        <p>resize()
                        這個方法會傳回一個新的 Image 物件，所以舊的 Image 不會被更動。resize()
                        接受兩個參數，第一個用來指定變更後的大小，是一個雙元素
                        tuple，分別用以指定影像的寬與高；第二個參數可以省略，是用來指定變更時使用的內插法，預設是 Image.NEAREST
                        (取最近點)，這裡我們指定為品質比較好的 Image.BILINEAR。</p>
                        <p>resize()   可以把影像放大縮小，在使用時一定要傳入寬與高。上面的程式會先限定新影像的寬，再根據舊影像的長寬比例來算出新影像的高應該是多少，最後把尺寸值傳入 resize() 去。由此可知，resize() 是允許我們不等比例縮放的：</p>
                        <pre>&gt;&gt;&gt; width = 400<br />
                        <br />
                        &gt;&gt;&gt; height = 100<br />
                        <br />
                        &gt;&gt;&gt; nim2 = im.resize( (width, height), Image.BILINEAR )<br />
                        <br />
                        &gt;&gt;&gt; nim2.save( "resize2wide.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>會得到形狀奇怪的縮圖：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/resize2wide.jpg" alt="python_imaging_pix/resize2wide.jpg" height="100" width="400" /></div>
                        <p>我們可以任意改變新影像的尺寸值。</p>
                        <p>另一個常用的操作是旋轉；rotate()   方法可以用來旋轉影像。它取兩個參數，第一個參數是一個逆時針的度數，第二個參數則也是影像處理時的內插法，可省略：</p>
                        <pre>&gt;&gt;&gt; nim3 = nim.rotate( 45, Image.BILINEAR )<br />
                        <br />
                        &gt;&gt;&gt; nim3.save( "rotated.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>rotate() 並不會改變影像的尺寸   (dimension)，所以你會看到：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/rotated.jpg" alt="python_imaging_pix/rotated.jpg" height="299" width="400" /></div>
                        <p>出現了黑邊。如果我們想要連影像尺寸一起變動，得要改用 transpose() 方法：</p>
                        <pre>&gt;&gt;&gt; nim4 = nim.transpose( Image.ROTATE_90 )<br />
                        <br />
                        &gt;&gt;&gt; nim4.save( "transposed90.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>結果是：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/transposed90.jpg" alt="python_imaging_pix/transposed90.jpg" height="400" width="299" /></div>
                        <p>transpose()
                        方法接受 Image.FLIP_LEFT_RIGHT, Image.FLIP_TOP_DOWN, ROTATE_90, ROTATE_180,
                        ROTATE_270 等五種參數；其中後三種的旋轉均為逆時針。rotate() 方法會對像素資料進行內插；而 transpose()
                        則只是轉置像素資料，所以沒有內插參數可以設定，也不會影響影像的品質。</p>
                        <p>縮放與旋轉是最常用的兩個操
                        作，而在其中，縮圖的製作可能是特別常用的；PIL 對縮圖提供了一個方便的 thumbnail() 方法。thumbnail() 會直接修改
                        Image 物件本身，所以速度能比 resize()
                        更快，也消耗更少的記憶體。它不接受指定內插法的參數，而且只能縮小影像，不能放大影像；用法是：</p>
                        <pre>&gt;&gt;&gt; im = Image.open( "sample01.jpg" )<br />
                        <br />
                        &gt;&gt;&gt; im.thumbnail( (400,100) )<br />
                        <br />
                        &gt;&gt;&gt; im.save( "thumbnail.jpg" )<br />
                        <br />
                        &gt;&gt;&gt; print im.size<br />
                        <br />
                        (133, 100)<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>thumbnail()
                        在接受尺寸參數的時候，行為與 resize() 不同；resize() 允許我們不等比例進行縮放，但 thumbnail()
                        只能進行等比例縮小，並且是以長、寬中比較小的那一個值為基準。因此，上面的程式所作出的 thumbnail.jpg 變成了 133*100
                        的小圖片：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/thumbnail.jpg" alt="python_imaging_pix/thumbnail.jpg" height="100" width="133" /></div>
                        <p>有了這些操作，我們可以很輕易地執行影像管理的任務。</p>
                        </div>
                        <div>
                        <h1><a id="id5" href="http://tech.seety.org/python/python_imaging.html#id1" name="id5">4&nbsp;&nbsp;&nbsp;修改圖形內容</a></h1>
                        <p>除了可以針對圖形的尺寸作變更之外，PIL   更提供我們變更影像內容的能力。這樣，我們就不只能對影像進行管理，而能更進一步地利用程式來把影像的內容改成我們想要的樣子。</p>
                        <p>我們從「貼圖」開始：</p>
                        <pre>&gt;&gt;&gt; baseim = Image.open( "resized.jpg" )<br />
                        <br />
                        &gt;&gt;&gt; floatim = Image.open( "thumbnail.jpg" )<br />
                        <br />
                        &gt;&gt;&gt; baseim.paste( floatim, (150, 50) )<br />
                        <br />
                        &gt;&gt;&gt; baseim.save( "pasted.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>利用 paste() 方法，把之前作的   thumbnail.jpg 貼到 resized.jpg 裡面去：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/pasted.jpg" alt="python_imaging_pix/pasted.jpg" height="299" width="400" /></div>
                        <p>此種用法的 paste()   方法要求兩個參數，第一是要貼上的 Image，第二是要貼上的位置。第二個參數有三種指定的方式：</p>
                        <ul>
                            <li>None：不指定位置與尺寸，那麼   pasted() 會假設要貼上的 Image   與被貼上的 Image 的尺寸完全相同。 </li>
                            <li>(left, upper)：雙元素 tuple。pasted() 會把要貼上的 Image 的左上角對齊在指定的位置。 </li>
                            <li>(left,
                            upper, right, lower)：四元素 tuple。paste()` 除了會把 Image
                            的左上角對齊外，也會對齊右下角。不過基本上這種寫法和上面那一種一樣，因為 paste()
                            要求要貼上的影像與這裡指定的尺寸一致，所以不可能出現不同的兩組 right, lower。 </li>
                        </ul>
                        <p>除了「貼圖」之外，我們還可以對影像的內容進行裁切：</p>
                        <pre>&gt;&gt;&gt; im = Image.open( "sample01.jpg" )<br />
                        <br />
                        &gt;&gt;&gt; nim = im.crop( (700, 300, 1500, 1300) )<br />
                        <br />
                        &gt;&gt;&gt; nim.thumbnail( (400,400) )<br />
                        <br />
                        &gt;&gt;&gt; nim.save( "croped.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>(因為裁切之後的圖形還是大了點，所以再縮圖一次) 得到的結果是：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/croped.jpg" alt="python_imaging_pix/croped.jpg" height="400" width="320" /></div>
                        <p>crop() 接受的 box   參數指定要裁切的左、上、右、下四個邊界值，形成一個矩形。</p>
                        <p>除了剪貼之外，PIL 還可以使用內建的濾鏡 (filter) 作一些特效處理。這些濾鏡都放在 ImageFilter   模組裡面，使用前要先匯入這個模組：</p>
                        <pre>&gt;&gt;&gt; import ImageFilter<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>我們用個例子，對剛剛裁切的 "No Riding" 禁止牌作 20 次 blur (糊化)，來看看 PIL 濾鏡的效果：</p>
                        <pre>&gt;&gt;&gt; im = Image.open( "croped.jpg" )<br />
                        <br />
                        &gt;&gt;&gt; nim = im<br />
                        <br />
                        &gt;&gt;&gt; for i in range(20): nim = nim.filter( ImageFilter.BLUR )<br />
                        <br />
                        ...<br />
                        <br />
                        &gt;&gt;&gt; nim.save( "blured.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>你應該看不出來它是 "No Riding" 了吧：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/blured.jpg" alt="python_imaging_pix/blured.jpg" height="400" width="320" /></div>
                        <p>使用濾鏡的基本語法是：</p>
                        <pre>newim = im.filter( ImageFilter.FILTERNAME )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>其
                        中 FILTERNAME 是 PIL 中支援的濾鏡名稱，目前有：BLUR, CONTOUR, DETAIL, EDGE_ENHANCE,
                        EDGE_ENHANCE_MORE, EMBOSS, FIND_EDGES, SMOOTH, SMOOTH_MORE,
                        SHARPEN，此處就不一一介紹了，但建議你可以自己來把每一個濾鏡都試試看。</p>
                        <p>利用濾鏡，我們可以對同一類的影像進行相同的特效處理。當然，影像特效需要很精細的調整，在自動化作業中通常只能達到很粗略的效果；但 PIL   既然提供了，我們的自動程序就擁有更多的工具可以使用。</p>
                        </div>
                        <div>
                        <h1><a id="id6" href="http://tech.seety.org/python/python_imaging.html#id1" name="id6">5&nbsp;&nbsp;&nbsp;用 PIL 製作新影像</a></h1>
                        <p>除了對已存在的影像進行編修之外，從零開始建立新影像也是很重要的工作。PIL 中的 ImageDraw 模組提供給我們繪製影像內容的能力。在使用 ImageDraw   之前，要先建立好空白的新影像：</p>
                        <pre>&gt;&gt;&gt; import ImageDraw<br />
                        <br />
                        &gt;&gt;&gt; im = Image.new( "RGB", (400,300) )<br />
                        <br />
                        &gt;&gt;&gt; draw = ImageDraw.Draw( im )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>最
                        後建出來的 draw 是一個 ImageDraw 物件會提供各種繪製影像的方法。針對幾何圖形，draw 物件提供 arc()
                        (弧線)、chord() (弦)、line() (線段)、ellipse() (橢圓)、point() (點)、rectangle()
                        (矩形) 與 polygon() (多邊形)。不過，我們不準備討論幾何圖形的繪製；相信這些方法的使用對一般人來說應該都很直覺才是。</p>
                        <div>
                        <p>要訣</p>
                        <p>你
                        可以在指令行輸入 pydoc ImageDraw.ImageDraw.&lt;&lt;methodname&gt;&gt; 來查詢上述方法
                        (&lt;&lt;methodname&gt;&gt;) 的說明，譬如 pydoc ImageDraw.ImageDraw.line。</p>
                        </div>
                        <p>這裡要介紹的不是幾何圖形，而是文字的繪製。我們要再介紹一個模組：ImageFont，並且以實例來說明如何用 PIL 「寫字」：</p>
                        <pre>&gt;&gt;&gt; import Image, ImageDraw, ImageFont<br />
                        <br />
                        &gt;&gt;&gt; font = ImageFont.truetype( "<br />
                        <br />
                        ... "/usr/share/fonts/truetype/freefont/FreeMono.ttf", 24 )<br />
                        <br />
                        &gt;&gt;&gt; im = Image.new( "RGB", (400,300) )<br />
                        <br />
                        &gt;&gt;&gt; draw = ImageDraw.Draw( im )<br />
                        <br />
                        &gt;&gt;&gt; draw.text( (20,20), "TEXT", font=font )<br />
                        <br />
                        &gt;&gt;&gt; im.save( "text.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>這樣就在一個黑色底圖上用白筆寫了 "TEXT" 四個大字：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/text.jpg" alt="python_imaging_pix/text.jpg" height="300" width="400" /></div>
                        <p>接
                        著一一說明剛剛作的動作。首先我們用 ImageFont 的 truetype() 函式建立了一個 TrueType 字型，大小設定為 16
                        點。truetype() 函式的第一個參數必須是字型檔的搜尋路徑，第二個參數是字型的點數。然後依序建立影像物件與 draw 物件。寫字的動作用
                        draw 物件的 text() 方法來完成，它接受兩個參數，分別是文字的左上角點、字串，另外可以用 font 選項來指定所使用的字型
                        (若不指定，便使用預設字型)。</p>
                        <p>在 1.1.4 版之前，PIL 是只能使用點陣字型的。現在
                        PIL 加入了 TrueType 向量字型的支援，對於要「寫字」的人來說實在是一大福音。對點陣字來說，想改變字型的大小得要更換字型才作得到，但
                        TrueType 就沒有這個限制。如果我們想要寫出兩串不同大小的文字，這樣作就可以了：</p>
                        <pre>&gt;&gt;&gt; largefont = ImageFont.truetype( "<br />
                        <br />
                        ... "/usr/share/fonts/truetype/freefont/FreeMono.ttf", 48 )<br />
                        <br />
                        &gt;&gt;&gt; smallfont = ImageFont.truetype( "<br />
                        <br />
                        ... "/usr/share/fonts/truetype/freefont/FreeMono.ttf", 24 )<br />
                        <br />
                        &gt;&gt;&gt; im = Image.new( "RBG", (400,300) )<br />
                        <br />
                        &gt;&gt;&gt; draw = ImageDraw.Draw( im )<br />
                        <br />
                        &gt;&gt;&gt; draw.text( (20,20), "SmallTEXT", font=smallfont )<br />
                        <br />
                        &gt;&gt;&gt; draw.text( (20,120), "LargeTEXT", font=largefont )<br />
                        <br />
                        &gt;&gt;&gt; im.save( "multitext.jpg" )<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>結果如：</p>
                        <div><img src="http://www.cnpython.org/docs_img/100/multitext.jpg" alt="python_imaging_pix/multitext.jpg" height="300" width="400" /></div>
                        <p>以上就是在 PIL 裡建立文字圖形的方法。</p>
                        <p>最後，我們要說明如何改變繪製圖形 (文字) 時的顏色；繪圖時畫筆的顏色是透過 draw 物件的 ink 屬性來改變的：</p>
                        <pre>&gt;&gt;&gt; draw.ink = 0 + 255*256 + 0*256*256<br />
                        <br />
                        <br />
                        <br />
                        </pre>
                        <p>以上會把畫筆設成綠色。ink   值必須要是一個整數，其值由色彩的 RGB 值算出。舉幾個 ink 值的例子：</p>
                        <ul>
                            <li>紅色的 ink 值應設為 255(R) +   0(G)*256 + 0(B)*256*256， </li>
                            <li>藍色的 ink 值應設為 0(R) +   0(G)*256 + 255(B)*256*256， </li>
                            <li>靛色的 ink 值應設為 0(R) +   255(G)*256 + 255(B)*256*256 </li>
                        </ul>
                        <p>所設定的 ink   會影響所有後續的繪圖動作。</p>
                        </div>
                        <h1><a id="id7" href="http://tech.seety.org/python/python_imaging.html#id1" name="id7">6&nbsp;&nbsp;&nbsp;結語</a></h1>
                        <p>本文介紹了方便好用的 PIL 套件，可以讓我們用 Python   撰寫影像處理的程式。我們對圖檔的格式處理、尺寸處理以及內容的編修都作了討論，最後也說明如何從零開始創作一個影像。</p>
                        <p>對網頁程式來說，動態產生簡單的影像是特別有用的功能，可以用來補足 HTML 與 CSS 的不足之處。利用 PIL   來執行批次影像處理的工作，更能省去我們許多的操作時間。相信讀者能從其中發現它所提供的生產力。</p>
                        </div>
                        <hr noshade="noshade" size="1" />
                        </td>
                    </tr>
                </tbody>
            </table>
            </td>
        </tr>
        <tr>
            <td>&nbsp;</td>
            <td>&nbsp;</td>
        </tr>
    </tbody>
</table>
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/303986.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-11-28 00:10 <a href="http://www.blogjava.net/Skynet/archive/2009/11/28/303986.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>验证码识别(2)</title><link>http://www.blogjava.net/Skynet/archive/2009/03/27/262300.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Fri, 27 Mar 2009 02:21:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2009/03/27/262300.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/262300.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2009/03/27/262300.html#Feedback</comments><slash:comments>3</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/262300.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/262300.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 各位&#8220;蜘蛛侠&#8221;们大家可能在抓取页面中的验证码而耿耿于怀,关于这点我想我目前可能能帮助下大家，在python中找到最接近与&#8220;杀手级别&#8221;的工具（源于开源，报与开源，好东西不干独享）。<br />
<br />
<br />
调下大家的积极性 ，上图<br />
<img style="width: 1035px; height: 987px;" alt="" src="http://www.blogjava.net/images/blogjava_net/skynet/yzmsb.JPG" border="0" width="1035" height="987" /><br />
<br />
<br />
python 包&gt;&gt; <a style="color: rgb(0, 0, 0); text-decoration: none;" href="http://code.google.com/p/pytesser/">pytesser</a>| http://code.google.com/p/pytesser/（其实 py包 使用很简单的，关键在安装）<br />
1. 首先安装 pil&nbsp;： easy_install --find-links http://www.pythonware.com/products/pil/ Imaging<br />
2. pytesser 依赖包 <a style="color: rgb(0, 0, 0); text-decoration: none;" href="http://code.google.com/p/tesseract-ocr/">tesseract-ocr</a>|&nbsp; <a href="http://code.google.com/p/tesseract-ocr/">http://code.google.com/p/tesseract-ocr/</a>&nbsp;&nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tesseract-ocr 依赖库| <a href="http://tesseract-ocr.googlecode.com/files/tesseract-2.00.eng.tar.gz">http://tesseract-ocr.googlecode.com/files/tesseract-2.00.eng.tar.gz</a> 解压到 你安装的 tesseract-ocr 的 识别学习库下<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/262300.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2009-03-27 10:21 <a href="http://www.blogjava.net/Skynet/archive/2009/03/27/262300.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>验证码识别(python)</title><link>http://www.blogjava.net/Skynet/archive/2008/10/18/235164.html</link><dc:creator>刘凯毅</dc:creator><author>刘凯毅</author><pubDate>Sat, 18 Oct 2008 06:53:00 GMT</pubDate><guid>http://www.blogjava.net/Skynet/archive/2008/10/18/235164.html</guid><wfw:comment>http://www.blogjava.net/Skynet/comments/235164.html</wfw:comment><comments>http://www.blogjava.net/Skynet/archive/2008/10/18/235164.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/Skynet/comments/commentRss/235164.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/Skynet/services/trackbacks/235164.html</trackback:ping><description><![CDATA[参考：<br />
<strong>http://blog.csdn.net/lanphaday/archive/2007/10/28/1852726.aspx<br />
http://www.zhuaxia.com/item/852269537</strong><br />
<br />
<br />
在web抓取，有些网站会判断过度读取会有验证码输入：<br />
<p><img src="http://cocobear.info/blog/wp-content/uploads/2008/08/22.jpeg" alt="pic" /><br />
<img src="http://cocobear.info/blog/wp-content/uploads/2008/08/tmp.jpeg" alt="pic1" /></p>
<br />
<br />
java<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #0000ff;">package</span><span style="color: #000000;">&nbsp;Main;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.awt.image.BufferedImage;<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;java.net.URL;<br />
<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;javax.imageio.ImageIO;<br />
<br />
</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">class</span><span style="color: #000000;">&nbsp;Test&nbsp;{<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">public</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">void</span><span style="color: #000000;">&nbsp;main(String[]&nbsp;args)&nbsp;</span><span style="color: #0000ff;">throws</span><span style="color: #000000;">&nbsp;Exception&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BufferedImage&nbsp;img&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ImageIO.read(</span><span style="color: #0000ff;">new</span><span style="color: #000000;">&nbsp;URL(</span><span style="color: #000000;">"</span><span style="color: #000000;">file:/C:/src/python/gve/22.jpeg</span><span style="color: #000000;">"</span><span style="color: #000000;">));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;imgWith&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;img.getWidth();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;imgHeight&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;img.getHeight();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;bgint&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;img.getRGB(</span><span style="color: #000000;">0</span><span style="color: #000000;">,&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;y&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;imgHeight;&nbsp;y</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.println();<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;(</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">0</span><span style="color: #000000;">;&nbsp;x&nbsp;</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">&nbsp;imgWith;&nbsp;x</span><span style="color: #000000;">++</span><span style="color: #000000;">)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.out.print(getBit(img,&nbsp;x,&nbsp;y,bgint));<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">private</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">static</span><span style="color: #000000;">&nbsp;</span><span style="color: #0000ff;">char</span><span style="color: #000000;">&nbsp;getBit(BufferedImage&nbsp;img,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;x,&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;y,</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;bgint)&nbsp;{<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">int</span><span style="color: #000000;">&nbsp;intCurtColor;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;intCurtColor&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;img.getRGB(x,&nbsp;y);<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">return</span><span style="color: #000000;">&nbsp;(intCurtColor&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;bgint)&nbsp;</span><span style="color: #000000;">?</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">0</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;:&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">'</span><span style="color: #000000;">;<br />
&nbsp;&nbsp;&nbsp;&nbsp;}<br />
}<br />
</span></div>
<br />
&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 000&nbsp;&nbsp;&nbsp;&nbsp; 000 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 00 0 0&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 000&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00 0 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; 0 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp; 0 00 0&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp; 0&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp; 0&nbsp; 0&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 00 0&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0 0&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 00&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0&nbsp; 0 0&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp; 0&nbsp;&nbsp; 0 0&nbsp; 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0 0&nbsp;&nbsp;&nbsp; <br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00 0 0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0000&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />
<br />
<br />
<br />
<br />
<br />
python<br />
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br />
<br />
Code highlighting produced by Actipro CodeHighlighter (freeware)<br />
http://www.CodeHighlighter.com/<br />
<br />
--><span style="color: #008000;">#</span><span style="color: #008000;">encoding=utf-8</span><span style="color: #008000;"><br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;Image,ImageEnhance,ImageFilter<br />
</span><span style="color: #0000ff;">import</span><span style="color: #000000;">&nbsp;sys<br />
<br />
image_name&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #800000;">"</span><span style="color: #800000;">./22.jpeg</span><span style="color: #800000;">"</span><span style="color: #000000;"><br />
<br />
</span><span style="color: #008000;">#去处 干扰点</span><br />
<span style="color: #000000;">im&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;Image.open(image_name)<br />
im&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;im.filter(ImageFilter.MedianFilter())<br />
enhancer&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;ImageEnhance.Contrast(im)<br />
im&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;enhancer.enhance(</span><span style="color: #000000;">2</span><span style="color: #000000;">)<br />
im&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;im.convert(</span><span style="color: #800000;">'</span><span style="color: #800000;">1</span><span style="color: #800000;">'</span><span style="color: #000000;">)<br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">im.show()&nbsp;#测试查看</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
s&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">12</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">启始&nbsp;切割点&nbsp;x</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">t&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">2</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">启始&nbsp;切割点&nbsp;y</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
w&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">10</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">切割&nbsp;宽&nbsp;+y</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">h&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">15</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">切割&nbsp;长&nbsp;+x</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
im_new&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(</span><span style="color: #000000;">4</span><span style="color: #000000;">):&nbsp;</span><span style="color: #008000;">#</span><span style="color: #008000;">验证码切割</span><span style="color: #008000;"><br />
</span><span style="color: #000000;">&nbsp;&nbsp;&nbsp;&nbsp;im1&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;im.crop((s</span><span style="color: #000000;">+</span><span style="color: #000000;">w</span><span style="color: #000000;">*</span><span style="color: #000000;">i</span><span style="color: #000000;">+</span><span style="color: #000000;">i</span><span style="color: #000000;">*</span><span style="color: #000000;">2</span><span style="color: #000000;">,t,s</span><span style="color: #000000;">+</span><span style="color: #000000;">w</span><span style="color: #000000;">*</span><span style="color: #000000;">(i</span><span style="color: #000000;">+</span><span style="color: #000000;">1</span><span style="color: #000000;">)</span><span style="color: #000000;">+</span><span style="color: #000000;">i</span><span style="color: #000000;">*</span><span style="color: #000000;">2</span><span style="color: #000000;">,h))<br />
&nbsp;&nbsp;&nbsp;&nbsp;im_new.append(im1)<br />
<br />
</span><span style="color: #008000;">#</span><span style="color: #008000;">im_new[0].show()#测试查看</span><span style="color: #008000;"><br />
</span><span style="color: #000000;"><br />
xsize,&nbsp;ysize&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;im_new[0].size<br />
gd&nbsp;</span><span style="color: #000000;">=</span><span style="color: #000000;">&nbsp;[]<br />
</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(ysize):<br />
&nbsp;&nbsp;&nbsp;&nbsp;tmp</span><span style="color: #000000;">=</span><span style="color: #000000;">[]<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;j&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(xsize):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">if</span><span style="color: #000000;">(&nbsp;im_new[0].getpixel((j,i))&nbsp;</span><span style="color: #000000;">==</span><span style="color: #000000;">&nbsp;</span><span style="color: #000000;">255</span><span style="color: #000000;">&nbsp;):<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(</span><span style="color: #000000;">1</span><span style="color: #000000;">)<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">else</span><span style="color: #000000;">:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tmp.append(0)<br />
&nbsp;&nbsp;&nbsp;&nbsp;gd.append(tmp)<br />
<br />
</span><span style="color: #008000;">#看效果</span><br />
<span style="color: #0000ff;">for</span><span style="color: #000000;">&nbsp;i&nbsp;</span><span style="color: #0000ff;">in</span><span style="color: #000000;">&nbsp;range(ysize):<br />
&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: #0000ff;">print</span><span style="color: #000000;">&nbsp;gd[i]<br />
</span></div>
<br />
<br />
比如 "0" <br />
[<strong>1, 1,</strong> 0, 0, 0, 0, <strong>1, 1, 1, 1</strong>]<br />
[0, 0, 0, 0, 0, 0, 0, <strong>1, 1, 1</strong>]<br />
[0, 0, 0, <strong>1, 1,</strong> 0, 0, 0, 0, <strong>1</strong>]<br />
[0, 0, <strong>1, 1, 1, 1,</strong> 0, 0, 0, <strong>1</strong>]<br />
[0, 0, <strong>1, 1, 1, 1,</strong> 0, 0, 0, <strong>1</strong>]<br />
[0, 0, <strong>1, 1, 1, 1,</strong> 0, 0, 0, <strong>1</strong>]<br />
[0, 0, <strong>1, 1, 1, 1,</strong> 0, 0, 0, <strong>1</strong>]<br />
[0, 0, <strong>1, 1, 1, 1,</strong> 0, 0, 0, <strong>1</strong>]<br />
[0, 0, <strong>1, 1, 1, 1,</strong> 0, 0, 0, <strong>1</strong>]<br />
[0, 0, 0, <strong>1, 1, 1,</strong> 0, 0, 0, <strong>1</strong>]<br />
[0, 0, 0, <strong>1, 1,</strong> 0, 0, 0, 0, <strong>1</strong>]<br />
[<strong>1</strong>, 0, 0, 0, 0, 0, 0, 0, <strong>1, 1</strong>]<br />
[<strong>1, 1,</strong> 0, 0, 0, 0, 0, <strong>1, 1, 1</strong>]<br />
<br />
<br />
有时间 在学习下 匹配。<br />
<br />
<img src ="http://www.blogjava.net/Skynet/aggbug/235164.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/Skynet/" target="_blank">刘凯毅</a> 2008-10-18 14:53 <a href="http://www.blogjava.net/Skynet/archive/2008/10/18/235164.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>