完成图片的添加水印功能

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>图片转BASE64</title>
    <style>
        body {
            max-width: 800px;
            margin: 20px auto;
            padding: 0 20px;
            font-family: Arial, sans-serif;
        }
        .container {
            border: 2px dashed #ccc;
            padding: 20px;
            text-align: center;
            margin-bottom: 20px;
        }
        #result {
            word-break: break-all;
            background: #f5f5f5;
            padding: 10px;
            margin-top: 20px;
            border: 1px solid #ddd;
        }
        .btn {
            background: #4CAF50;
            color: white;
            padding: 10px 20px;
            border: none;
            border-radius: 4px;
            cursor: pointer;
        }
        .btn:hover {
            background: #45a049;
        }
    </style>
</head>
<body>
    <div class="container">
        <h2>图片转BASE64工具</h2>
        <input type="file" id="fileInput" accept="image/*">
        <!-- 新增水印设置 -->
        <div style="margin: 10px 0;">
            <input type="text" id="watermarkText" placeholder="自定义水印文字(默认显示时间)" style="padding: 5px;">
            <input type="color" id="watermarkColor" value="#ff0000">
            <select id="watermarkPosition">
                <option value="topRight">右上角</option>
                <option value="center">居中</option>
                <option value="bottomRight">右下角</option>
                <option value="bottomLeft">左下角</option>
            </select>
        </div>
        <button class="btn" onclick="copyToClipboard()">复制BASE64</button>
        <div id="result"></div>
        
        <!-- 新增:BASE64转图片功能 -->
        <h2>BASE64转图片</h2>
        <textarea id="base64Input" placeholder="请粘贴BASE64字符串" style="width: 100%; height: 100px; margin: 10px 0;"></textarea>
        <button class="btn" onclick="showImage()">预览图片</button>
        <div id="imagePreview" style="margin-top: 20px;">
            <img id="previewImg" style="max-width: 100%; display: none;">
        </div>
    </div>

    <script>
        const fileInput = document.getElementById('fileInput');
        const result = document.getElementById('result');

        fileInput.addEventListener('change', function(e) {
            const file = e.target.files[0];
            if (file) {
                const reader = new FileReader();
                reader.onload = function(e) {
                    const img = new Image();
                    img.onload = function() {
                        // 创建 canvas
                        const canvas = document.createElement('canvas');
                        canvas.width = img.width;
                        canvas.height = img.height;
                        const ctx = canvas.getContext('2d');

                        // 绘制原图
                        ctx.drawImage(img, 0, 0);

                        // 获取当前时间
                        const now = new Date();
                        const timeString = now.toLocaleString('zh-CN');
                        
                        // 设置水印文字
                        const watermarkText = document.getElementById('watermarkText').value || timeString;
                        const watermarkColor = document.getElementById('watermarkColor').value;
                        const position = document.getElementById('watermarkPosition').value;

                        ctx.font = '24px Arial';
                        ctx.fillStyle = watermarkColor;
                        ctx.globalAlpha = 0.5;

                        // 计算水印位置
                        let x, y;
                        const textWidth = ctx.measureText(watermarkText).width;
                        switch(position) {
                            case 'topRight':
                                x = canvas.width - textWidth - 20;
                                y = 40; // 距离顶部的距离
                                break;
                            case 'center':
                                x = (canvas.width - textWidth) / 2;
                                y = canvas.height / 2;
                                break;
                            case 'bottomRight':
                                x = canvas.width - textWidth - 20;
                                y = canvas.height - 20;
                                break;
                            case 'bottomLeft':
                                x = 20;
                                y = canvas.height - 20;
                                break;
                        }

                        // 绘制水印
                        ctx.fillText(watermarkText, x, y);

                        // 转换为 base64
                        result.textContent = canvas.toDataURL(file.type);
                    };
                    img.src = e.target.result;
                };
                reader.readAsDataURL(file);
            }
        });

        function copyToClipboard() {
            if (result.textContent) {
                navigator.clipboard.writeText(result.textContent)
                    .then(() => alert('BASE64已复制到剪贴板!'))
                    .catch(err => console.error('复制失败:', err));
            }
        }

        // 新增:BASE64转图片功能
        function showImage() {
            const base64Input = document.getElementById('base64Input');
            const previewImg = document.getElementById('previewImg');
            const base64String = base64Input.value.trim();

            if (!base64String) {
                alert('请输入BASE64字符串!');
                return;
            }

            try {
                // 如果输入的是完整的Data URL,直接使用
                // 如果只是BASE64字符串,则添加前缀
                const imgSrc = base64String.startsWith('data:image') 
                    ? base64String 
                    : 'data:image/png;base64,' + base64String;

                previewImg.src = imgSrc;
                previewImg.style.display = 'block';
                
                // 处理加载错误
                previewImg.onerror = function() {
                    alert('无效的BASE64图片数据!');
                    previewImg.style.display = 'none';
                };
            } catch (error) {
                alert('转换失败:' + error.message);
            }
        }
    </script>
</body>
</html>
posted @ 2025-04-22 23:00  QixunQiu  阅读(18)  评论(0)    收藏  举报