forked from blueimp/JavaScript-Load-Image
-
Notifications
You must be signed in to change notification settings - Fork 0
/
load-image.js
121 lines (113 loc) · 4.07 KB
/
load-image.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* JavaScript Load Image 1.2.1
* https://github.com/blueimp/JavaScript-Load-Image
*
* Copyright 2011, Sebastian Tschan
* https://blueimp.net
*
* Licensed under the MIT license:
* http://www.opensource.org/licenses/MIT
*/
/*jslint nomen: true */
/*global window, document, URL, webkitURL, Blob, File, FileReader, define */
(function ($) {
'use strict';
// Loads an image for a given File object.
// Invokes the callback with an img or optional canvas
// element (if supported by the browser) as parameter:
var loadImage = function (file, callback, options) {
var img = document.createElement('img'),
url,
oUrl;
img.onerror = callback;
img.onload = function () {
if (oUrl && !(options && options.noRevoke)) {
loadImage.revokeObjectURL(oUrl);
}
callback(loadImage.scale(img, options));
};
if ((window.Blob && file instanceof Blob) ||
// Files are also Blob instances, but some browsers
// (Firefox 3.6) support the File API but not Blobs:
(window.File && file instanceof File)) {
url = oUrl = loadImage.createObjectURL(file);
} else {
url = file;
}
if (url) {
img.src = url;
return img;
}
return loadImage.readFile(file, function (url) {
img.src = url;
});
},
// The check for URL.revokeObjectURL fixes an issue with Opera 12,
// which provides URL.createObjectURL but doesn't properly implement it:
urlAPI = (window.createObjectURL && window) ||
(window.URL && URL.revokeObjectURL && URL) ||
(window.webkitURL && webkitURL);
// Scales the given image (img or canvas HTML element)
// using the given options.
// Returns a canvas object if the browser supports canvas
// and the canvas option is true or a canvas object is passed
// as image, else the scaled image:
loadImage.scale = function (img, options) {
options = options || {};
var canvas = document.createElement('canvas'),
width = img.width,
height = img.height,
scale = Math.max(
(options.minWidth || width) / width,
(options.minHeight || height) / height
);
if (scale > 1) {
width = parseInt(width * scale, 10);
height = parseInt(height * scale, 10);
}
scale = Math.min(
(options.maxWidth || width) / width,
(options.maxHeight || height) / height
);
if (scale < 1) {
width = parseInt(width * scale, 10);
height = parseInt(height * scale, 10);
}
if (img.getContext || (options.canvas && canvas.getContext)) {
canvas.width = width;
canvas.height = height;
canvas.getContext('2d')
.drawImage(img, 0, 0, width, height);
return canvas;
}
img.width = width;
img.height = height;
return img;
};
loadImage.createObjectURL = function (file) {
return urlAPI ? urlAPI.createObjectURL(file) : false;
};
loadImage.revokeObjectURL = function (url) {
return urlAPI ? urlAPI.revokeObjectURL(url) : false;
};
// Loads a given File object via FileReader interface,
// invokes the callback with a data url:
loadImage.readFile = function (file, callback) {
if (window.FileReader && FileReader.prototype.readAsDataURL) {
var fileReader = new FileReader();
fileReader.onload = function (e) {
callback(e.target.result);
};
fileReader.readAsDataURL(file);
return fileReader;
}
return false;
};
if (typeof define !== 'undefined' && define.amd) {
define(function () {
return loadImage;
});
} else {
$.loadImage = loadImage;
}
}(this));