基于 HTML、CSS 和 JavaScript 的智能九宫格图片分割系统

news2025/3/5 22:27:31

目录

1 前言

2 技术实现

2.1 HTML 结构

2.2 CSS 样式

2.3 JavaScript 交互

3 代码解析

3.1 HTML 部分

3.2 CSS 部分

3.3 JavaScript 部分

4 完整代码

5 运行结果

6 总结

6.1 系统特点

6.2 使用方法


1 前言

在当今数字化的时代,图片处理需求日益增长。无论是社交媒体分享、设计创作还是其他用途,有时候我们需要将一张图片分割成多个小块。今天,我要向大家介绍一个基于 HTML、CSS 和 JavaScript 构建的智能九宫格图片分割系统,它可以帮助你轻松地将一张图片分割成 9 个小块,并支持一键下载。

2 技术实现

2.1 HTML 结构

HTML 代码负责构建系统的整体结构,包括标题、上传区域、预览区域、按钮组和九宫格展示区域。使用语义化的标签,使代码结构清晰,易于理解和维护。

2.2 CSS 样式

CSS 代码用于美化页面,设置各个元素的样式。采用了渐变背景、阴影、圆角等效果,营造出现代感十足的界面。同时,使用弹性布局和网格布局,实现了页面的响应式设计。

2.3 JavaScript 交互

JavaScript 代码实现了系统的核心交互逻辑,包括图片上传、预览、分割和下载功能。使用 FileReader 读取用户上传的图片,使用 canvas 进行图片分割,使用 <a> 标签模拟点击下载图片。

3 代码解析

3.1 HTML 部分

HTML 代码主要负责构建网页的结构,定义了网页的标题、各个交互区域和元素。

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>智能九宫格图片分割系统</title>
    <!-- 定义字符编码和响应式布局 -->
    <!-- 页面标题 -->
    <!-- 内联样式,定义页面整体样式 -->
    <style>
        /* 样式代码省略,主要定义了页面背景、容器样式、按钮样式等 */
    </style>
</head>
<body>
    <div class="container">
        <h1>(Copyright © 2025 CSDN@HNUSTer)</h1>
        <h1>智能九宫格图片分割系统</h1>
        <!-- 上传区域,可点击或拖拽图片 -->
        <div class="upload-area" id="uploadArea">
            点击上传或拖拽图片至此
            <input type="file" id="imageInput" accept="image/*" style="display: none;">
        </div>
        <!-- 图片预览区域 -->
        <img id="preview" alt="预览">
        <!-- 按钮组,包含分割和下载按钮 -->
        <div class="button-group">
            <button id="splitBtn" class="action-btn">分割图片</button>
            <button id="downloadAllBtn" class="action-btn">一键下载</button>
        </div>
        <!-- 九宫格图片展示区域 -->
        <div class="grid-container" id="gridContainer"></div>
    </div>
    <!-- 内联 JavaScript 代码,实现页面交互逻辑 -->
    <script>
        // JavaScript 代码省略
    </script>
</body>
</html>
  • <meta> 标签:设置字符编码为 UTF - 8,确保中文等字符正常显示;设置视口,实现响应式布局。
  • <div class="container">:作为整个系统的容器,包含标题、上传区域、预览区域、按钮组和九宫格展示区域。
  • <div class="upload-area">:上传区域,用户可以点击或拖拽图片。内部隐藏的 <input type="file"> 用于选择文件。
  • <img id="preview">:用于预览用户上传的图片。
  • <button> 元素:分别为 “分割图片” 和 “一键下载” 按钮。
  • <div class="grid-container">:用于展示分割后的九宫格图片。

3.2 CSS 部分

CSS 代码用于美化页面,设置各个元素的样式。

body {
    margin: 0;
    padding: 0;
    font-family: 'Poppins', sans-serif;
    background: linear-gradient(145deg, #0f2027, #203a43, #2c5364);
    min-height: 100vh;
    display: flex;
    justify-content: center;
    align-items: center;
    color: #fff;
}
  • body 样式:设置页面背景为渐变颜色,使用弹性布局将内容居中显示,设置字体和文字颜色。
.container {
    background: rgba(255, 255, 255, 0.05);
    padding: 40px;
    border-radius: 20px;
    box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3);
    backdrop-filter: blur(15px);
    border: 1px solid rgba(255, 255, 255, 0.1);
    width: 1000px;
    max-width: 90%;
    text-align: center;
    transition: transform 0.3s ease;
}
.container:hover {
    transform: translateY(-5px);
}
  • .container 样式:设置容器的背景、内边距、圆角、阴影等样式,添加鼠标悬停效果。
.upload-area {
    margin: 30px 0;
    padding: 40px;
    border: 3px dashed rgba(255, 255, 255, 0.5);
    border-radius: 15px;
    cursor: pointer;
    background: rgba(255, 255, 255, 0.03);
    transition: all 0.3s ease;
}
.upload-area:hover {
    border-color: #00ddeb;
    background: rgba(255, 255, 255, 0.1);
}
.upload-area.dragover {
    border-color: #00ddeb;
    background: rgba(0, 221, 235, 0.2);
}
  • .upload - area 样式:设置上传区域的样式,包括边框、背景、鼠标悬停和拖拽效果。
.grid-container {
    display: grid;
    grid-template-columns: repeat(3, 1fr);
    gap: 15px;
    margin-top: 30px;
    display: none;
}
.grid-item {
    position: relative;
    overflow: hidden;
    border-radius: 10px;
    box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);
    transition: transform 0.3s ease;
}
.grid-item:hover {
    transform: scale(1.05);
}
.grid-item img {
    width: 100%;
    height: auto;
    display: block;
}
  • .grid - container 样式:使用网格布局,将分割后的图片展示为 3x3 的九宫格。
  • .grid - item 样式:设置每个网格项的样式,包括圆角、阴影和鼠标悬停效果。

3.3 JavaScript 部分

JavaScript 代码实现了页面的交互逻辑,包括图片上传、预览、分割和下载功能。

const uploadArea = document.getElementById('uploadArea');
const imageInput = document.getElementById('imageInput');
const preview = document.getElementById('preview');
const splitBtn = document.getElementById('splitBtn');
const downloadAllBtn = document.getElementById('downloadAllBtn');
const gridContainer = document.getElementById('gridContainer');
let originalImage = null;
let tiles = [];
  • 定义变量:获取页面上的各个元素,初始化原始图片和分割后的图片数组。
// 上传区域点击事件
uploadArea.addEventListener('click', () => imageInput.click());

// 拖拽事件
uploadArea.addEventListener('dragover', (e) => {
    e.preventDefault();
    uploadArea.classList.add('dragover');
});
uploadArea.addEventListener('dragleave', () => {
    uploadArea.classList.remove('dragover');
});
uploadArea.addEventListener('drop', (e) => {
    e.preventDefault();
    uploadArea.classList.remove('dragover');
    const file = e.dataTransfer.files[0];
    handleImage(file);
});

// 文件选择事件
imageInput.addEventListener('change', (e) => {
    const file = e.target.files[0];
    handleImage(file);
});
  • 事件监听:为上传区域添加点击、拖拽和文件选择事件,调用 handleImage 函数处理图片。
// 处理图片
function handleImage(file) {
    if (file && file.type.startsWith('image/')) {
        const reader = new FileReader();
        reader.onload = (e) => {
            preview.src = e.target.result;
            preview.style.display = 'block';
            splitBtn.style.display = 'block';
            downloadAllBtn.style.display = 'none';
            gridContainer.style.display = 'none';
            originalImage = new Image();
            originalImage.src = e.target.result;
        };
        reader.readAsDataURL(file);
    }
}
  • handleImage 函数:使用 FileReader 读取用户上传的图片,将图片显示在预览区域,显示 “分割图片” 按钮。
// 分割图片
splitBtn.addEventListener('click', () => {
    if (!originalImage) return;

    gridContainer.innerHTML = '';
    gridContainer.style.display = 'grid';
    tiles = [];

    const width = originalImage.width;
    const height = originalImage.height;
    const tileWidth = width / 3;
    const tileHeight = height / 3;

    for (let i = 0; i < 3; i++) {
        for (let j = 0; j < 3; j++) {
            const canvas = document.createElement('canvas');
            canvas.width = tileWidth;
            canvas.height = tileHeight;
            const ctx = canvas.getContext('2d');
            ctx.drawImage(
                originalImage,
                j * tileWidth,
                i * tileHeight,
                tileWidth,
                tileHeight,
                0,
                0,
                tileWidth,
                tileHeight
            );

            const img = document.createElement('img');
            img.src = canvas.toDataURL('image/png');
            tiles.push({ src: img.src, row: i, col: j });

            const gridItem = document.createElement('div');
            gridItem.className = 'grid-item';
            gridItem.appendChild(img);
            gridContainer.appendChild(gridItem);
        }
    }
    downloadAllBtn.style.display = 'block';
});
  • “分割图片” 按钮点击事件:将原始图片分割成 9 个小块,使用 canvas 绘制每个小块,将小块图片添加到九宫格展示区域,并显示 “一键下载” 按钮。
// 一键下载所有图片
downloadAllBtn.addEventListener('click', () => {
    tiles.forEach((tile, index) => {
        setTimeout(() => {
            const link = document.createElement('a');
            link.href = tile.src;
            link.download = `tile_${tile.row}_${tile.col}.png`;
            link.click();
        }, index * 100); // 添加短暂延迟避免浏览器限制
    });
});
  • “一键下载” 按钮点击事件:遍历分割后的图片数组,使用 <a> 标签模拟点击下载每个小块图片,添加短暂延迟避免浏览器限制。

4 完整代码

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>智能九宫格图片分割系统</title>
    <style>
        body {
            margin: 0;
            padding: 0;
            font-family: 'Poppins', sans-serif;
            background: linear-gradient(145deg, #0f2027, #203a43, #2c5364);
            min-height: 100vh;
            display: flex;
            justify-content: center;
            align-items: center;
            color: #fff;
        }
        .container {
            background: rgba(255, 255, 255, 0.05);
            padding: 40px;
            border-radius: 20px;
            box-shadow: 0 15px 40px rgba(0, 0, 0, 0.3);
            backdrop-filter: blur(15px);
            border: 1px solid rgba(255, 255, 255, 0.1);
            width: 1000px;
            max-width: 90%;
            text-align: center;
            transition: transform 0.3s ease;
        }
        .container:hover {
            transform: translateY(-5px);
        }
        h1 {
            font-size: 3em;
            margin-bottom: 30px;
            color: #ffffff;
            text-shadow: 0 4px 10px rgba(0, 0, 0, 0.4);
            letter-spacing: 2px;
        }
        .upload-area {
            margin: 30px 0;
            padding: 40px;
            border: 3px dashed rgba(255, 255, 255, 0.5);
            border-radius: 15px;
            cursor: pointer;
            background: rgba(255, 255, 255, 0.03);
            transition: all 0.3s ease;
        }
        .upload-area:hover {
            border-color: #00ddeb;
            background: rgba(255, 255, 255, 0.1);
        }
        .upload-area.dragover {
            border-color: #00ddeb;
            background: rgba(0, 221, 235, 0.2);
        }
        #preview {
            max-width: 400px;
            max-height: 400px;
            margin: 20px auto;
            border-radius: 10px;
            display: none;
            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.3);
        }
        .grid-container {
            display: grid;
            grid-template-columns: repeat(3, 1fr);
            gap: 15px;
            margin-top: 30px;
            display: none;
        }
        .grid-item {
            position: relative;
            overflow: hidden;
            border-radius: 10px;
            box-shadow: 0 5px 20px rgba(0, 0, 0, 0.2);
            transition: transform 0.3s ease;
        }
        .grid-item:hover {
            transform: scale(1.05);
        }
        .grid-item img {
            width: 100%;
            height: auto;
            display: block;
        }
        .button-group {
            margin-top: 30px;
            display: flex;
            justify-content: center;
            gap: 20px;
        }
        .action-btn {
            padding: 15px 40px;
            border: none;
            border-radius: 50px;
            font-size: 1.2em;
            cursor: pointer;
            color: #fff;
            text-transform: uppercase;
            letter-spacing: 1px;
            transition: all 0.3s ease;
            box-shadow: 0 5px 15px rgba(0, 0, 0, 0.2);
        }
        #splitBtn {
            background: linear-gradient(90deg, #ff416c, #ff4b2b);
            display: none;
        }
        #splitBtn:hover {
            background: linear-gradient(90deg, #ff5a7f, #ff6947);
            transform: translateY(-3px);
        }
        #downloadAllBtn {
            background: linear-gradient(90deg, #00c6ff, #0072ff);
            display: none;
        }
        #downloadAllBtn:hover {
            background: linear-gradient(90deg, #00ddeb, #0095ff);
            transform: translateY(-3px);
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>(Copyright © 2025 CSDN@HNUSTer)</h1>
        <h1>智能九宫格图片分割系统</h1>
        <div class="upload-area" id="uploadArea">
            点击上传或拖拽图片至此
            <input type="file" id="imageInput" accept="image/*" style="display: none;">
        </div>
        <img id="preview" alt="预览">
        <div class="button-group">
            <button id="splitBtn" class="action-btn">分割图片</button>
            <button id="downloadAllBtn" class="action-btn">一键下载</button>
        </div>
        <div class="grid-container" id="gridContainer"></div>
    </div>

    <script>
        const uploadArea = document.getElementById('uploadArea');
        const imageInput = document.getElementById('imageInput');
        const preview = document.getElementById('preview');
        const splitBtn = document.getElementById('splitBtn');
        const downloadAllBtn = document.getElementById('downloadAllBtn');
        const gridContainer = document.getElementById('gridContainer');
        let originalImage = null;
        let tiles = [];

        // 上传区域点击事件
        uploadArea.addEventListener('click', () => imageInput.click());
        
        // 拖拽事件
        uploadArea.addEventListener('dragover', (e) => {
            e.preventDefault();
            uploadArea.classList.add('dragover');
        });
        uploadArea.addEventListener('dragleave', () => {
            uploadArea.classList.remove('dragover');
        });
        uploadArea.addEventListener('drop', (e) => {
            e.preventDefault();
            uploadArea.classList.remove('dragover');
            const file = e.dataTransfer.files[0];
            handleImage(file);
        });

        // 文件选择事件
        imageInput.addEventListener('change', (e) => {
            const file = e.target.files[0];
            handleImage(file);
        });

        // 处理图片
        function handleImage(file) {
            if (file && file.type.startsWith('image/')) {
                const reader = new FileReader();
                reader.onload = (e) => {
                    preview.src = e.target.result;
                    preview.style.display = 'block';
                    splitBtn.style.display = 'block';
                    downloadAllBtn.style.display = 'none';
                    gridContainer.style.display = 'none';
                    originalImage = new Image();
                    originalImage.src = e.target.result;
                };
                reader.readAsDataURL(file);
            }
        }

        // 分割图片
        splitBtn.addEventListener('click', () => {
            if (!originalImage) return;

            gridContainer.innerHTML = '';
            gridContainer.style.display = 'grid';
            tiles = [];

            const width = originalImage.width;
            const height = originalImage.height;
            const tileWidth = width / 3;
            const tileHeight = height / 3;

            for (let i = 0; i < 3; i++) {
                for (let j = 0; j < 3; j++) {
                    const canvas = document.createElement('canvas');
                    canvas.width = tileWidth;
                    canvas.height = tileHeight;
                    const ctx = canvas.getContext('2d');
                    ctx.drawImage(
                        originalImage,
                        j * tileWidth,
                        i * tileHeight,
                        tileWidth,
                        tileHeight,
                        0,
                        0,
                        tileWidth,
                        tileHeight
                    );

                    const img = document.createElement('img');
                    img.src = canvas.toDataURL('image/png');
                    tiles.push({ src: img.src, row: i, col: j });

                    const gridItem = document.createElement('div');
                    gridItem.className = 'grid-item';
                    gridItem.appendChild(img);
                    gridContainer.appendChild(gridItem);
                }
            }
            downloadAllBtn.style.display = 'block';
        });

        // 一键下载所有图片
        downloadAllBtn.addEventListener('click', () => {
            tiles.forEach((tile, index) => {
                setTimeout(() => {
                    const link = document.createElement('a');
                    link.href = tile.src;
                    link.download = `tile_${tile.row}_${tile.col}.png`;
                    link.click();
                }, index * 100); // 添加短暂延迟避免浏览器限制
            });
        });
    </script>
</body>
</html>

5 运行结果

主界面
上传需要分割成九宫格的图像
九宫格分割结果
点击“一键下载”
批量下载完成的九张九宫格碎片图像
原图像

6 总结

6.1 系统特点

  1. 简洁美观的界面:系统采用了渐变背景和玻璃质感的容器设计,整体界面简洁大方,给人一种舒适的视觉体验。同时,使用弹性布局和网格布局,确保在不同设备上都能完美显示。
  2. 便捷的图片上传方式:支持点击上传和拖拽上传两种方式,用户可以根据自己的习惯选择合适的方式上传图片。上传区域有明显的提示信息,并且在鼠标悬停和拖拽时会有相应的效果反馈。
  3. 实时预览功能:上传图片后,系统会立即在预览区域显示图片,让用户可以直观地看到上传的图片。
  4. 高效的图片分割:点击 “分割图片” 按钮,系统会迅速将图片分割成 9 个小块,并以九宫格的形式展示出来。分割过程使用 canvas 实现,保证了分割的准确性和高效性。
  5. 一键下载功能:分割完成后,用户可以点击 “一键下载” 按钮,系统会自动下载所有分割后的小块图片。为了避免浏览器限制,下载过程添加了短暂的延迟。

6.2 使用方法

  1. 打开系统页面,你会看到一个简洁美观的界面。
  2. 点击上传区域或拖拽图片到上传区域,选择要分割的图片。
  3. 上传成功后,图片会在预览区域显示,同时 “分割图片” 按钮会显示出来。
  4. 点击 “分割图片” 按钮,系统会将图片分割成 9 个小块,并以九宫格的形式展示出来。
  5. 分割完成后,“一键下载” 按钮会显示出来,点击该按钮,系统会自动下载所有分割后的小块图片。

如果你有图片分割的需求,不妨试试这个系统吧!

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

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

相关文章

委托者模式(掌握设计模式的核心之一)

目录 问题&#xff1a; 举例&#xff1a; 总结&#xff1a;核心就是利用Java中的多态来完成注入。 问题&#xff1a; 今天刷面经&#xff0c;刷到装饰者模式&#xff0c;又进阶的发现委托者模式&#xff0c;发现还是不理解&#xff0c;特此记录。 举例&#xff1a; ​老板​…

MySQL-高级查询

查询处理 排序&#xff08;默认不是按主键排序的&#xff09; order by 字段1[&#xff0c;字段2] [asc|desc] 默认是升序排序也可以指定 select 列表中列的序号进行排序如果是多个字段&#xff0c;那么在上一个字段排序完的基础上排序下一个 限制数量 limit 行数&#xff0…

Apache Kafka单节点极速部署指南:10分钟搭建开发单节点环境

Apache Kafka单节点极速部署指南&#xff1a;10分钟搭建开发单节点环境 Kafka简介&#xff1a; Apache Kafka是由LinkedIn开发并捐赠给Apache基金会的分布式流处理平台&#xff0c;现已成为实时数据管道和流应用领域的行业标准。它基于高吞吐、低延迟的设计理念&#xff0c;能够…

Redis7——进阶篇(一)

前言&#xff1a;此篇文章系本人学习过程中记录下来的笔记&#xff0c;里面难免会有不少欠缺的地方&#xff0c;诚心期待大家多多给予指教。 基础篇&#xff1a; Redis&#xff08;一&#xff09;Redis&#xff08;二&#xff09;Redis&#xff08;三&#xff09;Redis&#x…

Sourcetrail 代码分析工具

Sourcetrail 概述 Sourcetrail 是一个代码分析工具&#xff0c;它旨在帮助开发人员理解和导航复杂的代码库。它可以创建代码库的可视化图形&#xff0c;显示代码中的类、函数、变量、依赖关系等信息&#xff0c;从而帮助开发人员更好地理解代码结构和关系&#xff0c;降低维护…

从数据到决策,永洪科技助力良信电器“智”领未来

在数字经济浪潮汹涌的时代&#xff0c;数字化转型已成为企业增强竞争力、实现可持续发展的必由之路。良信电器&#xff0c;作为国内知名的电气设备制造企业&#xff0c;积极响应时代号召&#xff0c;携手永洪科技&#xff0c;共同开启了数字化转型的新篇章。 上海良信电器股份有…

Python-04BeautifulSoup网络爬虫

2025-03-04-BeautifulSoup网络爬虫 记录BeautifulSoup网络爬虫的核心知识点 文章目录 2025-03-04-BeautifulSoup网络爬虫 [toc]1-参考网址2-学习要点3-核心知识点1. 安装2. 导入必要的库3. 发送 HTTP 请求4. 创建 BeautifulSoup 对象5. 解析 HTML 内容5.1 查找标签5.2 根据属性…

Spring框架自带的定时任务:Spring Task详解

文章目录 一、基本使用1、配置&#xff1a;EnableScheduling2、触发器&#xff1a;Scheduled 二、拓展1、修改默认的线程池2、springboot配置 三、源码分析参考资料 一、基本使用 1、配置&#xff1a;EnableScheduling import org.springframework.context.annotation.Config…

深入探索像ChatGPT这样的大语言模型

参考 【必看珍藏】2月6日&#xff0c;安德烈卡帕西最新AI普及课&#xff1a;深入探索像ChatGPT这样的大语言模型&#xff5c;Andrej Karpathy fineweb知乎翻译介绍 fineweb-v1原始连接 fineweb中文翻译版本 Chinese Fineweb Edu数据集 查看网络的内部结果&#xff0c;可以参…

week 3 - More on Collections - Lecture 3

一、Motivation 1. Java支持哪种类型的一维数据结构&#xff1f; Java中用于在单一维度中存储数据的数据结构&#xff0c;如arrays or ArrayLists. 2. 如何在Java下创建一维数据结构&#xff1f;&#xff08;1-dimensional data structure&#xff09; 定义和初始化这些一…

机器学习11-经典网络解析

机器学习11-经典网络解析 AlexNetImageNet 大规模视觉识别挑战赛一、赛事背景与目的二、数据集与任务设置三、参赛规则与流程四、评审标准与机制五、历史与影响六、中国团队的表现 贡献解析CONV1层MaxP00L1层NORM1层CONV2层 CONV3、CONV4层CONV4&#xff0c;Max POOL3 层FC6、F…

【数据结构】链表与顺序表的比较

链表和顺序表是两种常见的数据结构&#xff0c;各有优缺点&#xff0c;适用于不同的场景。 ### 顺序表&#xff08;数组&#xff09; 顺序表在内存中连续存储元素&#xff0c;支持随机访问。 **优点&#xff1a;** 1. **随机访问**&#xff1a;通过索引直接访问元素&#xf…

【JavaScript—前端快速入门】JavaScript 基础语法

JavaScript 基础语法 1. 变量 创建变量(变量定义 / 变量声明 / 变量初始化)&#xff0c;JS 声明变量有3种方式 2. 通过打印日志&#xff0c;查看变量类型 JavaScript 是一门动态弱类型语言&#xff0c;变量可以存放不同类型的值(动态) 接下来&#xff0c;我们通过使用 log 指令…

deepseek助力运维和监控自动化

将DeepSeek与Agent、工作流及Agent编排技术结合&#xff0c;可实现IT运维与监控的智能化闭环管理。以下是具体应用框架和场景示例&#xff1a; 一、智能Agent体系设计 多模态感知Agent 日志解析Agent&#xff1a;基于DeepSeek的NLP能力&#xff0c;实时解析系统日志中的语义&a…

springboot在业务层校验对象/集合中字段是否符合要求

springboot在业务层校验对象参数是否必填 1.场景说明2.代码实现 1.场景说明 为什么不在控制层使用Validated或者Valid注解直接进行校验呢&#xff1f;例如通过excel导入数据&#xff0c;将excel数据转为实体类集合后&#xff0c;校验集合中属性是否符合要求。 2.代码实现 定义…

【UCB CS 61B SP24】Lecture 17 - Data Structures 3: B-Trees 学习笔记

本文以 2-3-4 树为例详细讲解了 B 树的概念&#xff0c;逐步分析其操作&#xff0c;并用 Java 实现了标准的多阶 B 树。 1. 2-3 & 2-3-4 Trees 上一节课中讲到的二叉搜索树当数据是随机顺序插入的时候能够使得树变得比较茂密&#xff0c;如下图右侧所示&#xff0c;时间复…

论文阅读笔记:UniFace: Unified Cross-Entropy Loss for Deep Face Recognition

论文阅读笔记&#xff1a;UniFace: Unified Cross-Entropy Loss for Deep Face Recognition 1 背景2 创新点3 方法3.1 回顾softmax损失3.2 统一交叉熵损失3.3 人脸验证中的UCE损失3.4 进一步的优化3.4.1 边际UCE损失3.4.2 平衡BCE损失 4 实验4.1 消融实验4.2 和SOTA方法对比 论…

从零开始用react + tailwindcss + express + mongodb实现一个聊天程序(十) 收发消息

1.聊天框 首先我们完善前端的消息输入框 components下面新建MessageInput组件 import { useState,useRef } from "react" import {X,Image,Send} from "lucide-react"import { useChatStore } from "../store/useChatStore" import toast from…

5分钟看懂Deepseek开源周之六:Deepseek-V3/R1推理系统设计----揭开深度求索模型系统设计和运营成本之谜

前言 众所周知&#xff0c;四大天王一般有五个人。所以开源周五连发有第六天也很正常。贴上了开源周活动的github主贴&#xff0c;大家可以不上推特就能了解详情。 deepseek-ai/open-infra-index: Production-tested AI infrastructure tools for efficient AGI development a…

C++发展

目录 ​编辑C 的发展总结&#xff1a;​编辑 1. C 的早期发展&#xff08;1979-1985&#xff09; 2. C 标准化过程&#xff08;1985-1998&#xff09; 3. C 标准演化&#xff08;2003-2011&#xff09; 4. C11&#xff08;2011年&#xff09; 5. C14&#xff08;2014年&a…