You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:将验证码Base64字符串转换为图片并在浏览器显示

Fixing Your Custom JavaScript Captcha: Base64 to Image Display

Hey there! I get that you're building this captcha for learning purposes instead of using reCaptcha—great call, hands-on practice is the best way to learn. Let's break down why your current code isn't displaying the captcha as an image, and fix it step by step.

What's Wrong With Your Current Approach?

Right now, you're converting the captcha text (like "AbC") directly to Base64 using btoa(). But that's just encoding the text string into Base64, not creating an image. A valid image Base64 URL needs to follow the format data:image/png;base64, [encoded image data]—your code isn't generating that, which is why you can't display it as an image.

Also, your loop to generate the captcha has a small redundancy: you're looping 6 times but reassigning a, b, c each time, so you only end up with the last set of three letters. We'll clean that up too.

The Correct Solution: Use Canvas to Generate an Image

To create a captcha image, we'll use HTML5 Canvas to draw the text (plus some noise for security), then convert that Canvas to a valid Base64 image URL. Here's how to do it:

Step 1: Update Your HTML

First, replace your existing element with id captCha with an <img> tag—this is where we'll display the captcha image:

<img id="captCha" alt="Verification Code" style="border: 1px solid #ddd; padding: 8px; border-radius: 4px;">
<!-- Optional: Add a refresh button -->
<button onclick="generateCaptcha()">Refresh Captcha</button>

Step 2: Rewrite the JavaScript Code

This code will generate the captcha text, draw it on a Canvas with some anti-bot noise, then convert it to a Base64 image URL for display:

let code2 = ''; // Store the raw captcha text for validation later

// Generate captcha on page load and when refresh button is clicked
function generateCaptcha() {
    const alpha = ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z'];
    let captchaText = '';
    
    // Generate 3 random letters
    for (let i = 0; i < 3; i++) {
        captchaText += alpha[Math.floor(Math.random() * alpha.length)];
    }
    code2 = captchaText; // Save the clean text for validation
    
    // Create and configure Canvas
    const canvas = document.createElement('canvas');
    canvas.width = 120;
    canvas.height = 45;
    const ctx = canvas.getContext('2d');
    
    // Draw background (optional but improves readability)
    ctx.fillStyle = '#f5f5f5';
    ctx.fillRect(0, 0, canvas.width, canvas.height);
    
    // Draw random interference lines (to prevent bot OCR)
    for (let i = 0; i < 4; i++) {
        ctx.beginPath();
        ctx.moveTo(Math.random() * canvas.width, Math.random() * canvas.height);
        ctx.lineTo(Math.random() * canvas.width, Math.random() * canvas.height);
        ctx.strokeStyle = `rgba(${Math.floor(Math.random()*200)}, ${Math.floor(Math.random()*200)}, ${Math.floor(Math.random()*200)}, 0.6)`;
        ctx.lineWidth = 1;
        ctx.stroke();
    }
    
    // Draw random dots
    for (let i = 0; i < 25; i++) {
        ctx.beginPath();
        ctx.arc(Math.random() * canvas.width, Math.random() * canvas.height, 1, 0, Math.PI * 2);
        ctx.fillStyle = `rgba(${Math.floor(Math.random()*150)}, ${Math.floor(Math.random()*150)}, ${Math.floor(Math.random()*150)}, 0.7)`;
        ctx.fill();
    }
    
    // Draw captcha text with slight random positioning (more human-like)
    ctx.font = 'bold 26px Arial';
    ctx.fillStyle = '#2d3748';
    for (let i = 0; i < captchaText.length; i++) {
        // Shift each letter slightly up/down to avoid straight alignment
        ctx.fillText(captchaText[i], 20 + i*32, 28 + Math.random()*10 - 5);
    }
    
    // Convert Canvas to Base64 image URL
    const imageBase64 = canvas.toDataURL('image/png');
    
    // Update the img tag with the new captcha
    document.getElementById('captCha').src = imageBase64;
}

// Run captcha generation when the page loads
document.addEventListener('DOMContentLoaded', generateCaptcha);

How This Works

  1. Canvas Drawing: We use Canvas to draw the captcha text along with noise (lines and dots) to make it harder for bots to read.
  2. Base64 Image URL: The canvas.toDataURL() method generates a valid Base64 string in the format data:image/png;base64, ..., which browsers can directly use as the src for an <img> tag.
  3. Validation Ready: We store the raw captcha text in code2, so you can later compare it with user input to verify the captcha.

Extra Tip

If you want to add validation, you can create an input field and a submit button, then check if the user's input matches code2 (case-insensitive or sensitive, depending on your needs).

内容的提问来源于stack exchange,提问作者Megha Verma

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:26:24