网页设计Internet Explorer 9DOM工具Chrome互联网模式浏览器控件通用图像处理通用编程Web 开发HTML5设计/图形所有主题架构师HTML中级开发JavascriptWindows
易于使用的反机器人






4.43/5 (4投票s)
使用 HTML5 旋转功能进行反机器人控制
引言
这只是一个提示,对于那些厌倦了与“字符串式” Anti-Bots 斗争,并且不希望他们的网页用户体验到相同感受的人。
背景
使用一种滑块控件来旋转图像(为了证明你是人类)的想法并不新鲜。 我在 2008 年从我的一个学生那里得到的,他是在网上某个地方找到的。
但是该实现基于 jQuery 或其他一些 JavaScript 库。 嗯,学习 jQuery 需要付出一些努力。 我不喜欢从黑盒子中提取的奇迹,所以我停止了考虑这个技巧。
现在,HTML5 为我们提供了新的可能性,我想我应该以控件的形式来实现这个想法。 稍后,我计划制作一个真正的 ASP.NET 自定义控件,其中嵌入 JavaScript。 到目前为止,代码是纯 HTML 和 JavaScript,但它可以完成工作。
Using the Code
解决方案中最困难的部分是
- 如何缩放任意图像并将其放置在画布的所需位置
- 如何以所需的角度旋转图像
- 如何跟踪这个角度值,并将其用作测试结果
以下片段解决了部分问题
hdc.clearRect(0, 0, canvasWidth, canvasHeight);
hdc.save();
hdc.translate(cx, cy);
hdc.rotate(-angle);
hdc.translate(-cx, -cy);
hdc.drawImage(img, posX, posY, img.width, img.height);
hdc.restore();
hdc
变量是canvas
元素的设备上下文。 它是在全局范围内声明的,并在onload
事件处理程序中创建,这是 HTML5 教程中推荐的。
var canvasImg = document.getElementById("canvasImg");
hdc = canvasImg.getContext("2d");
上下文操作的重要细节是
- 保存上下文的当前状态
- 在画布内的所需位置 (
cx
,cy
) 转换(移动)上下文。 - 旋转很简单,但角度的符号应该是负数(如果你希望旋转方向与 Math 逆时针正方向规则一致)
- 将上下文转换回 (
-cx
,-cy
) - 在位置 (
posX
,posY
) 绘制图像,必须事先正确计算 - 将上下文恢复到其初始状态
图像缩放和位置计算只进行一次(图像加载完成后)。 图像的左上角应该相对于画布的中心偏移。 此偏移的值必须是图像大小的一半。
posX = cx - img.width / 2;
posY = cy - img.height / 2;
以下函数显示了缩放和定位计算的所有细节。 此函数被调用以响应图像onload
事件 (img.onload = Scale;
)。
function Scale()
{
canvasWidth = canvasImg.width;
canvasHeight = canvasImg.height;
var
dx = img.width - canvasWidth,
dy = img.height - canvasHeight;
if (dx >= 0 || dy >= 0)
{
var d = 0.75 * (dx > dy ? canvasWidth / img.width : canvasHeight / img.height);
img.width *= d;
img.height *= d;
}
cx = canvasWidth / 2;
cy = canvasHeight / 2;
posX = cx - img.width / 2;
posY = cy - img.height / 2;
factor = 2 * Math.abs(startAngle) / slider.offsetWidth;
Draw();
}
关注点
我不知道 HTML5 有一个具有滑块功能的控件,所以这里创建了一个手工制作的滑块。 如果你发现整个控件有用,那么也许值得用标准控件替换滑块。