|
1 | 1 | /*
|
2 |
| - * jQuery File Upload Image Preview & Resize Plugin 1.0 |
| 2 | + * jQuery File Upload Image Preview & Resize Plugin 1.1 |
3 | 3 | * https://github.com/blueimp/jQuery-File-Upload
|
4 | 4 | *
|
5 | 5 | * Copyright 2013, Sebastian Tschan
|
|
10 | 10 | */
|
11 | 11 |
|
12 | 12 | /*jslint nomen: true, unparam: true, regexp: true */
|
13 |
| -/*global define, window */ |
| 13 | +/*global define, window, document, DataView, Blob, Uint8Array */ |
14 | 14 |
|
15 | 15 | (function (factory) {
|
16 | 16 | 'use strict';
|
|
44 | 44 | noRevoke: '@loadImageNoRevoke',
|
45 | 45 | disabled: '@disableImageLoad'
|
46 | 46 | },
|
| 47 | + { |
| 48 | + action: 'loadImageMetaData', |
| 49 | + disabled: '@disableImageMetaDataLoad', |
| 50 | + disableImageHead: '@disableImageHead', |
| 51 | + disableExif: '@disableExif', |
| 52 | + disableExifThumbnail: '@disableExifThumbnail', |
| 53 | + disableExifSub: '@disableExifSub', |
| 54 | + disableExifGps: '@disableExifGps' |
| 55 | + }, |
47 | 56 | {
|
48 | 57 | action: 'resizeImage',
|
49 | 58 | maxWidth: '@imageMaxWidth',
|
|
57 | 66 | action: 'saveImage',
|
58 | 67 | disabled: '@disableImageResize'
|
59 | 68 | },
|
| 69 | + { |
| 70 | + action: 'saveImageMetaData', |
| 71 | + disabled: '@disableImageMetaDataSave' |
| 72 | + }, |
60 | 73 | {
|
61 | 74 | action: 'resizeImage',
|
62 | 75 | maxWidth: '@previewMaxWidth',
|
63 | 76 | maxHeight: '@previewMaxHeight',
|
64 | 77 | minWidth: '@previewMinWidth',
|
65 | 78 | minHeight: '@previewMinHeight',
|
66 | 79 | crop: '@previewCrop',
|
| 80 | + orientation: '@previewOrientation', |
| 81 | + thumbnail: '@previewThumbnail', |
67 | 82 | canvas: '@previewAsCanvas',
|
68 | 83 | disabled: '@disableImagePreview'
|
69 | 84 | },
|
|
96 | 111 | previewMaxWidth: 80,
|
97 | 112 | // The maximum height of the preview images:
|
98 | 113 | previewMaxHeight: 80,
|
| 114 | + // Defines the preview orientation (1-8) or takes the orientation |
| 115 | + // value from Exif data if set to true: |
| 116 | + previewOrientation: true, |
| 117 | + // Create the preview using the Exif data thumbnail: |
| 118 | + previewThumbnail: true, |
99 | 119 | // Define if preview images should be cropped or only scaled:
|
100 | 120 | previewCrop: false,
|
101 | 121 | // Define if preview images should be resized as canvas elements:
|
|
140 | 160 | // Accepts the options maxWidth, maxHeight, minWidth,
|
141 | 161 | // minHeight, canvas and crop:
|
142 | 162 | resizeImage: function (data, options) {
|
| 163 | + if (options.disabled) { |
| 164 | + return data; |
| 165 | + } |
| 166 | + var that = this, |
| 167 | + dfd = $.Deferred(), |
| 168 | + resolve = function (newImg) { |
| 169 | + data[newImg.getContext ? 'canvas' : 'img'] = newImg; |
| 170 | + dfd.resolveWith(that, [data]); |
| 171 | + }, |
| 172 | + thumbnail, |
| 173 | + img, |
| 174 | + newImg; |
143 | 175 | options = $.extend({canvas: true}, options);
|
144 |
| - var img = (options.canvas && data.canvas) || data.img, |
145 |
| - canvas; |
146 |
| - if (img && !options.disabled) { |
147 |
| - canvas = loadImage.scale(img, options); |
148 |
| - if (canvas && (canvas.width !== img.width || |
149 |
| - canvas.height !== img.height)) { |
150 |
| - data[canvas.getContext ? 'canvas' : 'img'] = canvas; |
| 176 | + if (data.exif) { |
| 177 | + if (options.orientation === true) { |
| 178 | + options.orientation = data.exif.get('Orientation'); |
| 179 | + } |
| 180 | + if (options.thumbnail) { |
| 181 | + thumbnail = data.exif.get('Thumbnail'); |
| 182 | + if (thumbnail) { |
| 183 | + loadImage(thumbnail, resolve, options); |
| 184 | + return dfd.promise(); |
| 185 | + } |
| 186 | + } |
| 187 | + } |
| 188 | + img = (options.canvas && data.canvas) || data.img; |
| 189 | + if (img) { |
| 190 | + newImg = loadImage.scale(img, options); |
| 191 | + if (newImg.width !== img.width || |
| 192 | + newImg.height !== img.height) { |
| 193 | + resolve(newImg); |
| 194 | + return dfd.promise(); |
151 | 195 | }
|
152 | 196 | }
|
153 | 197 | return data;
|
|
196 | 240 | return dfd.promise();
|
197 | 241 | },
|
198 | 242 |
|
| 243 | + loadImageMetaData: function (data, options) { |
| 244 | + if (options.disabled) { |
| 245 | + return data; |
| 246 | + } |
| 247 | + var that = this, |
| 248 | + dfd = $.Deferred(); |
| 249 | + loadImage.parseMetaData(data.files[data.index], function (result) { |
| 250 | + $.extend(data, result); |
| 251 | + dfd.resolveWith(that, [data]); |
| 252 | + }, options); |
| 253 | + return dfd.promise(); |
| 254 | + }, |
| 255 | + |
| 256 | + saveImageMetaData: function (data, options) { |
| 257 | + if (!data.imageHead || options.disabled) { |
| 258 | + return data; |
| 259 | + } |
| 260 | + var file = data.files[data.index], |
| 261 | + blob = new Blob([ |
| 262 | + data.imageHead, |
| 263 | + // Resized images always have a head size of 20, |
| 264 | + // including the JPEG marker and a minimal JFIF header: |
| 265 | + this._blobSlice.call(file, 20) |
| 266 | + ], {type: file.type}); |
| 267 | + blob.name = file.name; |
| 268 | + data.files[data.index] = blob; |
| 269 | + return data; |
| 270 | + }, |
| 271 | + |
199 | 272 | // Sets the resized version of the image as a property of the
|
200 | 273 | // file object, must be called after "saveImage":
|
201 | 274 | setImage: function (data, options) {
|
|
0 commit comments