网络图片获取与展示

识别验证码的一般步骤为: 获取网络图片-> 写入文件到硬盘->使用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模块)。

from PIL import Image

import urllib
import cStringIO
url = 'http://202.119.81.113:8080/verifycode.servlet'  # 验证码URL
r = urllib.urlopen(url)
imgBuf = cStringIO.cStringIO(r.read())  # 采用StringIO直接将验证码文件写到内存,省去写入硬盘
img = Image.open(imgBuf)  # PIL库加载图片

摘抄自:https://www.polarxiong.com/archives/python-pil-stringio.html

打赏一个呗

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码支持
扫码打赏,你说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦