這一篇要說說裁剪、壓縮,這兩個功能都要用到 canvas 的能力,canvas 在 IE9 以上瀏覽器都支持良好,也爲 IE9 提供爲數很少的能夠進行文件操做的 API。javascript
<div id='box'></div>
const canvas = document.getElementById('box') const ctx = canvas.getContext('2d')
經過實例方法 drawImage
能夠在canvas 中繪製圖片。html
drawImage
接受的第一個參數描述以下:java
An element to draw into the context. The specification permits any canvas image source (CanvasImageSource), such as an HTMLImageElement, an HTMLVideoElement, an HTMLCanvasElement or an ImageBitmap.
可是 IE9 中沒法傳入一個加載了圖片的 IMG 元素。git
換種思路,在 IE9 中作如下兼容處理:github
先把圖片上傳,而後加載遠程圖片進行處理,可是碰到一些問題:canvas
或者直接上到 CDN (咱們用的是七牛),並把上傳後的 key 以及裁剪參數傳給後臺,經過後臺調用七牛的裁剪服務和持久化服務,可是問題又來了:跨域
總的來講,這些方案性價比不高!瀏覽器
兩種思路:安全
最後,都經過實例方法 drawImage
來進行裁剪。ide
github上有一個國人用 javascript 寫的無依賴的本地壓縮庫 localResizeIMG3。
也能夠繼續用 canvas 的實例方法 toDataURL
簡單實現
利用 flash 製做了一個swf 文件,在 IE9 中選擇圖片、讀取圖片,並輸出 base64 格式。
原本想把本地圖片地址傳給 swf 文件,讓它直接讀路徑,可是因爲安全問題,會被阻止,因此還得經過 flash 來選擇圖片
雖然被打臉,說幾個好處:
實現代碼參考:https://github.com/yannickcr/...
現實是殘酷的,七牛 CDN 上確實能找到一個古老的上傳 base64 格式圖片的服務,可是因爲服務是跨域的,而且要求在請求頭裏面攜帶參數,所以 IE9 中是沒法經過 Javascript 實現上傳。