Home >Web Front-end >JS Tutorial >js and canvas implement sliding puzzle verification code function

js and canvas implement sliding puzzle verification code function

小云云
小云云Original
2018-03-28 09:33:512876browse

This article mainly shares with you js and canvas to implement the sliding puzzle verification code function. Nowadays, sliding puzzle verification is often encountered. I hope it can help everyone.

The picture above shows the sliding puzzle verification code of NetEase Cloud Shield. It should have a special picture library, and the cropping position is fixed. My idea is to randomly generate pictures, randomly generate positions, and then use canvas to cut out the sliders and background images. The specific steps are described below.

First find a random picture and render it on the canvas. Here #canvas is used as the canvas and #block is used as the cropped small slider.


<canvas width="310" height="155" id="canvas"></canvas>
<canvas width="310" height="155" id="block"></canvas>
var canvas = document.getElementById(&#39;canvas&#39;)
 var block = document.getElementById(&#39;block&#39;)
 var canvas_ctx = canvas.getContext(&#39;2d&#39;)
 var block_ctx = block.getContext(&#39;2d&#39;)
 var img = document.createElement(&#39;img&#39;)
 img.onload = function() {
  canvas_ctx.drawImage(img, 0, 0, 310, 155)
  block_ctx.drawImage(img, 0, 0, 310, 155)
 };
 img.src = &#39;img.jpg&#39;

Let’s consider how to cut out the shape of the puzzle. The shape of the puzzle is more complicated. First, we draw a square, and then write the above code :


var x = 150, y = 40, w = 42, r = 10, PI = Math.PI 
 function draw(ctx) {
  ctx.beginPath()
  ctx.moveTo(x, y)
  ctx.lineTo(x + w, y)
  ctx.lineTo(x + w, y + w)
  ctx.lineTo(x, y + w)
  ctx.clip()
 }
 draw(canvas_ctx)
 draw(block_ctx)

The radius of the notched circle. We first encapsulate the drawing process with a function to facilitate the simultaneous operation of the background and slider later. Use the clip() method to crop the image to generate a square.

Next draw the circle on the top and right side of the square:


function draw(ctx) {
  ctx.beginPath()
  ctx.moveTo(x,y)
+  ctx.lineTo(x+w/2,y)
+  ctx.arc(x+w/2,y-r+2, r,0,2*PI) //
+  ctx.lineTo(x+w/2,y)
  ctx.lineTo(x+w,y)
+  ctx.lineTo(x+w,y+w/2)
+  ctx.arc(x+w+r-2,y+w/2,r,0,2*PI) //
+  ctx.lineTo(x+w,y+w/2)
  ctx.lineTo(x+w,y+w)
  ctx.lineTo(x,y+w)
  ctx.lineTo(x,y)
  ctx.clip()
 }

The position of the two annotations shifts the center of the circle 2px inward to achieve the gap style. Then there is the hollow part on the left. Since the clip is the part within the clipping path, it is not possible to draw a circle directly like above. We open a new path, and then draw a circle to "cover" a gap in the square, which will be used here. globalCompositeOperation attribute, 'xor' as the name suggests. The code continues from above:


function draw(ctx) {
  ctx.beginPath()
  ...
  ctx.lineTo(x,y)
  ctx.clip()
+  ctx.beginPath()
+  ctx.arc(x,y+w/2, r,1.5*PI,0.5*PI) // 只需要画正方形内的半圆就行,方便背景图片的裁剪
+  ctx.globalCompositeOperation = "xor"
+  ctx.fill()
}

Now that we have a basic puzzle shape, we adjust the size of #block and crop it Put the slider into #block:


img.onload = function() {
  ctx.drawImage(img, 0, 0, 310, 155)
  block_ctx.drawImage(img, 0, 0, 310, 155)
+  var blockWidth = w + r * 2
+  var _y = y - r * 2 + 2 // 滑块实际的y坐标
+  var ImageData = block_ctx.getImageData(x, _y, blockWidth, blockWidth)
+  block.width = blockWidth
+  block_ctx.putImageData(ImageData, 0, _y)
 }

Now we need to display the original picture on the left canvas and cut out the middle slider For the part, the process of drawing the path is the same here. The only difference is that clip() is changed to fill() to achieve the effect. We have encapsulated the process of drawing the path into a function before, and it can be changed slightly:


- function draw(ctx) {
+ function draw(ctx, operation) {
  ...
- ctx.clip()
+ ctx.fillStyle = &#39;#fff&#39;
+ ctx[operation]()
  ...
}
+ draw(canvas_ctx, &#39;fill&#39;)
+ draw(block_ctx, &#39;clip&#39;)

The next step is to write the style, skip it:

Then we write the drag event. We can record the mouse position when the mouse is pressed, and then set the left value for the slider when dragging. Finally, when you release the mouse, determine the left value of the slider at this time and the x value when the slider was first cropped. If it is within a certain range, the verification is passed, otherwise the verification fails.

Finally add random pictures and random cutting positions, and it’s basically ok. In addition, you can judge the change of the y-axis when the mouse moves to determine whether it is operated by a "human". Of course, web security is such a mess, so I won't go into details and just make a simple judgment.

Because there is no border or shadow added to the edge of the slice, the slider of some pictures is not highly identifiable and needs to be improved later (actually I haven't messed with it yet - -), I hope Someone who understands this can help me improve it //

Related recommendations:

How to create a simple verification code in php

PHP implementation code for verification code

PHP implementation Clicking on the verification code or seeing it clearly will refresh the verification code

The above is the detailed content of js and canvas implement sliding puzzle verification code function. For more information, please follow other related articles on the PHP Chinese website!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn