Python:PIL库处理网络图片利用StringIO避免中途写入文件到硬盘
这是在我学习用Python识别验证码时发现的提高效率的方法。
识别验证码的一般步骤为:获取网络图片->写入文件到硬盘->使用PIL
读取硬盘里的文件->PIL
对文件进行预处理->进行文本识别。
这里“获取网络图片->写入文件到硬盘->使用PIL读取硬盘里的文件”实际是出于无奈,因为PIL
的Image.open()
函数只接受文件名,不接受图片文件本身。而Image.fromstring()
只接受像素格式的字符串,也不接受图片文件。
所以只能采用将图片文件写入到硬盘,然后使用Image.open()
读取,有需要再采用Image.load()
读取为像素格式。
即:
from PIL import Image
import urllib
url = 'http://202.119.81.113:8080/verifycode.servlet' # 验证码URL
r = urllib.urlopen(url)
f = open('VCode.jpg', 'wb') #这里是将验证码图片写入到本地文件
f.write(r.read())
f.close()
img = Image.open('VCode.jpg') # PIL库加载图片
实际上可以利用StringIO
库(Python:StringIO模块),将网络图片写入到内存(实际网络图片这是也已经在内存),然后“伪装”成普通文件传给Image.open()
:
from PIL import Image
import urllib
import StringIO
url = 'http://202.119.81.113:8080/verifycode.servlet' # 验证码URL
r = urllib.urlopen(url)
imgBuf = StringIO.StringIO(r.read()) # 采用StringIO直接将验证码文件写到内存,省去写入硬盘
img = Image.open(imgBuf) # PIL库加载图片
这样就避免了硬盘写和硬盘读,如果对读写内存文件有更高要求,可以考虑cStringIO(Python:cStringIO模块)。
Python:PIL库处理网络图片利用StringIO避免中途写入文件到硬盘 - Penguin
[url=http://www.gu94103ej9070th7fdom3a033ork9q9ws.org/]uwkwtwjnbw[/url]
wkwtwjnbw http://www.gu94103ej9070th7fdom3a033ork9q9ws.org/
awkwtwjnbw
Python:PIL库处理网络图片利用StringIO避免中途写入文件到硬盘 - Penguin
[url=http://www.gd0949k9721x0umaeujy79rgx0g6n111s.org/]uokvhpwp[/url]
okvhpwp http://www.gd0949k9721x0umaeujy79rgx0g6n111s.org/
aokvhpwp
Python:PIL库处理网络图片利用StringIO避免中途写入文件到硬盘 - Penguin
[url=http://www.gys78gc22k5qql18721zyk71415f7mcgs.org/]ughjnsjpdt[/url]
aghjnsjpdt
ghjnsjpdt http://www.gys78gc22k5qql18721zyk71415f7mcgs.org/
Python:PIL库处理网络图片利用StringIO避免中途写入文件到硬盘 - Penguin
aqjqsqbrtip
qjqsqbrtip http://www.g5rf79o1l7rx4wcs2003h910w8xz1me8s.org/
[url=http://www.g5rf79o1l7rx4wcs2003h910w8xz1me8s.org/]uqjqsqbrtip[/url]