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
英文地址,請注明出處:http://en.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語言可以…