Html实现图片上传/裁剪/马赛克/压缩/旋转/缩放

cropper下载   https://download.csdn.net/download/dongyan3595/90970115

前端代码

<!doctype html>
<html lang="en">
<head><base href="/aishop/"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta charset="UTF-8"/><link rel="stylesheet" type="text/css" href="assets/fonts/font-awesome/css/font-awesome.css"/><link rel="stylesheet" type="text/css" href="assets/js/vendor/bootstrap/css/bootstrap.min.css"/><link rel="stylesheet" type="text/css" href="assets/js/vendor/cropper/cropper.min.css"/><style>.upload-image {height: 100%; opacity: 0;}.upload-image-preview {width: 200px;height: 200px;overflow: hidden;margin: 0 44px;display: inline-block;}#imageBox {height: 451px;overflow: auto;background-color: #F1F1F1;}#imagePreviewBox .upload-image-preview {background-color: #F1F1F1;}.cropper-container {height:432px!important;width: 529px!important;}.cropper-crop-box{max-height:430px!important;max-width:527px!important;}.mosaic-canvas {position: absolute;top: 0;left: 0;pointer-events: auto; /* 改为auto,允许鼠标事件 */z-index: 1000;}.mosaic-active {cursor: crosshair !important;}</style>
</head>
<div><div id="content" class="edit-content" style="padding: 5px; opacity: 0;"><div id="imageBox" class="col-xs-8" style="position: relative;"><img id="image" class="upload-image" src="assets/images/ruanzhu.jpg"><canvas id="mosaicCanvas" class="mosaic-canvas" style="display:none;"></canvas></div><div id="imagePreviewBox" class="col-xs-4"><div class="upload-image-preview"></div></div><div class="col-xs-4" style="text-align: center;"><button id="dragBtn" type="button" class="btn btn-danger fa fa-arrows" onclick="dragImage()" title="移动"></button><button type="button" class="btn btn-danger fa fa-search-plus" onclick="zoomPlus()" title="放大图片"></button><button type="button" class="btn btn-danger fa fa-search-minus" onclick="zoomMinus()" title="缩小图片"></button><button type="button" class="btn btn-danger fa fa-refresh" onclick="reset()" title="重置图片"></button><button id="mosaicBtn" type="button" class="btn btn-warning fa fa-th" onclick="toggleMosaic()" title="马赛克"></button><button type="button" class="btn btn-info fa fa-reply" onclick="undoEdit()" title="撤销" id="undoBtn" disabled></button></div><div class="col-xs-4" style="margin-top: 5px; text-align: center;"><div class="btn-group"><button class="btn btn-danger fa fa-undo" onclick="rateLeft()" type="button" title="向左旋转90°"> 向左旋转</button></div><div class="btn-group"><button class="btn  btn-danger fa fa-repeat" onclick="rateRight()" type="button" title="向右旋转90°"> 向右旋转</button></div></div><div class="col-xs-4" style="margin-top: 5px; text-align: center;"><div class="btn-group"><form id="uploadFileForm" action="#" style="display: none;"><input type="file" id="uploadImage" name="image" accept="image/jpeg,image/gif,image/png,image/jpg" onchange="doUploadFile()"/></form><button class="btn btn-primary btn-block fa fa-upload" type="button" onclick="openUploadImage()"> 上传图片</button></div><div class="btn-group"><button class="btn btn-primary btn-block fa fa-save" type="button" onclick="doCrop()"> 裁剪上传</button></div></div><div class="col-xs-12" style="margin-top: 5px; text-align: center;"><div class="form-group"><label for="mosaicSize">马赛克大小:</label><input type="range" id="mosaicSize" min="5" max="30" value="10" class="form-control"><span id="mosaicSizeValue">10px</span></div></div><div class="col-xs-12" style="margin-top: 5px; text-align: center;"><div class="form-group"><label for="imageSize">图片压缩:</label><input type="range" id="imageSize" min="10" max="100" value="100" class="form-control"><span id="imageSizeValue">100%</span></div></div></div>
</div>
<script type="text/javascript" src="assets/js/jquery-3.5.1.min.js"></script>
<script type="text/javascript" src="assets/js/vendor/bootstrap/js/bootstrap.min.js"></script>
<script type="text/javascript" src="assets/js/vendor/cropper/cropper.min.js"></script>
<script type="text/javascript" src="assets/js/common.js"></script>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script type="text/javascript">var toggleMosaic = function() {}var undoEdit = function() {}var doCrop = function() {}var zoomPlus= function() {}var zoomMinus= function() {}var reset= function() {}var rateLeft= function() {}var rateRight= function() {}var dragImage= function() {}var openUploadImage= function() {}var  doUploadFile= function() {}layui.config({base: 'assets/layuiadmin/'}).extend({index: 'lib/index'}).use(['index', 'restajax', 'datamessage', 'dialog'], function() {var restAjax = layui.restajax;var dialog = layui.dialog;var dataMessage = layui.datamessage;function doSubmitForm() {return false;}var cropper;var isMosaicMode = false;var mosaicCanvas = document.getElementById('mosaicCanvas');var mosaicCtx = mosaicCanvas.getContext('2d');var isDrawing = false;var lastX, lastY;var editHistory = [];var currentHistoryIndex = -1;var maxHistorySteps = 10;// 放大zoomPlus = function () {cropper.zoom(0.1);}// 缩小zoomMinus = function () {cropper.zoom(-0.1);}// 逆时针90rateLeft = function () {cropper.rotate(-90);}// 顺时针90rateRight = function () {cropper.rotate(90);}// 重置reset = function () {cropper.reset();}// 图片移动var isDrag = false;dragImage = function () {if (!isDrag) {cropper.setDragMode('move');isDrag = true;$('#dragBtn').addClass('btn-default');$('#dragBtn').removeClass('btn-danger');} else {cropper.setDragMode('crop');isDrag = false;$('#dragBtn').addClass('btn-danger');$('#dragBtn').removeClass('btn-default');}}// 切换马赛克模式toggleMosaic = function() {isMosaicMode = !isMosaicMode;if (isMosaicMode) {// 进入马赛克模式$('#mosaicBtn').addClass('btn-success');$('#mosaicBtn').removeClass('btn-warning');// 保存当前状态到历史记录saveToHistory();// 显示马赛克画布setupMosaicCanvas();$('#mosaicCanvas').show();// 重要:将画布设置为可接收鼠标事件mosaicCanvas.style.pointerEvents = 'auto';// 添加鼠标事件$(mosaicCanvas).on('mousedown', startMosaic);$(document).on('mousemove', drawMosaic);$(document).on('mouseup mouseleave', stopMosaic);// 添加触摸事件$(mosaicCanvas).on('touchstart', handleTouchStart);$(document).on('touchmove', handleTouchMove);$(document).on('touchend touchcancel', handleTouchEnd);// 添加马赛克模式样式$('#imageBox').addClass('mosaic-active');} else {// 退出马赛克模式$('#mosaicBtn').addClass('btn-warning');$('#mosaicBtn').removeClass('btn-success');// 重要:将画布设置为不可接收鼠标事件mosaicCanvas.style.pointerEvents = 'none';// 移除事件监听$(mosaicCanvas).off('mousedown');$(document).off('mousemove', drawMosaic);$(document).off('mouseup mouseleave', stopMosaic);$(mosaicCanvas).off('touchstart');$(document).off('touchmove', handleTouchMove);$(document).off('touchend touchcancel', handleTouchEnd);// 移除马赛克模式样式$('#imageBox').removeClass('mosaic-active');}}// 设置马赛克画布function setupMosaicCanvas() {var cropperCanvas = $('.cropper-canvas')[0];var cropperImage = $('.cropper-canvas img')[0];if (cropperCanvas && cropperImage) {var containerRect = cropperCanvas.getBoundingClientRect();var imageBoxRect = $('#imageBox')[0].getBoundingClientRect();// 设置画布尺寸mosaicCanvas.width = containerRect.width;mosaicCanvas.height = containerRect.height;mosaicCanvas.style.width = containerRect.width + 'px';mosaicCanvas.style.height = containerRect.height + 'px';// 设置画布位置 - 相对于imageBox计算偏移mosaicCanvas.style.position = 'absolute';mosaicCanvas.style.top = (containerRect.top - imageBoxRect.top) + 'px';mosaicCanvas.style.left = (containerRect.left - imageBoxRect.left) + 'px';// 清除画布mosaicCtx.clearRect(0, 0, mosaicCanvas.width, mosaicCanvas.height);}}// 开始绘制马赛克function startMosaic(e) {e.preventDefault(); // 阻止默认行为isDrawing = true;var rect = mosaicCanvas.getBoundingClientRect();lastX = e.clientX - rect.left;lastY = e.clientY - rect.top;// 立即开始绘制一个点drawMosaicEffect(lastX, lastY, lastX, lastY);}// 处理触摸开始事件function handleTouchStart(e) {e.preventDefault();var touch = e.originalEvent.touches[0];var rect = mosaicCanvas.getBoundingClientRect();lastX = touch.clientX - rect.left;lastY = touch.clientY - rect.top;isDrawing = true;}// 处理触摸移动事件function handleTouchMove(e) {if (!isDrawing || !isMosaicMode) return;e.preventDefault();var touch = e.originalEvent.touches[0];var rect = mosaicCanvas.getBoundingClientRect();var x = touch.clientX - rect.left;var y = touch.clientY - rect.top;drawMosaicEffect(lastX, lastY, x, y);lastX = x;lastY = y;}// 处理触摸结束事件function handleTouchEnd(e) {isDrawing = false;}// 绘制马赛克function drawMosaic(e) {if (!isDrawing || !isMosaicMode) return;var rect = mosaicCanvas.getBoundingClientRect();var x = e.clientX - rect.left;var y = e.clientY - rect.top;drawMosaicEffect(lastX, lastY, x, y);lastX = x;lastY = y;}// 绘制马赛克效果function drawMosaicEffect(startX, startY, endX, endY) {var cropperImage = $('.cropper-canvas img')[0];if (!cropperImage) return;var mosaicSize = parseInt($('#mosaicSize').val());var dx = endX - startX;var dy = endY - startY;var distance = Math.sqrt(dx * dx + dy * dy);var steps = Math.max(Math.floor(distance), 1);for (var i = 0; i <= steps; i++) {var x = startX + (dx * i / steps);var y = startY + (dy * i / steps);// 计算马赛克块的左上角坐标var mosaicX = Math.floor(x / mosaicSize) * mosaicSize;var mosaicY = Math.floor(y / mosaicSize) * mosaicSize;// 从原始图像获取像素数据var cropperRect = cropperImage.getBoundingClientRect();var cropperCanvas = document.createElement('canvas');cropperCanvas.width = mosaicSize;cropperCanvas.height = mosaicSize;var cropperCtx = cropperCanvas.getContext('2d');try {// 获取马赛克区域的图像数据cropperCtx.drawImage(cropperImage,mosaicX, mosaicY, mosaicSize, mosaicSize,0, 0, mosaicSize, mosaicSize);// 计算平均颜色var imageData = cropperCtx.getImageData(0, 0, mosaicSize, mosaicSize);var data = imageData.data;var r = 0, g = 0, b = 0, a = 0, count = 0;for (var j = 0; j < data.length; j += 4) {r += data[j];g += data[j + 1];b += data[j + 2];a += data[j + 3];count++;}// 计算平均值r = Math.round(r / count);g = Math.round(g / count);b = Math.round(b / count);a = Math.round(a / count);// 绘制马赛克块mosaicCtx.fillStyle = `rgba(${r}, ${g}, ${b}, ${a / 255})`;mosaicCtx.fillRect(mosaicX, mosaicY, mosaicSize, mosaicSize);} catch (error) {console.error('马赛克绘制错误:', error);}}}// 停止绘制马赛克function stopMosaic() {if (isDrawing) {isDrawing = false;saveToHistory();}}// 保存到历史记录function saveToHistory() {// 如果当前不是最新状态,删除后面的历史if (currentHistoryIndex >= 0 && currentHistoryIndex < editHistory.length - 1) {editHistory = editHistory.slice(0, currentHistoryIndex + 1);}// 获取当前画布状态var imageData = null;if (mosaicCanvas.width > 0 && mosaicCanvas.height > 0) {try {imageData = mosaicCtx.getImageData(0, 0, mosaicCanvas.width, mosaicCanvas.height);} catch (e) {console.error('获取画布数据失败:', e);}}// 添加到历史记录if (imageData) {editHistory.push(imageData);// 限制历史记录数量if (editHistory.length > maxHistorySteps) {editHistory.shift();}currentHistoryIndex = editHistory.length - 1;// 启用撤销按钮$('#undoBtn').prop('disabled', false);}}// 撤销编辑undoEdit = function () {if (currentHistoryIndex > 0) {currentHistoryIndex--;var imageData = editHistory[currentHistoryIndex];// 恢复到之前的状态mosaicCtx.putImageData(imageData, 0, 0);} else if (currentHistoryIndex === 0) {// 恢复到初始状态(清空画布)mosaicCtx.clearRect(0, 0, mosaicCanvas.width, mosaicCanvas.height);currentHistoryIndex = -1;$('#undoBtn').prop('disabled', true);}}// 重置马赛克画布和历史记录function resetMosaicCanvas() {if (mosaicCanvas) {mosaicCtx.clearRect(0, 0, mosaicCanvas.width, mosaicCanvas.height);}editHistory = [];currentHistoryIndex = -1;$('#undoBtn').prop('disabled', true);}// 打开上传图片openUploadImage = function () {$('#uploadImage').click();}// 添加键盘快捷键支持$(document).on('keydown', function(e) {// 检测 CTRL + Zif (e.ctrlKey && e.keyCode === 90) {// 阻止浏览器默认的撤销行为e.preventDefault();// 调用撤销函数undoEdit();}});// 上传文件doUploadFile = function () {var loadLayerIndex;var formData = new FormData($('#uploadFileForm')[0]);restAjax.postFile('api/goods/upload-image', formData, {}, function (code, data) {dialog.msg('上传成功');cropper.replace('route/file/download/false/' + data.data, false);localStorage.setItem('uploadImage', data.data);// 重置马赛克画布和历史记录resetMosaicCanvas();}, function(code, data) {dialog.msg(data.msg);}, function() {loadLayerIndex = dialog.msg(dataMessage.uploading, {icon: 16, time: 0, shade: 0.3});}, function() {dialog.close(loadLayerIndex);});}// 裁剪doCrop = function () {// 获取裁剪后的画布var croppedCanvas = cropper.getCroppedCanvas();// 如果有马赛克效果,将马赛克合并到裁剪后的图像上if (mosaicCanvas.width > 0 && mosaicCanvas.height > 0) {var cropperCanvas = $('.cropper-canvas')[0];var cropBox = $('.cropper-crop-box')[0];if (cropperCanvas && cropBox) {var cropBoxRect = cropBox.getBoundingClientRect();var cropperRect = cropperCanvas.getBoundingClientRect();// 计算裁剪框相对于画布的位置var left = cropBoxRect.left - cropperRect.left;var top = cropBoxRect.top - cropperRect.top;// 获取裁剪框的尺寸var width = cropBoxRect.width;var height = cropBoxRect.height;// 在裁剪后的画布上绘制马赛克var ctx = croppedCanvas.getContext('2d');ctx.drawImage(mosaicCanvas,left, top, width, height,0, 0, croppedCanvas.width, croppedCanvas.height);}}croppedCanvas.toBlob(function (cropBlob) {var formData = new FormData();formData.append("file", cropBlob);formData.append("picturesThumbnails", $('#imageSize').val());var loadLayerIndex;restAjax.postFile('api/goods/upload-image', formData, {}, function (code, data) {dialog.msg('裁剪成功');// 完全重置马赛克画布和历史记录resetMosaicCanvas();// 替换图像cropper.replace('route/file/download/false/' + data.data, false);localStorage.setItem('uploadImage', data.data);// 在图像加载完成后重新设置马赛克画布setTimeout(function() {setupMosaicCanvas();}, 500);}, function(code, data) {dialog.msg(data.msg);}, function() {loadLayerIndex = dialog.msg(dataMessage.uploading, {icon: 16, time: 0, shade: 0.3});}, function() {dialog.close(loadLayerIndex);});});}$(function () {var image = document.getElementById('image');cropper = new Cropper(image, {aspectRatio: 1.5 / 2,viewMode: 1,minContainerHeight: 430,maxContainerHeight: 430,preview: '.upload-image-preview',crop(event) {// 如果在马赛克模式下,实时更新马赛克画布位置if (isMosaicMode) {setupMosaicCanvas();}},ready() {// 初始化马赛克画布setTimeout(function() {setupMosaicCanvas();}, 500);}});$('#content').fadeTo(1000, 1);var fileId = restAjax.params(window.location.href).fileId;if (fileId != 'undefined' && fileId != undefined && fileId.length > 1) {localStorage.setItem('uploadImage', fileId);cropper.replace('route/file/download/false/' + fileId, false);}// 马赛克大小滑块事件$('#mosaicSize').on('input', function() {var size = $(this).val();$('#mosaicSizeValue').text(size + 'px');});$('#imageSize').on('input', function() {var size = $(this).val();$('#imageSizeValue').text(size + '%');});// 确保马赛克画布初始化setTimeout(function() {setupMosaicCanvas();}, 1000); // 延迟1秒,确保cropper已完全初始化})});
</script>
</body>
</html>

后台代码

    @PostMapping({"upload-image"})public SuccessResultData<String> uploadFile(@RequestParam("file") MultipartFile file, Double picturesThumbnails) throws IOException {// 参数校验if (file.isEmpty()) {throw new SaveException("上传文件不能为空");}InputStream inputStream = file.getInputStream();BufferedImage bufferedImage = ImageIO.read(inputStream);if (bufferedImage == null) {throw new SaveException("无效的图片文件");}BufferedImage image = bufferedImage;if (picturesThumbnails != null) {try {image = Thumbnails.of(new BufferedImage[]{bufferedImage}).scale(1).outputQuality(picturesThumbnails / 100).outputFormat("jpg").asBufferedImage();} catch (IOException e) {throw new SaveException("图片压缩出现异常");}}MultipartFile file1 = new MockMultipartFile("file",            // 参数名(表单中的name)UUIDUtil.get32UUID() + ".jpg",        // 原始文件名"image/jpeg",convertToInputStream(image, "jpg")        // 文件输入流);Map<String, Object> params1 = new HashMap<>();String fileId1 = iFileService.uploadSingleByUserId(securityComponent.getCurrentUser().getUserId(), file1, UploadTypeEnum.IMAGE, params1);return new SuccessResultData(fileId1);}

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

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

相关文章

springboot项目中整合高德地图

一&#xff1a;高德开放平台的使用 高德开放平台 | 高德地图API 注册高德地图账号 认证填写个人信息&#xff1a; 认证方式选择“个人认证开发者”即可&#xff0c;然后完善信息 认证成功之后&#xff0c;再次进入控制台&#xff0c;创建关于地图的应用 创建Key&#xff08;y…

鸿蒙开发-视频学习及实用中的一些小结

1.extend 和 styles extend是在styles基础上进行了升级 使用的时候extend是全局的。 styles不加function 局部 加了就是全局。 2.builder 中要引用comp组件 需要在外层嵌套布局 3.ability之间的跳转 want需要加&#xff1b; 4. as 类型断言 &#xff01;跟在xxx! 表示…

网盘直链解析网页版

不支持百度网盘、阿里网盘。 123&#xff0c;蓝奏云&#xff0c;可道云什么的都可以 源码下载地址&#xff1a;https://www.123865.com/s/X91lVv-3l90v

AXI4-Stream Clock Converter IP

一、参考说明 1.没有专门对AXI4-Stream Clock Converter IP说明的文档&#xff1b; 2.可以参考PG085文档&#xff1b; 3.可以参考PG035文档&#xff1b; 二、IP的作用 1.用于stream数据流再不同的时钟域之间的可靠性传输&#xff1b; 2.支持跨时钟域的场景&#xff1b; 3.内部…

NineData 社区版 V4.2.0 发布!新增MySQL与PostgreSQL互相迁移,SQL管理Milvus,安装更高效

NineData 社区版 V4.2.0 正式发布&#xff01;本次更新通过镜像轻量化部署、新增 3 条迁移链路、新增支持 Milvus 向量数据库等核心升级&#xff0c;轻松实现数据库迁移容灾、实时数据集成分析、AI 向量数据管理等场景需求。社区版支持本地离线部署&#xff0c;严格保障数据隐私…

如何安装使用qmt脚本跟单聚宽策略

登录知识星球&#xff0c;下载获取 解压后&#xff0c;登录大qmt&#xff0c;将策略导入其中&#xff0c; 然后修改参数&#xff1a; 点击免密改参 totalcash&#xff1a;该策略使用资金总量 per&#xff1a;每只股票占比资金额 举例&#xff0c;当前出信号&#xff0c;每只…

什么是MongoDB

目录 主要特点 MongoDB概念解析 完整术语列表 MongoDB安装 MongoDB Shell 安装MongoDB Shell 数据库管理 查看数据库列表 创建数据库 删除数据库 默认数据库 系统内置数据库 集合管理 查看集合 创建集合 更新集合名 删除集合 文档操作 插入文档 查询文档 …

【Docker基础】Docker核心概念:容器(Container)与镜像(Image)的区别与联系

目录 引言 1 Docker镜像&#xff08;Image&#xff09; 1.1 镜像的定义 1.2 镜像的特点 1.3 镜像的创建 1.4 镜像的结构 1.5 镜像结构描述 2 Docker容器&#xff08;Container&#xff09; 2.1 容器的定义 2.2 容器的特点 2.3 容器的创建与运行 2.4 容器的生命周期…

从零到一:构建企业级 Vue.js 3 组件库

前言&#xff1a;为何要构建组件库&#xff1f; 在现代前端工程化体系中&#xff0c;组件库已不再是大型团队的专属。它是一个团队设计规范、开发模式和技术沉淀的核心载体。构建一个组件库&#xff0c;能够带来诸多优势&#xff1a; 提升效率&#xff1a;提供可复用的高质量…

【2025 CVPR-Backbone】Building Vision Models upon Heat Conduction

摘要 利用注意力机制的视觉表示模型在追求大感受野时面临着巨大的计算开销。在本研究中&#xff0c;我们通过引入基于物理热传导原理的热传导算子&#xff08;Heat Conduction Operator, HCO&#xff09;来缓解这一挑战这么高级咩(⊙o⊙)&#xff01;。HCO将图像块视为热源&am…

Rust编写Shop管理系统

Rust编写Shop管理系统 Actix Web 是一个功能强大、实用且速度极快的 Rust Web 框架。编写Shop管理系统 HelloKeny 首先是先编写最简单的例子,类似hello World可以检查环境 Actix Web 是一个功能强大、实用且速度极快的 Rust Web 框架。 命令 cargo new hellokenycd hell…

安宝特案例丨Vuzix AR智能眼镜集成专业软件,助力卢森堡医院药房转型,赢得辉瑞创新奖

在Vuzix M400 AR智能眼镜的助力下&#xff0c;卢森堡罗伯特舒曼医院&#xff08;the Robert Schuman Hospitals, HRS&#xff09;凭借在无菌制剂生产流程中引入增强现实技术&#xff08;AR&#xff09;创新项目&#xff0c;荣获了2024年6月7日由卢森堡医院药剂师协会&#xff0…

快速幂算法详解:从暴力到优雅的数学优化

文章目录 一、朴素幂运算的问题二、快速幂的数学原理三、快速幂的递归实现四、快速幂的迭代实现五、模运算下的快速幂六、快速幂的应用场景七、总结 快速幂是一种高效计算幂运算的算法&#xff0c;能够将时间复杂度从朴素的 O (n) 降低到 O (log n)。本文将深入探讨快速幂的原理…

HTML+CSS 动态菜单和登录框

摘要 实现了一个现代化的登录/注册界面&#xff0c;包含导航栏和弹窗表单。 HTML结构采用了响应式设计&#xff0c;包含Logo、导航链接和登录按钮。 CSS样式实现了背景图片、导航栏悬浮效果和表单美化&#xff0c;使用伪元素实现链接下划线动画。 JavaScript实现了弹窗切换…

抖音AI数字人对口型软件LatentSync最新版整合包,音频驱动口型讲话

本次和大家分享一个字节跳动开发的强大的音频驱动口型数字人视频制作软件LatentSync&#xff0c;我以前也分享过不少类似软件了&#xff0c;比如&#xff1a;EchoMimic、VideoReTalking、hallo。字节的推出的这个效果稍微更好一点&#xff0c;我制作了最新版的一键启动整合包。…

深入理解 PyTorch:从基础到高级应用

在深度学习的浪潮中&#xff0c;PyTorch 凭借其简洁易用、动态计算图等特性&#xff0c;迅速成为众多开发者和研究人员的首选框架。本文将深入探讨 PyTorch 的核心概念、基础操作以及高级应用&#xff0c;带你全面了解这一强大的深度学习工具。​ 一、PyTorch 简介​ PyTorch…

Java 中的 synchronized 与 Lock:深度对比、使用场景及高级用法

&#x1f4a1; 前言 在多线程并发编程中&#xff0c;线程安全问题始终是开发者需要重点关注的核心内容之一。Java 提供了多种机制来实现同步控制&#xff0c;其中最常用的两种方式是&#xff1a; 使用 synchronized 关键字使用 java.util.concurrent.locks.Lock 接口&#xf…

Notepad++如何列选

在 Notepad 中&#xff0c;你可以通过 列模式&#xff08;Column Mode&#xff09; 进行垂直选择文本&#xff08;列选&#xff09;&#xff0c;以下是具体操作方法&#xff1a; 方法 1&#xff1a;键盘 鼠标列选 按住 Alt 键&#xff08;或 Alt Shift&#xff09;。 按住鼠…

华为OD机考-水仙花数Ⅰ-逻辑分析(JAVA 2025B卷)

import java.util.*; public static Integer get(int count,int c){if(count<3||count>7){return -1;}//存储每位数的最高位……最低位int[] arr new int[count];List<Integer> res new ArrayList<>();for(int i(int) Math.pow(10,count-1);i<(int) Math…

基于 STL+VMD 二次分解的 Informer-LSTM 并行预测模型详解与案例

一、背景与动机 在时间序列预测中,如电力负荷、风速、交通流量等复杂数据常表现为: 非线性:趋势+季节+突变+噪声 多尺度:高频扰动与低频变化共存 长时依赖:远期信息也影响当前预测 传统模型(如 ARIMA、LSTM)往往无法兼顾全局趋势建模与局部扰动感知,因此我们提出一种 …