超碰人人人人人,亚洲AV午夜福利精品一区二区,亚洲欧美综合区丁香五月1区,日韩欧美亚洲系列

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

[點(diǎn)晴永久免費(fèi)OA]【JavaScript】JS實(shí)現(xiàn)圖片壓縮

admin
2023年5月6日 12:17 本文熱度 1663

涉及到 JS 的圖片壓縮,需要用到 Canvas 的繪圖能力,通過(guò)調(diào)整圖片的分辨率或者繪圖質(zhì)量來(lái)達(dá)到圖片壓縮的效果,實(shí)現(xiàn)思路如下:

  • 獲取上傳 Input 中的圖片對(duì)象 File

  • 將圖片轉(zhuǎn)換成 base64 格式

  • base64 編碼的圖片通過(guò) Canvas 轉(zhuǎn)換壓縮,這里會(huì)用到的 Canvas 的 drawImage 以及 toDataURL 這兩個(gè) Api,一個(gè)調(diào)節(jié)圖片的分辨率的,一個(gè)是調(diào)節(jié)圖片壓縮質(zhì)量并且輸出的,后續(xù)會(huì)有詳細(xì)介紹

  • 轉(zhuǎn)換后的圖片生成對(duì)應(yīng)的新圖片,然后輸出

優(yōu)缺點(diǎn)介紹

Canvas 壓縮的方式也有著自己的優(yōu)缺點(diǎn):

  • 優(yōu)點(diǎn):實(shí)現(xiàn)簡(jiǎn)單,參數(shù)可以配置化,自定義圖片的尺寸,指定區(qū)域裁剪等等。

  • 缺點(diǎn):只有 jpeg 、webp 支持原圖尺寸下圖片質(zhì)量的調(diào)整來(lái)達(dá)到壓縮圖片的效果,其他圖片格式,僅能通過(guò)調(diào)節(jié)尺寸來(lái)實(shí)現(xiàn)

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<input id="upload" type="file"/>
 
<script>
    const FILETYPES = ["image/png", "image/jpg", "image/jpeg"]; // 受支持的文件類型
    const MAX_FILESIZE = 1024 * 1024 * 3; // 1024 * 1024 為1M
    const MAX_FILESIZESTRING = "3M"; // 文件大小字符
    const COMPRESSRATIO = .5; // 壓縮比例 0 - 1
    const upload = document.queryselector("#upload");
 
    const imageToBase64 = (file, callback) => {
        const reader = new FileReader();
        reader.readAsDataURL(file); // 文件轉(zhuǎn)base64
        reader.addEventListener("load", (e) => {
            callback && callback(e.target.result);
        });
    };
 
    const compress = (originalImage, compressRatio = 1, callback) => {
        const image = new Image();
        image.src = originalImage;
        // document.body.appendChild(image); // 原圖預(yù)覽
 
        /* 監(jiān)聽圖片的load事件 */
        image.addEventListener("load", function () {
            let [sizeRatio, maxWidth, maxHeight] = [0, 1024, 1024]; // 圖片壓縮寬高比例和最大寬高
            let [imageWidth, imageHeight] = [this.naturalWidth, this.naturalHeight]; // 圖片實(shí)際寬高
            let compressFlag = false; // 圖片是否需要壓縮
 
            // 如果圖片寬度大于最大寬度就等比壓縮圖片的高度
            if (imageWidth > maxWidth) {
                compressFlag = true;
                sizeRatio = imageWidth / maxWidth;
                maxHeight = imageHeight / sizeRatio;
            }
 
            // 如果圖片高度大于最大高度就等比壓縮圖片的寬度
            if (imageHeight > maxHeight) {
                compressFlag = true;
                sizeRatio = imageHeight / maxHeight;
                maxWidth = imageWidth / sizeRatio;
            }
 
            // 如果不需要壓縮
            if (!compressFlag) {
                maxWidth = imageWidth;
                maxHeight = imageHeight;
            }
 
            // 使用canvas壓縮圖片
            const canvas = document.createElement("canvas");
            const ctx = canvas.getContext("2d");
 
            canvas.setAttribute("id", "canvas");
            canvas.width = maxWidth;
            canvas.height = maxHeight;
            // document.body.appendChild(canvas); // canvas預(yù)覽
            ctx.clearRect(0, 0, maxWidth, maxHeight); // 清除畫布內(nèi)所有像素
            ctx.drawImage(image, 0, 0, maxWidth, maxHeight); // canvas繪制當(dāng)前圖片
            const compressImage = canvas.toDataURL("image/jpeg", compressRatio); // 設(shè)置壓縮類型和壓縮比例獲取壓縮后的文件
 
            callback && callback(compressImage);
        });
 
    }
 
    upload.addEventListener("change", function (e) {
        const [file] = e.target.files;
        if (!file) this.value = ""; // file為空就阻止向下執(zhí)行
        const {type: fileType, size: fileSize} = file; // 獲取文件類型和大小
        // 檢查是否支持的文件類型
        if (!FILETYPES.includes(fileType)) {
            this.value = "";
            alert(`不支持${fileType}類型文件`);
            return;
        }
        // 檢查文件大小
        if (fileSize > MAX_FILESIZE) {
            this.value = "";
            alert(`文件不能超過(guò)${MAX_FILESIZESTRING}`);
            return;
        }
 
        imageToBase64(file, (originalImage) => {
            compress(originalImage, COMPRESSRATIO, (compressImage) => {
                const _img = new Image();
                _img.src = compressImage;
                const download = document.createElement("a");
                download.href = compressImage;
                download.innerText = "點(diǎn)擊保存";
                download.setAttribute("download", "demo.jpg");
                document.body.appendChild(download);
                document.body.appendChild(_img); // 壓縮后的圖片預(yù)覽
            });
        });
    })
</script>
</body>
</html>

該文章在 2023/5/6 12:17:13 編輯過(guò)
關(guān)鍵字查詢
相關(guān)文章
正在查詢...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved