这一篇要说说裁剪、压缩,这两个功能都要用到 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 实现上传。