/* * JavaScript Load Image Orientation 1.0.0 * https://github.com/blueimp/JavaScript-Load-Image * * Copyright 2013, Sebastian Tschan * https://blueimp.net * * Licensed under the MIT license: * http://www.opensource.org/licenses/MIT */ /*global define, window */ (function (factory) { 'use strict'; if (typeof define === 'function' && define.amd) { // Register as an anonymous AMD module: define(['load-image'], factory); } else { // Browser globals: factory(window.loadImage); } }(function (loadImage) { 'use strict'; var originalHasCanvasOptionMethod = loadImage.hasCanvasOption; // This method is used to determine if the target image // should be a canvas element: loadImage.hasCanvasOption = function (options) { return originalHasCanvasOptionMethod(options) || options.orientation; }; // Transform image orientation based on // the given EXIF orientation option: loadImage.transformCoordinates = function (canvas, options) { var ctx = canvas.getContext('2d'), width = canvas.width, height = canvas.height, orientation = options.orientation; if (!orientation) { return; } if (orientation > 4) { canvas.width = height; canvas.height = width; } switch (orientation) { case 2: // horizontal flip ctx.translate(width, 0); ctx.scale(-1, 1); break; case 3: // 180° rotate left ctx.translate(width, height); ctx.rotate(Math.PI); break; case 4: // vertical flip ctx.translate(0, height); ctx.scale(1, -1); break; case 5: // vertical flip + 90 rotate right ctx.rotate(0.5 * Math.PI); ctx.scale(1, -1); break; case 6: // 90° rotate right ctx.rotate(0.5 * Math.PI); ctx.translate(0, -height); break; case 7: // horizontal flip + 90 rotate right ctx.rotate(0.5 * Math.PI); ctx.translate(width, -height); ctx.scale(-1, 1); break; case 8: // 90° rotate left ctx.rotate(-0.5 * Math.PI); ctx.translate(-width, 0); break; } }; // Transforms coordinate and dimension options // based on the given orientation option: loadImage.getTransformedOptions = function (options) { if (!options.orientation || options.orientation === 1) { return options; } var newOptions = {}, i; for (i in options) { if (options.hasOwnProperty(i)) { newOptions[i] = options[i]; } } switch (options.orientation) { case 2: // horizontal flip newOptions.left = options.right; newOptions.right = options.left; break; case 3: // 180° rotate left newOptions.left = options.right; newOptions.top = options.bottom; newOptions.right = options.left; newOptions.bottom = options.top; break; case 4: // vertical flip newOptions.top = options.bottom; newOptions.bottom = options.top; break; case 5: // vertical flip + 90 rotate right newOptions.left = options.top; newOptions.top = options.left; newOptions.right = options.bottom; newOptions.bottom = options.right; break; case 6: // 90° rotate right newOptions.left = options.top; newOptions.top = options.right; newOptions.right = options.bottom; newOptions.bottom = options.left; break; case 7: // horizontal flip + 90 rotate right newOptions.left = options.bottom; newOptions.top = options.right; newOptions.right = options.top; newOptions.bottom = options.left; break; case 8: // 90° rotate left newOptions.left = options.bottom; newOptions.top = options.left; newOptions.right = options.top; newOptions.bottom = options.right; break; } if (options.orientation > 4) { newOptions.maxWidth = options.maxHeight; newOptions.maxHeight = options.maxWidth; newOptions.minWidth = options.minHeight; newOptions.minHeight = options.minWidth; newOptions.sourceWidth = options.sourceHeight; newOptions.sourceHeight = options.sourceWidth; } return newOptions; }; }));