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
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/84836.shtml
英文地址,請注明出處:http://en.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)往往無法兼顧全局趨勢建模與局部擾動感知,因此我們提出一種 …