PIL生成防君子不防大学生的图片验证码,请问文字扭曲的效果怎么实现?
Topic sourceimport math
def twist(img): #图像扭曲填坑
src_img=img.copy() #将原始图像复制一个副本,这是关键。开始的时候忘记将原始像素复制出来一份,下边的代码里在原始像素里覆盖来覆盖去,总是没有满意的效果,我还以为公式写错了。
cycle=2.5 #sin函数2*PI一个周期,这里设置要整几个周期
y_amp=3 #y跟随正弦曲线变化的幅度,4就不少了。在本例中5像素以上数字会碎。
for y in range(0,height):
for x in range(0,char_width):
new_y=y+round(math.sin(x*2*math.pi*cycle/char_width)*y_amp)
#三角函数是高中学的,(x/char_width*2*pi)代表(x/char_width)个周期,这样就把像素坐标(x,y)的变化与正弦曲线扯上了关系.
if new_y < height and new_y > 0:
img.putpixel((x,new_y),src_img.getpixel((x,y)))
return img
我试了下,效果还是有的。 小伙伴们用的时候,自行调整扭曲,旋转 ,粘连,模糊到你满意就可以啦.
- 1
匿名sina网友V
看到评论里有朋友问旋转字符的事情,我查了PIL的文档,摸索出了文字旋转的效果. 我们例程里验证码图片的背景是由杂色构成,然后再用ImageDraw在上方进行draw.text().
我做旋转字符的思路是,首先单独做一个透明的背景层,然后在这个透明的层上写字. 然后再从这个透明的层上切出各个字符,旋转,扭曲(扭曲不会做)一下,最后粘贴到原本的杂色背景层上.
哪位朋友实现了文字扭曲效果的,麻烦指导一下.