html案例:编写一个用于发布CSDN文章时,生成有关缩略图

CSDN博客文章缩略图生成器

起因:

  • 之前注意到CSDN可以随机选取文章缩略图,但后来这个功能似乎取消了。于是我想调整一下缩略图的配色方案。

html制作界面
界面分上下两块区域,上面是参数配置,下面是效果预览图。

  • 参数配置:

    • 文本内容自定义:输入关键词生成图片中间的文本内容(建议简短);
    • 背景色调整:提供预设颜色选项和通过颜色选择器选择颜色;
    • 图片尺寸:默认宽480像素,高270像素
  • 功能说明:

    • 由选择颜色或随机生成颜色生成图片,如果不满意还可以预设颜色,之后可以把图片保存下来,通过重置参数就可以达到随机生成的效果;
      在这里插入图片描述

生成效果

  • 生成的效果图
    在这里插入图片描述

代码部分

<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="UTF-8"><title>CSDN博客文章缩略图生成器</title><style>body {font-family: Arial, sans-serif;display: flex;justify-content: center;align-items: center;height: 100vh;margin: 0;background-color: #f0f0f0;}.container {text-align: center;background: white;padding: 20px;border-radius: 10px;box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);user-select: none;-webkit-user-select: none;-moz-user-select: none;-ms-user-select: none;}.form-group {margin-bottom: 10px;}.form-group label {display: inline-block;width: 100px;text-align: right;margin-right: 10px;}.form-group input[type="text"],.form-group input[type="number"]{padding: 5px;width: 200px;margin-left: 10px;}.form-group input[type="color"] {padding: 0;width: 210px;margin-left: 12px;border: none;cursor: pointer;}.form-group select {padding: 5px;width: 213px;margin-left: 10px;border-radius: 4px;border: 1px solid #ccc;}.form-group select:disabled {background-color: #eee;cursor: not-allowed;}.form-group select:hover {border-color: #888;}.controls {display: flex;justify-content: center;margin-top: 20px;align-items: center;flex-wrap: nowrap;margin-top: 20px;gap: 20px;}.controls button {margin-top: 10px;padding: 8px 16px;cursor: pointer;}#preview {margin-top: 20px;border-radius: 10px;overflow: hidden;}canvas {width: 100%;height: auto;margin-top: 20px;border-radius: 10px;}</style>
</head>
<body>
<div class="container"><h2>CSDN博客文章缩略图生成器</h2><!-- 配置选项 --><div class="form-group"><label for="text">文本内容:</label><input type="text" id="text" placeholder="请输入文本内容" value="#示例文本"/></div><div class="form-group"><label for="presetColors">颜色预设:</label><select id="presetColors" onchange="applyPresetColor()"><option value="" selected>请选择</option><option value="#FE5F20">Java专栏色</option><option value="#5E61CB">学车专栏色</option><option value="#3A80A8">数据库专栏色</option><option value="#34B3BC">其他专栏色</option><option value="#90839B">(其他)Linux文章色</option><option value="#34B3BC">(其他)软件文章色</option></select></div><div class="form-group"><label for="bgColor">背景颜色:</label><input type="color" id="bgColor" value="#ffffff"></div><div class="form-group"><label for="width">宽度:</label><input type="number" id="width" value="480"/></div><div class="form-group"><label for="height">高度:</label><input type="number" id="height" value="270"/></div><div class="controls"><button onclick="generateImage()">生成图片</button><button onclick="downloadImage()">保存图片</button><button onclick="resetColor()">重置参数</button></div><!-- 预览区域 --><div id="preview"><canvas id="myCanvas"></canvas></div>
</div><script>const canvas = document.getElementById("myCanvas");const ctx = canvas.getContext("2d");// 颜色值校验function isValidHexColor(color) {const regex = /^#([0-9A-Fa-f]{6})$/;return regex.test(color);}// 颜色随机function getRandomColor() {return '#' + Math.floor(Math.random()*16777215).toString(16);}// 重置颜色参数function resetColor() {document.getElementById("presetColors").value = ""; // 清空下拉框选择document.getElementById("bgColor").value = "#ffffff"; // 重置颜色选择器为默认白色userSelectedColor = false; // 允许 generateImage 使用随机色generateImage(); // 重新生成图片}// 生成渐变色function generateGradient(startColor, endColor, width, height) {let gradient = ctx.createLinearGradient(0, 0, width, height);//gradient.addColorStop(0, startColor);gradient.addColorStop(0.5, adjustBrightness(startColor, -0.1));gradient.addColorStop(1, endColor);return gradient;}// 图形生成let userSelectedColor = false;function generateImage() {const text = document.getElementById("text").value || "#示例文本内容";const bgColorInput = document.getElementById("bgColor").value;const width = parseInt(document.getElementById("width").value) || 480;const height = parseInt(document.getElementById("height").value) || 270;// 设置画布尺寸canvas.width = width;canvas.height = height;// 清除画布ctx.clearRect(0, 0, canvas.width, canvas.height);// 判断是否用户选择了颜色let bgColor;if (userSelectedColor || bgColorInput !== "#ffffff") {bgColor = isValidHexColor(bgColorInput) ? bgColorInput : getRandomColor();} else {bgColor = getRandomColor();}// 创建渐变背景ctx.fillStyle = generateGradient(bgColor, adjustBrightness(bgColor, -0.2), width, height);ctx.fillRect(0, 0, width, height);// 绘制多个斜坡形状ctx.beginPath();ctx.moveTo(1, height); // A点,左下角ctx.lineTo(width * 0.9, height); // B点,右下角ctx.lineTo(0, height * 0.196); // C点,右上角ctx.closePath();ctx.fillStyle = 'rgba(255, 255, 255, 0.1)';ctx.fill();ctx.beginPath();ctx.moveTo(1, height); // A点,左下角ctx.lineTo(width * 0.45, height); // B点,右下角ctx.lineTo(0, -230); // C点,左上角ctx.closePath();ctx.fillStyle = 'rgba(255, 255, 255, 0.1)';ctx.fill();// 绘制多个半球形状ctx.beginPath();ctx.arc(width * 0.95, height * 0.1, Math.min(width, height) * 0.2, 0, Math.PI * 2, false);ctx.closePath();ctx.fillStyle = 'rgba(255, 255, 255, 0.1)';ctx.fill();ctx.beginPath();ctx.arc(width * 0.1, height * 0.75, Math.min(width, height) * 0.2, 0, Math.PI * 2, false);ctx.closePath();ctx.fillStyle = 'rgba(255, 255, 255, 0.1)';ctx.fill();// 设置字体样式//ctx.font = `bold ${Math.min(width / text.length, 60)}px Arial`; // 根据画布宽度调整字体大小ctx.font = "bold 60px Arial"ctx.textAlign = "center";ctx.fillStyle = "#ffffff";// 计算文字位置以确保居中显示const metrics = ctx.measureText(text);const x = canvas.width / 2;const y = (canvas.height / 2) + (metrics.actualBoundingBoxAscent / 2);// 绘制文本ctx.fillText(text, x, y);}// 调整图片亮度function adjustBrightness(hex, correctionFactor) {if (!/^#([0-9A-Fa-f]{6})$/.test(hex)) {console.warn("Invalid color format:", hex);return "#000000"; // fallback}hex = hex.replace(/^#/, '');let r = parseInt(hex.substr(0, 2), 16),g = parseInt(hex.substr(2, 2), 16),b = parseInt(hex.substr(4, 2), 16);// 调整亮度,使用线性方式更直观r = Math.max(0, Math.min(255, Math.round(r + 255 * correctionFactor)));g = Math.max(0, Math.min(255, Math.round(g + 255 * correctionFactor)));b = Math.max(0, Math.min(255, Math.round(b + 255 * correctionFactor)));// 确保返回为 6 位颜色const toHex = (c) => c.toString(16).padStart(2, '0');return "#" + toHex(r) + toHex(g) + toHex(b);}// 下载图片function downloadImage() {const link = document.createElement('a');link.download = 'generated-image.png';link.href = canvas.toDataURL('image/png');link.click();}// 预设颜色应用function applyPresetColor() {const colorPicker = document.getElementById('bgColor');if (colorPicker) { // 检查是否成功获取到元素const presetColor = document.getElementById('presetColors').value;colorPicker.value = presetColor;generateImage(); // 更新图片预览} else {console.error("未能找到ID为'bgColor'的元素");}}// 添加事件监听器来检测颜色选择document.getElementById('bgColor').addEventListener('input', () => {userSelectedColor = true;generateImage(); });// 页面加载时默认生成一张图片window.onload = () => generateImage();
</script>
</body>
</html>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/88876.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/88876.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

lightgbm算法学习

主要组件 Boosting #mermaid-svg-1fiqPsJfErv6AV82 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-1fiqPsJfErv6AV82 .error-icon{fill:#552222;}#mermaid-svg-1fiqPsJfErv6AV82 .error-text{fill:#552222;stroke:#…

安卓基于 FirebaseAuth 实现 google 登录

安卓基于 FirebaseAuth 实现 google 登录 文章目录安卓基于 FirebaseAuth 实现 google 登录1. 前期准备1.1 创建 Firebase 项目1.2 将 Android 应用连接到 Firebase1.3 在 Firebase 控制台中启用 Google 登录2. 在 Android 应用中实现 Google 登录2.1 初始化 GoogleSignInClien…

李宏毅(Deep Learning)--(三)

一.前向传播与反向传播的理解&#xff1a;二.模型训练遇到的问题在模型训练中&#xff0c;我们可能会遇到效果不好的情况&#xff0c;那么我们应该怎么思考切入&#xff0c;找到问题所在呢&#xff1f;流程图如下&#xff1a;第一个就是去看训练的损失函数值情况。如果损失较大…

android studio 运行,偶然会导致死机,设置Memory Settings尝试解决

1、android studio导致死机 鼠标不能动&#xff0c;键盘没有反应&#xff0c;只能硬重启&#xff0c;但是内存并没有用完&#xff0c;cpu也不是100% 2、可能的原因 android studio内存设置的问题&#xff0c;为了限制占用内存&#xff0c;所以手工设置内存最小的一个&#x…

HTB 赛季8靶场 - Outbound

Rustscan扫描我们开局便拥有账号 tyler / LhKL1o9Nm3X2&#xff0c;我们使用rustscan进行扫描 rustscan -a 10.10.11.77 --range 1-65535 --scan-order "Random" -- -A Web服务漏洞探查 我们以账号tyler / LhKL1o9Nm3X2登录webmail&#xff0c;并快速确认版本信息。该…

动态组件和插槽

[Vue2]动态组件和插槽 动态组件和插槽来实现外部传入自定义渲染 组件 <template><!-- 回复的处理进度 --><div v-if"steps.length > 0" class"gain-box-header"><el-steps direction"vertical"><div class"l…

Unreal5从入门到精通之如何实现UDP Socket通讯

文章目录 一.前言二.什么是FSocket1. FSocket的作用2. FSocket关键特性三.创建Socket四.数据传输五.线程安全六.UDPSocketComponentUDPSocketComponent.hUUDPSocketComponent.cpp七.SocketTest测试八.最后一.前言 我们在开发UE 的过程中,会经常使用到Socket通讯,包括TCP,UD…

UI前端大数据处理新趋势:基于边缘计算的数据处理与响应

hello宝子们...我们是艾斯视觉擅长ui设计、前端开发、数字孪生、大数据、三维建模、三维动画10年经验!希望我的分享能帮助到您!如需帮助可以评论关注私信我们一起探讨!致敬感谢感恩!一、引言&#xff1a;前端大数据的 “云端困境” 与边缘计算的破局当用户在在线文档中实时协作…

Reading and Writing to a State Variable

本节是《Solidity by Example》的中文翻译与深入讲解&#xff0c;专为零基础或刚接触区块链开发的小白朋友打造。我们将通过“示例 解说 提示”的方式&#xff0c;带你逐步理解每一段 Solidity 代码的实际用途与背后的逻辑。Solidity 是以太坊等智能合约平台使用的主要编程语…

c# 深度解析:实现一个通用配置管理功能,打造高并发、可扩展的配置管理神器

文章目录深入分析 ConfigManager<TKey, TValue> 类1. 类设计概述2. 核心成员分析2.1 字段和属性2.2 构造函数3. 数据加载机制4. CRUD 操作方法4.1 添加数据4.2 删除数据4.3 更新数据4.4 查询数据4.5 清空数据5. 数据持久化6. 设计亮点7. 使用示例ConfigManager<TKey, …

运维打铁: Python 脚本在运维中的常用场景与实现

文章目录引言思维导图常用场景与代码实现1. 服务器监控2. 文件管理3. 网络管理4. 自动化部署总结注意事项引言 在当今的 IT 运维领域&#xff0c;自动化和效率是至关重要的。Python 作为一种功能强大且易于学习的编程语言&#xff0c;已经成为运维人员不可或缺的工具。它可以帮…

【零基础入门unity游戏开发——unity3D篇】3D光源之——unity反射和反射探针技术

文章目录 前言实现天空盒反射1、新建一个cube2、全反射材质3、增加环境反射分辨率反射探针1、一样把小球材质调成全反射2、在小球身上加添加反射探针3、设置静态物体4、点击烘培5、效果6、可以修改反射探针区域大小7、实时反射专栏推荐完结前言 当对象收到直接和间接光照后,它…

React Three Fiber 实现 3D 模型点击高亮交互的核心技巧

在 WebGL 3D 开发中&#xff0c;模型交互是提升用户体验的关键功能之一。本文将基于 React Three Fiber&#xff08;R3F&#xff09;和 Three.js&#xff0c;总结 3D 模型点击高亮&#xff08;包括模型本身和边框&#xff09;的核心技术技巧&#xff0c;帮助开发者快速掌握复杂…

卷积神经网络实战:MNIST手写数字识别

夜渐深&#xff0c;我还在&#x1f618; 老地方 睡觉了&#x1f64c; 文章目录&#x1f4da; 卷积神经网络实战&#xff1a;MNIST手写数字识别&#x1f9e0; 4.1 预备知识⚙️ 4.1.1 torch.nn.Conv2d() 三维卷积操作&#x1f4cf; 4.1.2 nn.MaxPool2d() 池化层的作用&#x1f4…

HarmonyOS应用无响应(AppFreeze)深度解析:从检测原理到问题定位

HarmonyOS应用无响应&#xff08;AppFreeze&#xff09;深度解析&#xff1a;从检测原理到问题定位 在日常应用使用中&#xff0c;我们常会遇到点击无反应、界面卡顿甚至完全卡死的情况——这些都可能是应用无响应&#xff08;AppFreeze&#xff09; 导致的。对于开发者而言&am…

湖北设立100亿元人形机器人产业投资母基金

湖北设立100亿元人形机器人产业投资母基金 湖北工信 2025年07月08日 12:03 湖北 &#xff0c;时长01:20 近日&#xff0c;湖北设立100亿元人形机器人产业投资母基金&#xff0c;重点支持人形机器人和人工智能相关产业发展。 人形机器人产业投资母基金由湖北省财政厅依托省政府…

时序预测 | Pytorch实现CNN-LSTM-KAN电力负荷时间序列预测模型

预测效果 代码主要功能 该代码实现了一个结合CNN&#xff08;卷积神经网络&#xff09;、LSTM&#xff08;长短期记忆网络&#xff09;和KAN&#xff08;Kolmogorov-Arnold Network&#xff09;的混合模型&#xff0c;用于时间序列预测任务。主要流程包括&#xff1a; 数据加…

OCR 识别:车牌识别相机的 “火眼金睛”

车牌识别相机在交通管理、停车场收费等场景中&#xff0c;需快速准确识别车牌信息。但实际环境中&#xff0c;车牌可能存在污渍、磨损、光照不均等情况&#xff0c;传统识别方式易出现误读、漏读。OCR 技术让车牌识别相机如虎添翼。它能精准提取车牌上的字符&#xff0c;不管是…

Java面试基础:面向对象(2)

1. 接口里可以定义哪些方法抽象方法&#xff1a;抽象方法是接口的核心部分&#xff0c;所有实现接口的类都必须实现这些方法。抽象方法默认是 public 和 abstract 修饰&#xff0c;这些修饰符可以省略。public interface Animal {void Sound(); }默认方法&#xff1a;默认方法是…

有哪些更加简洁的for循环?循环语句?

目录 简洁的for循环 循环过程修改循环变量 循环语句 不同编程语言支持的循环语句 foreach 无限循环 for循环历史 break和continue 循环判断结束值 循环标签 循环语句优化 循环表达式返回值 简洁的for循环 如果需要快速枚举一个集合的元素&#xff0c;尽管C语言可以…