前言css
日常咱们不太会关注图片流,都是拿来主义。html
浏览器加载,图片显示在一个容器里面,展现给用户。跨域
在网上冲浪了一下子,发现完整的文章甚少,仍是浪花太大蒙住了个人眼睛浏览器
需求缓存
我想要知道图片原始尺寸,(而不是经过css设置 图片百分比显示 这是另一种状况)app
我须要把图片的原始尺寸保存起来。须要在上传本地图片的时候咱们会接触到图片的原始尺寸大小函数
正文性能
首先了解 new Image() 建立一个图片示例
Image
是一个浏览器的原生构造函数,返回一个HTMLImageElement
对象的实例,即<img>
标签的实例。动画
var myImage = new Image(100, 100);
myImage.src = 'demo.jpg';
document.body.appendChild(myImage);
这段代码至关于,在body中新增了(比较经常使用)this
<img width="100" height="100" src="demo.jpg">
是时候展现他真正的技术了

Image 属性(我实在是太懒了,直接从MDN 截图下来)
属性是有一大堆的,不可能一个一个的使用演示。
回归正题,获取原始图片大小,主要用如下属性
实例
用代码效果来讲话,学以至用
//获取原始图片大小,用图片流 handleChangeUIImg(val){ var that = this var imgReady = (function () { var list = [], intervalId = null, // 用来执行队列 tick = function () { for (var i = 0; i < list.length; i++) {
list[i].end ? list.splice(i--, 1) : list[i](); }; !list.length && stop(); }, // 中止全部定时器队列 stop = function () { clearInterval(intervalId); intervalId = null; }; return function (url, ready, load, error) { var onready, width, height, newWidth, newHeight, img = new Image(); img.crossOrigin = '' //!容许图片跨域,很关键 img.src = url; // 若是图片被缓存,则直接返回缓存数据 if (img.complete) { ready.call(img); load && load.call(img); return; }; width = img.width; height = img.height; // 加载错误后的事件 img.onerror = function () { error && error.call(img); onready.end = true; img = img.onload = img.onerror = null; }; // 图片尺寸就绪 onready = function () { newWidth = img.width; newHeight = img.height; if (newWidth !== width || newHeight !== height ||newWidth * newHeight > 1024) { // 若是图片已经在其余地方加载可以使用面积检测 ready.call(img); onready.end = true; }; if(newWidth !== 0 && newHeight !== 0){ that.getImageColor(img) } }; onready(); // 彻底加载完毕的事件 img.onload = function () { // onload在定时器时间差范围内可能比onready快 // 这里进行检查并保证onready优先执行 !onready.end && onready(); load && load.call(img); // IE gif动画会循环执行onload,置空onload便可 img = img.onload = img.onerror = null; }; // 加入队列中按期执行 if (!onready.end) { list.push(onready); // 不管什么时候只容许出现一个定时器,减小浏览器性能损耗 if (intervalId === null) intervalId = setInterval(tick, 40); }; }; })();
Fannie式总结
亲测实例是能够获取到图片的原始大小的
可能格式不太对,由于是有删除其余的数据。
有时间再整理一下