我想编写一个 Python 脚本来生成像这样
的 3D CAPTCHA :
我可以使用哪些图形库?
资料来源:ocr-research.org.ua
有很多方法。我会亲自使用ImageDraw的 draw.text 在 Python Imaging Library 中创建图像,转换为NumPy数组(使用 NumPy 的asarray),然后使用Matplotlib进行渲染。(需要 Matplotlib维护包)。
完整代码(在 2.5 中):
import numpy, pylab
from PIL import Image, ImageDraw, ImageFont
import matplotlib.axes3d as axes3d
sz = (50,30)
img = Image.new('L', sz, 255)
drw = ImageDraw.Draw(img)
font = ImageFont.truetype("arial.ttf", 20)
drw.text((5,3), 'text', font=font)
img.save('c:/test.png')
X , Y = numpy.meshgrid(range(sz[0]),range(sz[1]))
Z = 1-numpy.asarray(img)/255
fig = pylab.figure()
ax = axes3d.Axes3D(fig)
ax.plot_wireframe(X, -Y, Z, rstride=1, cstride=1)
ax.set_zlim((0,50))
fig.savefig('c:/test2.png')
显然还有一些工作要做,消除轴,改变视角等等。
我不确定我是否会为您上面所拥有的完整的 3D 库而烦恼。只需生成一个 3D 点矩阵,用 PIL 之类的东西生成文本,扫描它以找出网格上的哪些点被抬起,选择一个随机的摄像机角度,然后将这些点投影到 2D 图像中,然后用 PIL 将它们绘制到最终图像。
话虽这么说……如果您不想自己进行 3D 数学运算,则可以使用VPython 。
为 OpenGL 使用 Python 绑定,http ://pyopengl.sourceforge.net/ 。
使用PIL在黑色表面上创建白色文本的 2D 图像。从中制作一个 3D 网格,增加颜色为白色的点的 z,也许设置 z=color 值,因此通过模糊图像,您可以获得 z 方向的真实曲线。
从这些点创建一个 OpenGL 三角形,在渲染时使用线框模式。
将 OpenGL 缓冲区抓取到图像中,例如 http://python-opengl-examples.blogspot.com/2009/04/render-to-texture.html。