CANVAS運用-對圖片的壓縮上傳(僅針對移動瀏覽器)

最近在移動端設計頭像上傳功能時,原本是以<input type="file">直接通過formData上傳,然而實際使用情況是:對于過大的圖片(高像素手機所拍攝的照片等)上傳時間過長會導致上傳失敗,而每次都上傳原始大小的圖片(后臺處理壓縮)十分影響用戶體驗,所以研究了一下通過canvas壓縮圖片并上傳的方法,以下是整理的一些思路和心得:

一、<input type="file">獲取本地圖片,并將圖片繪制到畫布中。此處的難點在于:由于瀏覽器的保護機制,無法直接獲取到本地文件的圖片路徑,所以需要將本地圖片編譯成base64格式再做上傳,代碼如下:

var result = document.getElementById("/* 出錯信息顯示塊 */");
var input = document.getElementById("/* 上傳文件標簽 */");if(typeof FileReader === 'undefined'){result.innerHTML = "<p class='warn'>抱歉,你的瀏覽器不支持 FileReader</p>";input.setAttribute('disabled','disabled');
}else{input.addEventListener('change',readFile,false);
}function readFile(){var file = this.files[0];if(!/image\/\w+/.test(file.type)){alert("請確保文件為圖像類型");return false;}var reader = new FileReader();reader.readAsDataURL(file);reader.onload = function(e){//  this.result 編譯后的圖像編碼,可直接用src顯示}
}

二、圖像在canvas中的處理

var c=document.getElementById("/* canvas標簽的id */");
var cxt=c.getContext("2d");
var img=new Image();
img.src=/* 獲取的圖片編碼地址 */;
var width = img.width;
var height = img.height;
dic = height / width;
c.width = 200;  //圖片壓縮的標準,這里是按照定款200px計算
c.height = 200 * dic;
cxt.clearRect(0,0,200,200*dic);
cxt.drawImage(img,0,0,200,200*dic);
var finalURL = c.toDataURL();  
//  最終得到的 finalURL 即為壓縮后的圖片編碼,可用來上傳或者直接生成img標簽

這里需要注意的幾點是:

1、本地調試時會有一個報錯,原因為跨域問題,需要再服務端調試;

2、canvas中的drawImage()方法具備圖像剪裁功能,但將圖像拉伸和剪裁同時寫入的話,會優先執行剪裁的方法;

3、使用AJAX上傳圖像編碼時,編碼內的加號會被轉成空格上傳導致后臺編譯失敗;

4、關于對圖片區域選擇上傳的方法尚在嘗試階段,后續會補上心得。

轉載于:https://www.cnblogs.com/liaojh/p/5209433.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/257670.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/257670.shtml
英文地址,請注明出處:http://en.pswp.cn/news/257670.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql重命名數據表稱方式_在MySQL中,使用()重命名數據表。_學小易找答案

【單選題】( )的上海文壇被稱為“張愛玲年”。【多選題】下列哪些是屬于共集放大電路的特點?()【閱讀理解】Passage Two Thailand is to ban smoking on some of the country’s most popular tourist beaches, with the prospect of up to a year in prison for those caught…

40_自定義泛型方法及其應用

java的泛型不同于C的模板方法那么強大。java的泛型只停留在編譯階段&#xff0c;編譯通過后泛型特征被擦除&#xff0c;主要因為保證jvm的效率。 用泛型知識&#xff0c;寫一個交換數組元素的方法&#xff08;此方法只適合于引用類型數組!因為int[]不會自動轉為Integer[]!&…

SQL Server代理(11/12):維護計劃作業

SQL Server代理是所有實時數據庫的核心。代理有很多不明顯的用法&#xff0c;因此系統的知識&#xff0c;對于開發人員還是DBA都是有用的。這系列文章會通俗介紹它的很多用法。 在這一系列的上一篇&#xff0c;我們看了使用代理帳戶模仿Windows安全上下文完成作業步驟的工作。大…

mysql select array_從數據庫select查詢出來的數組

PHP中提供了array_unique函數去除一維數組中的重復項&#xff0c;但是我們實際的項目開發中&#xff0c;從數據庫select查詢出來的數組經常是二維的&#xff1b;這里面可能有重復項&#xff0c;這就需要我們自己定義函數進行去除重復項。思路&#xff1a;1、首先獲取第二維數組…

shell中字分隔的妙用:變量IFS

shell把每個 $IFS 字符對待成一個分隔符&#xff0c;且基于這些字符把其他擴展的結果分割。如果 IFS 未設置&#xff0c;或者它的值正好是 “‘<space><tab><newline>’”&#xff0c;那么任何IFS 字符的序列就送往分割字。自寫一個簡單的腳本&#xff1a;#!…

老子《道德經》第三十五章

上士聞道&#xff0c;勤而行之&#xff1b;中士聞道&#xff0c;若存若亡&#xff1b;下士聞道&#xff0c;大笑之。 不笑不足以為道。 故建言有之&#xff1a;明道若昧&#xff0c;進道若退&#xff0c;夷道若颣。 上德若谷&#xff0c;大白若辱&#xff0c;廣德若不足&#x…

php 通過類名獲取類的文件地址

$reflector new ReflectionClass("Child"); $fn $reflector->getFileName(); return dirname($fn);轉載于:https://www.cnblogs.com/bushe/p/5215718.html

大數據告訴你,電商都把假貨發給誰?

“看人下刀”&#xff0c;電商玩得更科幻 內幕&#xff1a;你在網上買件大牌化妝品&#xff0c;在訂單提交→發貨之前&#xff0c;系統會查詢分析你在全平臺的購物數據(大數據內部共享)&#xff1a;購買均價&#xff0c;常購品牌&#xff0c;退貨率。 如果你同類產品消費傾向絕…

mysql取得列類型_Mysql列類型

數值型整型&#xff1a;tinyint:微小的列類型&#xff0c;1個字節&#xff0c;默認有符號&#xff0c;存儲范圍&#xff1a;-128--127可選屬性&#xff1a;tingyint(M) unsigned zerofillM:寬度(在0填充(zerofill)時才有效),只是顯示效果&#xff0c;不影響實際數據的存儲范圍;…

XtraBackup全備與增量備份

一、XtraBackup安裝 下載地址&#xff1a;http://www.percona.com/downloads/XtraBackup/XtraBackup-2.2.8/source/ 安裝步驟&#xff1a; How to build XtraBackup on Linux Prerequisites -------------$ yum install cmake gcc gcc-c libaio libaio-devel automake autocon…

《大話設計模式》 國外資料

It is not easy to remember all design patterns. Here are some stories about design patterns which might help! Creational Singleton – Only one president in AmericaFactory – A factory that produces humanAbstract Factory – An abstract factory to produce CP…

DHCP基本配置

第一步 安裝 DHCP [rootlocalhost ~]# yum install dhcp dhcp-devel DHCP文件簡介 /etc/dhcp/dhcpd.conf #主配置文件&#xff0c;除了括號那欄&#xff0c;其它都要結尾 ; 這樣的分號 /var/lib/dhcpd/dhcpd.leases #IP地址租約在這里 第二步 配置 DHCP 主文件配置[rootlocalho…

python arcgis 圖書_arcgis python

本書作者是GIS發方面的知名作者&#xff0c;曾著有《JavaScript構建Web和ArcGIS Server應用實戰》(Building Web and Mobile ArcGIS Server Applications with JavaScript)一書。 本書內容易學易懂&#xff0c;幫助讀者成為GIS發高手。《面向ArcGIS的Python腳本編程》是一本指導…

scrapy 讓指定的spider執行指定的pipeline

處理scrapy中包括多個pipeline時如何讓spider執行制定的pipeline管道&#xff11;:創建一個裝飾器from scrapy.exceptions import DropItemimport functools當有多個pipeline時,判斷spider如何執行指定的管道 def check_spider_pipeline(process_item_method): functools.wr…

五大常用算法之三:貪心算法

一、基本概念&#xff1a; 所謂貪心算法是指&#xff0c;在對問題求解時&#xff0c;總是做出在當前看來是最好的選擇。也就是說&#xff0c;不從整體最優上加以考慮&#xff0c;他所做出的僅是在某種意義上的局部最優解。 貪心算法沒有固定的算法框架&#xff0c;算法設計的關…

python學習筆記列表和元組(三)

列表&#xff08;list&#xff09;是Python以及其他語言中最常用到的數據結構之一。Python使用使用中括號 [ ] 來解析列表。列表是可變的&#xff08;mutable&#xff09;——可以改變列表的內容。對應操作&#xff1a;1、查&#xff08;[]切片操作&#xff09; name [tom,張三…

python 函數的調用的時候參數的傳遞_Python Unittest;如何獲取調用函數時傳遞的參數?...

我試圖做一個單元測試來檢查這個python函數(dispatch)是否傳遞了正確的參數來處理\u結果。在在dispatch中調用處理“unu result”的函數時&#xff0c;有沒有方法“劫持”輸入參數&#xff1f;我沒有在調度函數中修改代碼的權限。在以下是單元測試中的want預覽&#xff1a;impo…

博客園客戶端UAP開發隨筆 -- App連接云端內容的橋梁:WebView

當你辛苦的從網上爬下來一篇文章之后&#xff0c;怎么在你的應用內展示這些包含HTML標記的文章&#xff1f;如果你使用的是Javascript開發應用&#xff0c;恭喜你&#xff0c;直接塞進頁面就可以了&#xff0c;同時說明你很熟悉頁面開發&#xff0c;而現在windows也支持這種方式…

listview與gridview點擊時的背景色取消

在布局文件里面的listview控件添加以下代碼android:listSelector"#00000000" //透明色 可以自己選擇點擊顏色轉載于:https://www.cnblogs.com/yulook/p/5219932.html

解決yum命令失效,vim: command not found

安裝python3模塊時&#xff0c;yum命令無法執行錯誤:**/usr/bin/yum: line 3: import: command not found/usr/bin/yum: line 4: try:: command not found/usr/bin/yum: line 5: import: command not found/usr/bin/yum: line 6: except: command not found/usr/bin/yum: line …