摘要:原文還是在簡書上上傳本地圖片處理各種問題這是最近給公司寫一個(gè)項(xiàng)目,項(xiàng)目要求大概是這樣子上傳手機(jī)本地圖片,然后裁剪后加的需求能夠旋轉(zhuǎn)圖片,用于裁剪后面加的需求填寫各種文字,選擇顏色,之后把文字和個(gè)相關(guān)的圖片,水印到裁剪的圖片上,上傳服務(wù)器生成
原文還是在簡書上: html5 上傳本地圖片處理各種問題
這是最近給公司寫一個(gè)項(xiàng)目,項(xiàng)目要求大概是這樣子:
1.上傳手機(jī)本地圖片,然后裁剪(后加的需求)
2.能夠旋轉(zhuǎn)圖片,用于裁剪(后面加的需求)
3.填寫各種文字,選擇顏色,之后把文字和2個(gè)相關(guān)的圖片,水印到裁剪的圖片上,上傳服務(wù)器生成一個(gè)圖片地址,返回,分享出去。
功能就是大概上面這些,其他的也就是各種小功能,不提了,技術(shù)選型說下,整體上使用 Vue(包括 router,resource,webpack等等)
那么這幾個(gè)需求怎么做呢:
1、 本地上傳,使用 html5 的 File Api 拿到圖片的base64編碼,賦值給img的src(坑1,2),然后彈出一個(gè)圖層,進(jìn)行裁剪,最開始裁剪是在img的上面套一個(gè)div來進(jìn)行坐標(biāo)計(jì)算,計(jì)算完了使用canvas來截取圖片,然后取值(坑3)。
2、這個(gè)功能就是使用canvas的旋轉(zhuǎn)圖片解決,需要注意的是,旋轉(zhuǎn)的時(shí)候要保持橫縱比,而且要注意寬高的大?。?)。
3、使用canvas來疊加水印和圖片即可,主要是注意坐標(biāo)。
那么說說坑:
1、拿到src的base64編碼,看似沒有問題,實(shí)際上有個(gè)巨大的問題,很多圖片在手機(jī)上顯示為豎屏,但是拿到的base64編碼,直接賦值給img的src后,發(fā)現(xiàn)是橫屏的。最開始發(fā)現(xiàn)這種情況,以為是個(gè)別現(xiàn)象,最后不斷嘗試之后,發(fā)現(xiàn)是個(gè)非常普遍的情況,特別是IPhone手機(jī),而且還分你選擇的圖片文件夾,相冊和照片流同一張圖片,一個(gè)橫屏,一個(gè)豎屏。導(dǎo)致我完全不能理解這是為什么???基本一個(gè)下午耗在這個(gè)問題上了。
直到晚上回去,問我一個(gè)朋友IOS開發(fā)的大神,@葉孤城__,他告訴我,因?yàn)楝F(xiàn)在IPhone的攝像頭就是橫著的,手機(jī)里顯示豎屏的原因是ios自己做了處理,他們可以根據(jù)圖片的一個(gè)拍攝角度數(shù)值來判斷橫豎問題,但是這個(gè)數(shù)值在我們web端確拿不到,很是尷尬。那么怎么解決這個(gè)問題呢?? ------- 我使用的方案:旋轉(zhuǎn)圖片,可以讓用戶自己去主動旋轉(zhuǎn)圖片,選取角度。 還有另外一種解決方案,在坑2也用到,后面講。
2、除了這個(gè)橫屏之外,android手機(jī)有的上傳,選擇了圖片之后,沒有任何反應(yīng),我開始一度認(rèn)為原因是不支持html5的File Api,所以沒有顯示出上傳的圖片,后面就各種debugger,發(fā)現(xiàn)原因是沒有觸發(fā)Input標(biāo)簽的change事件,而且不管怎么樣都沒有辦法觸發(fā),為了解決這個(gè)問題,查閱了各種官方文檔和stackoverflow之后,發(fā)現(xiàn)可以給 type="file"的input添加兩個(gè)屬性來表示手機(jī)上傳圖片。
這樣添加了 accept 和 capture之后,有問題的android手機(jī),在選擇圖片的時(shí)候,有好幾個(gè)文件夾,可以選擇了,其中有的可以上傳,有的不行,經(jīng)常仔細(xì)的測試發(fā)現(xiàn),sd卡上的圖片是拿不到的,也就不會觸發(fā)change事件,因?yàn)闆]有root權(quán)限去拿文件數(shù)據(jù)。又是一個(gè)無解問題,因?yàn)槟愕膚eb在瀏覽器里面,權(quán)限就是低啊,(不得不吐槽下web的權(quán)限問題,媽蛋)怎么解決問題呢??? 繞過去,也就是說如果你的頁面是嵌套在你們公司自己App里面的,就讓App幫你,那么我們項(xiàng)目是微信傳播的,一定在微信瀏覽器里面,所以可以調(diào)用微信的JSSDK的選擇圖片接口,他是可以越過這些權(quán)限,而且還有一個(gè)好處,就是解決坑1的問題,他會處理橫屏問題,就是把看著豎屏,實(shí)際橫屏的上傳時(shí)都處理為豎屏,但是代價(jià)也不小,你要選擇圖片,拿到一個(gè)key,然后繼續(xù)調(diào)用sdk傳到微信的服務(wù)器,拿到一個(gè)serverid,這個(gè)id傳給自己的服務(wù)端,讓他們通過這個(gè)id,去微信下載圖片到自己的服務(wù)器,返回給你一個(gè)Url。過程很曲折,而且下載次數(shù)有限制(可以跟微信申請加載限制);
參考: 微信 js sdk 選擇圖片接口
3、我們繼續(xù)說坑,以上問題,解決了之后,就是裁剪了,開始我使用的方案是這樣子的,獲取到base64之后,賦值給一個(gè)img,然后在這個(gè)img上進(jìn)行框選移動,計(jì)算坐標(biāo)然后裁剪,pc端完全沒有任何問題,效率很高,但是放到微信上面測試,發(fā)現(xiàn)3個(gè)問題(媽蛋,手機(jī)端就是坑,一個(gè)功能,3個(gè)不同的問題),第一個(gè)問題,大家都知道現(xiàn)在手機(jī)像素高,圖片不小,上傳過來之后,base64也不小,放到img的src中其實(shí)就是內(nèi)存中了,導(dǎo)致整個(gè)微信特別容易崩潰(就是崩潰,他就崩潰了,微信就崩潰了---三遍),第二個(gè)問題,使用vue的on來綁定touch事件,響應(yīng)很慢,移動一點(diǎn)都不平滑,而且也會崩潰,沒錯(cuò),又崩潰了。第三個(gè)問題,旋轉(zhuǎn)要使用canvas轉(zhuǎn)化,先去圖片數(shù)據(jù),轉(zhuǎn)完后,在給圖片src賦值,很麻煩。
解決方案: 統(tǒng)一使用canvas,不要再用img,知道裁剪完成了,把img的base64拿到就行,而且導(dǎo)出的時(shí)候,使用jpeg不要是png,降低一些畫質(zhì),我覺得完全沒有影響,也就是圖片的裁剪,旋轉(zhuǎn)都是canvas,事件建議直接原生綁定。
4、旋轉(zhuǎn)的坑,這個(gè)的問題是我們必須保存住原始圖片的數(shù)據(jù),進(jìn)行canvas先旋轉(zhuǎn)然后drawImage,要不沒有旋轉(zhuǎn)出來,canvas自己的imageData,貌似沒有辦法旋轉(zhuǎn),我試了矩陣的方式好像都不行(也可能是自己數(shù)學(xué)不好!?。∪绻腥酥?,就demo)。
以上就是這次項(xiàng)目,遇到的各種大坑,其他都是小的地方,不過總體來說,完成了任務(wù),并且使用了新的技術(shù)Vue.js。Vue的component還是非常好用的,注意父子關(guān)系,props的繼承就沒問題了。
歡迎大家交流相關(guān)技術(shù), 如果對Vue感興趣,可以加QQ群: 364912432,240319632。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/49696.html
摘要:原文還是在簡書上上傳本地圖片處理各種問題這是最近給公司寫一個(gè)項(xiàng)目,項(xiàng)目要求大概是這樣子上傳手機(jī)本地圖片,然后裁剪后加的需求能夠旋轉(zhuǎn)圖片,用于裁剪后面加的需求填寫各種文字,選擇顏色,之后把文字和個(gè)相關(guān)的圖片,水印到裁剪的圖片上,上傳服務(wù)器生成 原文還是在簡書上: html5 上傳本地圖片處理各種問題 這是最近給公司寫一個(gè)項(xiàng)目,項(xiàng)目要求大概是這樣子:1.上傳手機(jī)本地圖片,然后裁剪(后加的需...
摘要:圖片數(shù)據(jù)繪制到先構(gòu)造對象,為,圖片之后繪制到的圖片文件數(shù)據(jù)繪制到還是先轉(zhuǎn)換成一個(gè),然后構(gòu)造對象,為,圖片之后繪制到利用上面的函數(shù),由對象得到格式的,再參考圖片數(shù)據(jù)繪制到轉(zhuǎn)換為對象并使用發(fā)送轉(zhuǎn)換為對象后,可以使用上傳圖像文件。 實(shí)現(xiàn)功能和適用業(yè)務(wù) 采集本地?cái)z像頭獲取攝像頭畫面,拍照保存,上傳服務(wù)器; 前端上傳圖片處理,展示,縮小,裁剪,上傳服務(wù)器 實(shí)現(xiàn)步驟 調(diào)取本地?cái)z像頭(get...
摘要:圖片數(shù)據(jù)繪制到先構(gòu)造對象,為,圖片之后繪制到的圖片文件數(shù)據(jù)繪制到還是先轉(zhuǎn)換成一個(gè),然后構(gòu)造對象,為,圖片之后繪制到利用上面的函數(shù),由對象得到格式的,再參考圖片數(shù)據(jù)繪制到轉(zhuǎn)換為對象并使用發(fā)送轉(zhuǎn)換為對象后,可以使用上傳圖像文件。 實(shí)現(xiàn)功能和適用業(yè)務(wù) 采集本地?cái)z像頭獲取攝像頭畫面,拍照保存,上傳服務(wù)器; 前端上傳圖片處理,展示,縮小,裁剪,上傳服務(wù)器 實(shí)現(xiàn)步驟 調(diào)取本地?cái)z像頭(get...
閱讀 1530·2021-11-22 13:54
閱讀 4460·2021-09-22 15:56
閱讀 1887·2021-09-03 10:30
閱讀 1391·2021-09-03 10:30
閱讀 2134·2019-08-30 15:55
閱讀 1912·2019-08-30 14:13
閱讀 2131·2019-08-29 15:19
閱讀 2425·2019-08-28 18:13