在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美

當前位置:雨林木風下載站 > 網(wǎng)頁設計教程 > 詳細頁面

基于vue下input完成圖片上傳,壓縮,拼接以及旋轉(zhuǎn)的代碼詳細說明

基于vue下input完成圖片上傳,壓縮,拼接以及旋轉(zhuǎn)的代碼詳細說明

更新時間:2025-12-08 文章作者:未知 信息來源:網(wǎng)絡 閱讀次數(shù):

網(wǎng)頁的本質(zhì)就是超級文本標記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關接口、組件等),可以創(chuàng)造出功能強大的網(wǎng)頁。因而,超級文本標記語言是萬維網(wǎng)(Web)編程的基礎,也就是說萬維網(wǎng)是建立...
網(wǎng)頁的本質(zhì)就是超級文本標記語言,通過結(jié)合使用其他的Web技術(shù)(如:腳本語言、公共網(wǎng)關接口、組件等),可以創(chuàng)造出功能強大的網(wǎng)頁。因而,超級文本標記語言是萬維網(wǎng)(Web)編程的基礎,也就是說萬維網(wǎng)是建立在超文本基礎之上的。超級文本標記語言之所以稱為超文本標記語言,是因為文本中包含了所謂“超級鏈接”點。
本篇文章給大家?guī)淼膬?nèi)容是關于php隊列的實現(xiàn)代碼介紹,有一定的參考價值,有需要的朋友可以參考一下,希望對你有所幫助。

作為一名前端工作人員,相信大家在開發(fā)系統(tǒng)的時候,經(jīng)常有遇到需要這么一種需求,就是需要為用戶保存上傳的圖片,很多小白遇到這個問題的時候,都會虎軀一震,以為會是一個棘手的問題,當你讀完這篇文章的時候,你會發(fā)現(xiàn)都是你瞎操作了,真相就是這么簡單,下面進入正題:

圖片文件上傳

現(xiàn)在很多項目實現(xiàn)在系統(tǒng)內(nèi)保存圖片,大多數(shù)只是在系統(tǒng)數(shù)據(jù)庫內(nèi)保存對應圖片的url,而實際的圖片資源會放在阿里等圖片服務器上,當然,也有一些項目會選擇在自己的數(shù)據(jù)庫中保存圖片base64格式的字符串,下面講一些這兩種方法的具體實現(xiàn),實現(xiàn)以一個vue實例來說明:

2943304792-5bf12768bb2c7_articlex.png

首先,我們先要從用戶那里獲取圖片資源,這個時候,我們需要用到html的<input>標簽,type值為file,指定input標簽為文件類型的表單輸入,并將其 accept屬性設置為"image/*",指定只接受圖片資源的文件;

<input type="file" accept="image/*" />

接下來,我們就要獲取用戶選擇的文件,當用戶選擇完文件的時候,就會觸發(fā)input標簽的change事件,我們可以通過監(jiān)聽該事件,并獲取事件對象event,來獲取圖片文件:

 <input accept="image/*" style="display: none;" :name="'img-'+index" type="file" :id="'img-'+index"
  @change="fileChange($event,index)"/>

當點擊獲取文件后,我們可以通過$event對象,獲取$event.target.files[0]來獲取圖片資源文件對象,至于為什么要加索引值,是因為文件上傳input表單是支持多文件上傳的,只需要在input標簽上增加multiple屬性;我們可以看看下圖文件對象的一些屬性:

2161590420-5bf2db55c718c_articlex.png

觀察后發(fā)現(xiàn),文件對象中存在一個size屬性,表明圖片的大小,我們可以通過驗證該屬性的值是否為空,來達到檢驗文件是否已經(jīng)被我們獲取到指定操作;

fileChange(el, index) {
    if (!el.target.files[0].size) return;
}

至此,我們已經(jīng)獲取到我們想要的文件對象,接下來,我們實現(xiàn)圖片壓縮功能,命名為compress函數(shù):

圖片壓縮

首先,我們要對我們的圖片資源進行壓縮,第一步肯定是獲取圖片資源吶,獲取后對其簡單的校驗;

 compress(event) {
        var file = event.target.files;
        var reader = new FileReader(), imgFile = file[0];
        if (imgFile.type.indexOf('image') == 0) {
          reader.readAsDataURL(imgFile);
        } else {
          this.$Message.infor('文件類型僅為圖片')
        }
 }

這里可能有些人對FileReader對象不了解,F(xiàn)ileReader 對象允許Web應用程序異步讀取存儲在用戶計算機上的文件(或原始數(shù)據(jù)緩沖區(qū))的內(nèi)容,使用 File 或 Blob 對象指定要讀取的文件或數(shù)據(jù),這里我們主要是用于監(jiān)聽onload來判斷是否讀取完成,讀取完成時,我們把讀取的結(jié)果賦值給我們新創(chuàng)建的Image對象,作為后面壓縮的對象;這是時候,我們會發(fā)現(xiàn),我們讀取后的結(jié)果其實是一個base64格式的字符串
(很長..,我就意思意思)

1673270581-5bf2e13fec364_articlex.png

此時,我們會發(fā)現(xiàn),base64的字符串在這里就出現(xiàn)了,它可以作為一個值復制給<img>標簽的src屬性,同樣可以達到渲染圖片的目標,因此也有人選擇保存該格式的圖片;但是著并非主流的方式,同時也會造成我們數(shù)據(jù)庫過于冗余;

 compress(event) {
        var file = event.target.files;
        var reader = new FileReader(), imgFile = file[0];
        if (imgFile.type.indexOf('image') == 0) {
          reader.readAsDataURL(imgFile);
        } else {
          this.$Message.infor('文件類型僅為圖片')
        }
        let img = new Image();
        reader.onload = function (e) {
          img.src = e.target.result;
        };
 }

圖片進行壓縮,我們主要是利用canvas是實現(xiàn)該功能,通過canvas.getContext('2d').drawImage()方法重新繪制圖片,并利用canvas.toDataURL(type, encoderOptions)方法返回一個包含圖片展示的 dataURI,type為圖片格式,encoderOptions為圖片的清晰度,0到1遞增,這個壓縮的過程不難理解,思路就是獲取圖片的高寬,計算其像素大小,并與以一個自己設定的界限值進行比較,來看一下我們大小是否需要壓縮,如例子中的ratio表示圖片寬高的壓縮比例 ,我們是可以實現(xiàn)不改寬高來修改圖片的文件大小,通過drawImage(image, sx, sy, sWidth, sHeight, dx, dy, dWidth, dHeight)重新繪制圖片,他可以傳進九個參數(shù),分別代表著繪制到上下文的元素,源圖像的矩形選擇框的左上角 X 坐標,源圖像的矩形選擇框的左上角 Y 坐標,源圖像的矩形選擇框的寬度,源圖像的矩形選擇框的高度,目標畫布的左上角在目標canvas上 X 軸的位置,目標畫布的左上角在目標canvas上 Y 軸的位置,在目標畫布上繪制圖像的寬度,在目標畫布上繪制圖像的高度;

4235872887-5bf2e7f239ac5_articlex.png

整個函數(shù)實現(xiàn)如下:

compress(event) {
        var file = event.target.files;
        var reader = new FileReader(), imgFile = file[0];
        if (imgFile.type.indexOf('image') == 0) {
          reader.readAsDataURL(imgFile);
        } else {
          this.$Message.infor('文件類型僅為圖片')
        }
        let img = new Image();
        reader.onload = function (e) {
          img.src = e.target.result;
        };
        var imgP = new Promise((resolve, reject) => {
          img.onload = () => {
            var canvas = document.createElement("canvas");
            var ctx = canvas.getContext('2d');
            //    瓦片canvas
            var tCanvas = document.createElement("canvas");
            var tctx = tCanvas.getContext("2d");
            var initSize = img.src.length;
            var width = img.width;
            var height = img.height;
            //圖片像素大于400萬像素,計算壓縮到400萬以下
            var ratio;
            if ((ratio = width * height / 4000000) > 1) {
              ratio = Math.sqrt(ratio);
              width /= ratio;
              height /= ratio;
            } else {
              ratio = 1;
            }
            canvas.width = width;
            canvas.height = height;
            ctx.fillStyle = "#fff";
            ctx.fillRect(0, 0, canvas.width, canvas.height);
            //如果圖片太大則使用瓦片繪制
            var count;
            if ((count = width * height / 1000000 > 1)) {
              count = ~~(Math.sqrt(count) + 1);//計算分成的瓦片數(shù)
              var nw = ~~(width / count);
              var nh = ~~(height / count);
              tCanvas.width = nw;
              tCanvas.height = nh;
              for (var i = 0; i < count; i++) {
                for (var j = 0; j < count; j++) {
                  tctx.drawImage(img, i * nw * ratio, j * nh * ratio, nw * ratio, nh * ratio, 0, 0, nw, nh);
                  ctx.drawImage(tCanvas, i * nw, j * nh, nw, nh)
                }
              }
            } else {
              ctx.drawImage(img, 0, 0, width, height)
            }
            //進行最小壓縮
            var ndata = canvas.toDataURL('image/jpeg', 0.3);
            tCanvas.width = tCanvas.height = canvas.width = canvas.height = 0;
            resolve(ndata)
          }
        })
        return Promise.all([imgP])
      }

圖片拼接

需要注意的一點了,上面壓縮的過程使用了瓦片繪制,可能會導致拼接過程中不緊湊而產(chǎn)生一條間隙,這個只需要調(diào)整一下繪制瓦片的坐標位置即可,該思想同樣可以用于處理圖片拼接的問題,可按照上面思路進行拼接,這里就不再舉例子說明了,瓦片繪制就是圖片拼接的過程;

圖片旋轉(zhuǎn)

壓縮和拼接都講完啦,在對圖片進行處理,大家都有自己的見解了,或許你們還會這么說,那如果我上傳圖片的時候,像把那些橫著排的照片,也放成豎起來,要怎么處理,竟調(diào)整圖片放置的方向,該怎么處理,這就需要用到canvas的rotate方法去實現(xiàn)了,老方法,我們先獲取圖片對象,因為之前的壓縮是放回一個promise對象,data參數(shù)為img的base64格式,所以我們把旋轉(zhuǎn)函數(shù)的參數(shù)定義為圖片來源;

rotate(imgData) {
        var img = new Image();
        img.src = imgData;
        var imgR = new Promise((resolve, reject) => {
         img.onload = ()=>{
            console.log(img.width)
             console.log(img.naturalWidth)
          }
        })
      },

這里需要注意的是,每次我們新建一個image對象,想要獲取其一些響應的屬性值,一定要在onload方法中,確保圖片已經(jīng)加載完畢,上面的console中輸出了兩個值,width和naturalWidth,在某中條件下,他們會是相等的,比如我們上面,也會存在不一致的時候,因為naturalWidth返回的依然是圖片的真實尺寸,而width返回的是給img標簽規(guī)定的尺寸,所以我們需要獲取的是naturalWidth;

rotate(imgData) {
        var img = new Image();
        img.src = imgData;
        var imgR = new Promise((resolve, reject) => {
          img.onload = () => {
            let degree = 0, drawHeight, drawWidth;
            drawHeight = img.naturalHeight;
            drawWidth = img.naturalWidth;
            let maxSide = Math.max(drawWidth, drawHeight);
            if (maxSide === drawWidth) {//判斷需要旋轉(zhuǎn)的角度
              degree = 90;
            } else {
              degree = 360;
            }
            var canvas = document.createElement('canvas');
            canvas.width = drawWidth;
            canvas.height = drawHeight;
            var context = canvas.getContext('2d');
            context.translate(drawWidth/2,drawHeight/2)//這一行和下下一行的作用是修改選擇中心
            context.rotate(degree*Math.PI/180);//旋轉(zhuǎn)圖片
            context.translate(-drawWidth/2,-drawHeight/2)//這一行和上上一行的作用是修改選擇中心
            context.drawImage(img, 0, 0, drawWidth, drawHeight);
            var ndata = canvas.toDataURL('image/jpeg', 1);
            context.width = context.height = 0;
            resolve(ndata)

          }
        })

        return Promise.all([imgR])
      }

旋轉(zhuǎn)效果如下,寬大于高的,即是橫排的圖片,就會發(fā)生旋轉(zhuǎn);

4235872887-5bf2e7f239ac5_articlex.png

總結(jié)

在vue下利用canvas實現(xiàn)上述功能后,發(fā)現(xiàn)了canvas在圖片處理這塊的強大功能,對于前端上傳圖片性能的優(yōu)化會有很大的幫助;經(jīng)過上述的時間,發(fā)現(xiàn)要實現(xiàn)用戶的上傳圖片前的裁剪功能,以及可以利用canvas來實現(xiàn),主要是利用drawImage控制裁剪的長度,起點坐標就可以實現(xiàn),著實好用!

以上就是基于vue下input實現(xiàn)圖片上傳,壓縮,拼接以及旋轉(zhuǎn)的代碼詳解的詳細內(nèi)容,更多請關注php中文網(wǎng)其它相關文章!


網(wǎng)站建設是一個廣義的術(shù)語,涵蓋了許多不同的技能和學科中所使用的生產(chǎn)和維護的網(wǎng)站。

溫馨提示:喜歡本站的話,請收藏一下本站!

本類教程下載

系統(tǒng)下載排行

在线看毛片视频-国产免费av在线-欧美日韩一区二区三区-国产成人无码av在线播放无广告-亚洲人va欧美va人人爽-国产第一草草-西班牙黄色片-四虎在线网站8848-最新av片免费网站入口-东京热无码中文字幕av专区-日本大人吃奶视频xxxx-欧美精品一区二区三区四区五区-国产片天天弄-国产免费内射又粗又爽密桃视频-欧美爱爱网站-日韩v欧美
  • <li id="86scu"><menu id="86scu"></menu></li>
    <li id="86scu"></li>
    <button id="86scu"></button>
  • <s id="86scu"></s><button id="86scu"><menu id="86scu"></menu></button>
  • 成人3d动漫一区二区三区| 不卡av免费在线| 三日本三级少妇三级99| 97xxxxx| 91免费黄视频| 欧美国产视频一区| 精品国产三级a∨在线| 国产高清999| 欧美视频亚洲图片| 亚洲色图偷拍视频| www.日本久久| 51自拍视频在线观看| 美女黄色片网站| 亚洲AV无码成人精品一区| 国产精品中文久久久久久| 亚洲人视频在线| 国产xxxxhd| 成年丰满熟妇午夜免费视频 | 国产又爽又黄ai换脸| 久久精品久久99| 国产精品h视频| 在线视频一二三区| 日韩欧美不卡在线| 国产精品宾馆在线精品酒店| 国产l精品国产亚洲区久久| 免费高清在线观看免费| 免费看污污网站| 国产精品亚洲天堂| 久久久久99精品成人片| 18禁男女爽爽爽午夜网站免费| 欧美伦理片在线看| 国产精品igao网网址不卡| 国产一区二区三区乱码| 国产免费黄视频| 国产不卡的av| 久草热视频在线观看| 国产三级三级看三级| www.xxx麻豆| 亚洲精品一二三四五区| 日本福利视频在线观看| 日本美女高潮视频| www.99riav| 中文字幕成人在线视频| 国产精品成人久久电影| 久久精品视频在线观看免费| 久久综合色视频| 99精品视频免费版的特色功能| 丰满人妻中伦妇伦精品app| 国产精品夜夜夜爽张柏芝| 欧美一级黄色影院| 国产日韩亚洲欧美在线| 一级片黄色免费| 亚洲高清在线免费观看| 欧美,日韩,国产在线| 欧美日韩一级在线| 欧美大尺度做爰床戏| 欧美日韩亚洲一| 日本a在线天堂| 999久久久精品视频| 一本久道综合色婷婷五月| 欧洲精品在线播放| 免费观看黄色的网站| 天天影视色综合| 九色porny91| 国产午夜福利视频在线观看| 加勒比成人在线| 91午夜在线观看| 国产一区二区三区在线免费| xxx中文字幕| 午夜在线视频免费观看| 手机看片日韩国产| 国产四区在线观看| 国产对白在线播放| 三上悠亚免费在线观看| 先锋影音男人资源| 欧美视频在线第一页| 欧美一区二区三区综合| 国产内射老熟女aaaa| av在线免费观看国产| 波多野结衣 作品| 国产小视频免费| 丁香色欲久久久久久综合网| 国产无限制自拍| 131美女爱做视频| 91视频 -- 69xx| 精品久久久噜噜噜噜久久图片| 精品久久久久久久免费人妻| 777视频在线| 影音先锋男人的网站| 妺妺窝人体色777777| 国产免费人做人爱午夜视频| 丝袜制服一区二区三区| 国产又粗又大又爽的视频| 黄网站色视频免费观看| 99999精品视频| 午夜天堂在线视频| 黄色一级大片免费| 中文字幕欧美人妻精品一区| 婷婷激情5月天| 免费国产a级片| 超碰在线播放91| 亚洲国产一二三精品无码| 免费成人午夜视频| 男生操女生视频在线观看| 日韩精品在线观看av| 成人性生交免费看| 真人做人试看60分钟免费| 国产精品一区二区羞羞答答| 欧美一级黄色录像片| 国产自偷自偷免费一区 | 日日躁夜夜躁aaaabbbb| 日韩亚洲欧美视频| 天天干天天综合| 国内性生活视频| av磁力番号网| 午夜剧场高清版免费观看| www.99热这里只有精品| 国产三级中文字幕| 欧美日韩怡红院| 黄色免费观看视频网站| 国产树林野战在线播放| www.com黄色片| 国产xxxxx视频| 国产va亚洲va在线va| 成人在线观看毛片| 成年人三级黄色片| 无码无遮挡又大又爽又黄的视频| 青青青在线观看视频| 性鲍视频在线观看| 亚洲日本黄色片| 九色91popny| 妓院一钑片免看黄大片| 欧美a在线视频| 欧美二区在线视频| 日本在线xxx| 国产黄视频在线| 亚洲国产精品久久久久爰色欲| 日本aa在线观看| 日韩五码在线观看| 午夜免费福利小电影| 毛片在线视频播放| 日本wwww视频| 亚洲欧美激情网| 五月天婷婷亚洲| 最近中文字幕免费mv| 精品国产一区二区三区在线| 97在线免费视频观看| 久久久久久久久久久99| 18禁免费无码无遮挡不卡网站| 男人的天堂狠狠干| 天天摸天天碰天天添| 国产一级特黄a大片免费| 欧美激情国内自拍| 18视频在线观看娇喘| 国产一区二区三区乱码| 日韩av一二三四区| 爱情岛论坛vip永久入口| 国产永久免费网站| 青青视频免费在线| 欧美日韩国产精品激情在线播放| 男女视频一区二区三区| 成人综合久久网| 99精品一级欧美片免费播放| av女优在线播放| 特级丰满少妇一级| 国产一级不卡视频| 日本黄网站免费| 在线无限看免费粉色视频| 成年人三级视频| 欧美精品aaaa| 精品视频在线观看一区二区| 日韩毛片在线免费看| 国产精品免费看久久久无码| 国产精品无码专区av在线播放 | 午夜av中文字幕| 精品视频免费在线播放| 99九九精品视频| 色综合av综合无码综合网站| 艳母动漫在线观看| 杨幂毛片午夜性生毛片 | 少妇高清精品毛片在线视频| 中文字幕超清在线免费观看| 日韩在线xxx| 亚洲色成人www永久在线观看| 2025韩国理伦片在线观看| 俄罗斯av网站| 亚洲啊啊啊啊啊| 激情在线观看视频| 一级黄色香蕉视频| 毛片在线播放视频| 99er在线视频| 国产资源中文字幕| 蜜臀av免费观看| 日日碰狠狠丁香久燥| 日韩av综合在线观看| 日韩成人三级视频| 波多野结衣三级在线| √天堂资源在线| 日韩 欧美 自拍| 久久精品一二三四|