- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对制作 3D 验证码很感兴趣,我让它使用一种字体,如下所示:
import string
from matplotlib.font_manager import findSystemFonts
import random
from PIL import ImageFont, Image, ImageDraw
def rand_font(fonts=[], fontpaths=None, fontext='ttf', font_encoding='', min_size=24, max_size=36):
if fonts == []:
fonts = findSystemFonts(fontpaths, fontext)
requested_font = fonts[random.randint(0, len(fonts)-1)]
font_size = random.randint(min_size, max_size)
return ImageFont.truetype(requested_font, font_size, encoding=font_encoding)
def create_captcha(text):
def _rand_color():
colors = ['red', 'orange', 'white', 'purple', 'green', 'yellow']
return colors[random.randint(0, len(colors)-1)]
width = random.randint(400, 700)
height = random.randint(150, 200)
angle = angle if angle else uniform(-20, 20)
font = rand_font()
text_width, text_height = font.getsize(text)
img = Image.new("L", (text_width * 3, text_height * 3), "white")
draw = ImageDraw.Draw(img)
draw.text((text_width, text_height), text, font=font)
fig = pylab.figure(figsize=(width/100.0, height/100.0), dpi=4000)
axes = Axes3D(fig)
X, Y = numpy.meshgrid(range(img.size[0]), range(img.size[1]))
Z = 1 - numpy.asarray(img) / 255
func = Axes3D.plot_surface if random.randint(0,1) == 0 else Axes3D.plot_wireframe
func(axes, X, -Y, Z, rstride=1, cstride=1, color=_rand_color())
axes.set_zlim((-3, 3))
axes.set_xlim((text_width * 1.1, text_width * 1.9))
axes.set_ylim((-text_height * 1.9, -text_height* 1.1))
axes.set_axis_off()
axes.view_init(elev=60, azim=-90)
这很好,它可以让我创造这样的东西:
http://puu.sh/dfxcW/d9fc3f5c4e.jpg和
http://puu.sh/dft1a/1d35f5c99a.png
不过,我想做的是创建一个验证码,为每个字符使用不同的字体和大小,并为每个字符稍微偏移 y
。
因为它是基于 numpy
数组绘制的,所以我尝试像这样遍历文本中的每个字符:
prev_x = 0
x = []
y = []
z = []
for character in text:
X, Y = numpy.meshgrid(range(prev_x, prev_x + img.size[0]), range(img.size[1]))
for v in X.tolist():
x.append(v)
for v in Y.tolist():
y.append(v)
# same for z
prev_x += 40 # trying to offset the characters by an x value so they dont overlap
x = numpy.array(x)
# same for y and z to convert back to numpy array
Axes3D.plot_wireframe(x, -y, z, rstride=1, cstride=1)
这会导致形状不匹配:两个或多个数组在轴 1 上具有不兼容的尺寸。
这让我感到困惑,因为我认为尺寸会完全相同,因为我对每个数组都进行了相同的调用一。我是 numpy 和 3D 的新手,所以如果有人有建议请告诉我!
最佳答案
您如何开始这件事肯定有很多很酷的因素,而且大部分都在那里;这是我为获得随机字体和每个字符可能的颜色而制作的模组。我确实更改了一些尺寸以更好地适合我的屏幕。
from matplotlib.font_manager import findSystemFonts
import random
from PIL import ImageFont, Image, ImageDraw
import numpy
from mpl_toolkits.mplot3d.axes3d import Axes3D
import matplotlib.pyplot as plt
def rand_font(fonts=[], fontpaths=None, fontext='ttf', font_encoding='', min_size=24, max_size=36):
if fonts == []:
fonts = findSystemFonts(fontpaths, fontext)
requested_font = fonts[random.randint(0, len(fonts)-1)]
font_size = random.randint(min_size, max_size)
return ImageFont.truetype(requested_font, font_size, encoding=font_encoding)
def create_captcha(text):
def _rand_color():
colors = ['red', 'orange', 'purple', 'green', 'yellow']
return colors[random.randint(0, len(colors)-1)]
# First font just gets the general offsets
font = rand_font()
text_width, text_height = font.getsize(text)
# Dont draw text here first
img = Image.new("L", (text_width * 3, text_height * 3), "white")
draw = ImageDraw.Draw(img)
fig = plt.figure(figsize=(12, 8))
axes = Axes3D(fig)
# Do this way if you want random fonts AND colors
#=================
prev_x = 0
for character in text:
cfont = rand_font()
char_wid, char_height = cfont.getsize(character)
draw.text((prev_x+text_width, text_height), character, font=cfont)
X, Y = numpy.meshgrid(range(prev_x+text_width, prev_x+text_width+char_wid),
range(text_height, text_height+char_height))
Z = 1 - numpy.asarray(img.crop((prev_x+text_width, text_height,
prev_x+text_width+char_wid,
text_height+char_height))) / 255
axes.plot_wireframe(X, -Y, Z, rstride=1, cstride=1, color=_rand_color())
prev_x += char_wid # trying to offset the characters by an x value so they dont overlap
#=================
# Do this way if you want just random fonts on each letter all one color
#=================
prev_x = 0
for character in text:
cfont = rand_font()
char_wid, char_height = cfont.getsize(character)
draw.text((prev_x+text_width, text_height), character, font=cfont)
prev_x += char_wid # trying to offset the characters by an x value so they dont overlap
X, Y = numpy.meshgrid(range(img.size[0]), range(img.size[1]))
Z = 1 - numpy.asarray(img) / 255
axes.plot_wireframe(X, -Y, Z, rstride=1, cstride=1, color=_rand_color())
#=================
axes.set_zlim((-3, 3))
axes.set_xlim((text_width * 1.1, text_width * 1.9))
axes.set_ylim((-text_height * 1.9, -text_height* 1.1))
axes.set_axis_off()
axes.view_init(elev=60, azim=-90)
plt.show()
create_captcha('TEST')
多字体单色版本看起来像这样:
多字体多颜色版本看起来像这样:
如果你把它变成一个表面并改变视角/高度以避免背景,它可能看起来更好......也许像这样:
至少应该是一个起点!
关于python - 使用不同的字体创建 3D 验证码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27281031/
我有 table 像这样 -------------------------------------------- id size title priority
我的应用在不同的 Activity (4 个 Activity )中仅包含横幅广告。所以我的疑问是, 我可以对所有横幅广告使用一个广告单元 ID 吗? 或者 每个 Activity 使用不同的广告单元
我有任意(但统一)数字列表的任意列表。 (它们是 n 空间中 bin 的边界坐标,我想绘制其角,但这并不重要。)我想生成所有可能组合的列表。所以:[[1,2], [3,4],[5,6]] 产生 [[1
我刚刚在学校开始学习 Java,正在尝试自定义控件和图形。我目前正在研究图案锁,一开始一切都很好,但突然间它绘制不正确。我确实更改了一些代码,但是当我看到错误时,我立即将其更改回来(撤消,ftw),但
在获取 Distinct 的 Count 时,我在使用 Group By With Rollup 时遇到了一个小问题。 问题是 Rollup 摘要只是所有分组中 Distinct 值的总数,而不是所有
这不起作用: select count(distinct colA, colB) from mytable 我知道我可以通过双选来简单地解决这个问题。 select count(*) from (
这个问题在这里已经有了答案: JavaScript regex whitespace characters (5 个回答) 2年前关闭。 你能解释一下为什么我会得到 false比较 text ===
这个问题已经有答案了: 奥 git _a (56 个回答) 已关闭 9 年前。 我被要求用 Javascript 编写一个函数 sortByFoo 来正确响应此测试: // Does not cras
所以,我不得不说,SQL 是迄今为止我作为开发人员最薄弱的一面。也许我想要完成的事情很简单。我有这样的东西(这不是真正的模型,但为了使其易于理解而不浪费太多时间解释它,我想出了一个完全模仿我必须使用的
这个问题在这里已经有了答案: How does the "this" keyword work? (22 个回答) 3年前关闭。 简而言之:为什么在使用 Objects 时,直接调用的函数和通过引用传
这个问题在这里已经有了答案: 关闭 12 年前。 Possible Duplicate: what is the difference between (.) dot operator and (-
我真的不明白这里发生了什么但是: 当我这样做时: colorIndex += len - stopPos; for(int m = 0; m < len - stopPos; m++) { c
思考 MySQL 中的 Group By 函数的最佳方式是什么? 我正在编写一个 MySQL 查询,通过 ODBC 连接在 Excel 的数据透视表中提取数据,以便用户可以轻松访问数据。 例如,我有:
我想要的SQL是这样的: SELECT week_no, type, SELECT count(distinct user_id) FROM group WHERE pts > 0 FROM bas
商店表: +--+-------+--------+ |id|name |date | +--+-------+--------+ |1 |x |Ma
对于 chrome 和 ff,当涉及到可怕的 ie 时,这个脚本工作完美。有问题 function getY(oElement) { var curtop = 0; if (oElem
我现在无法提供代码,因为我目前正在脑海中研究这个想法并在互联网上四处乱逛。 我了解了进程间通信和使用共享内存在进程之间共享数据(特别是结构)。 但是,在对保存在不同 .c 文件中的程序使用 fork(
我想在用户集合中使用不同的功能。在 mongo shell 中,我可以像下面这样使用: db.users.distinct("name"); 其中名称是用于区分的集合字段。 同样我想要,在 C
List nastava_izvjestaj = new List(); var data_context = new DataEvidencijaDataContext();
我的 Rails 应用程序中有 Ransack 搜索和 Foundation,本地 css 渲染正常,而生产中的同一个应用程序有一个怪癖: 应用程序中的其他内容完全相同。 我在 Chrome 和 Sa
我是一名优秀的程序员,十分优秀!