@webex/helper-image 3.0.0-bnr.4 → 3.0.0-next.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +6 -0
- package/babel.config.js +3 -0
- package/dist/detect-filetype.js.map +1 -1
- package/dist/index.js +1 -55
- package/dist/index.js.map +1 -1
- package/dist/orient.js.map +1 -1
- package/dist/process-image.browser.js +8 -5
- package/dist/process-image.browser.js.map +1 -1
- package/dist/process-image.js +3 -3
- package/dist/process-image.js.map +1 -1
- package/jest.config.js +3 -0
- package/package.json +27 -8
- package/process +1 -0
- package/src/index.js +0 -48
- package/src/orient.js +48 -0
- package/src/process-image.browser.js +1 -1
- package/test/unit/spec/index.js +9 -7
- package/dist/types/detect-filetype.d.ts +0 -7
- package/dist/types/index.d.ts +0 -26
- package/dist/types/process-image.browser.d.ts +0 -19
- package/dist/types/process-image.d.ts +0 -17
package/.eslintrc.js
ADDED
package/babel.config.js
ADDED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["detectFileType","file","logger","type","info","resolve","mimeType","detect","then","getType","name"],"sources":["detect-filetype.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {detect} from '@webex/http-core';\nimport {getType} from 'mime';\n\n/**\n * Determines the file type of the specified file\n * @param {FileLike} file\n * @param {Object} logger\n * @returns {Promise<string>}\n */\nexport default function detectFileType(file, logger) {\n if (file.type) {\n logger.info(`file already has type ${file.type}. using existing file.type.`);\n\n return Promise.resolve(file.type);\n }\n\n if (file.mimeType) {\n logger.info(`file already has mimeType ${file.type}. using existing file.mimeType.`);\n\n return Promise.resolve(file.mimeType);\n }\n\n // This kinda belongs in http core, but since we have no guarantee that\n // buffers are expected to have names there, it'll stay here for now.\n return detect(file).then((type) => {\n if (type === 'application/x-msi' || type === 'application/octet-stream') {\n logger.info(`detected filetype to be ${type}. Falling back to mime.lookup`);\n\n return getType(file.name);\n }\n\n logger.info(`detected filetype to be ${type}. returning it`);\n\n return type;\n });\n}\n"],"mappings":";;;;;;;;;AAIA;AACA;AALA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACe,
|
|
1
|
+
{"version":3,"names":["_httpCore","require","_mime","detectFileType","file","logger","type","info","concat","_promise","default","resolve","mimeType","detect","then","getType","name"],"sources":["detect-filetype.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {detect} from '@webex/http-core';\nimport {getType} from 'mime';\n\n/**\n * Determines the file type of the specified file\n * @param {FileLike} file\n * @param {Object} logger\n * @returns {Promise<string>}\n */\nexport default function detectFileType(file, logger) {\n if (file.type) {\n logger.info(`file already has type ${file.type}. using existing file.type.`);\n\n return Promise.resolve(file.type);\n }\n\n if (file.mimeType) {\n logger.info(`file already has mimeType ${file.type}. using existing file.mimeType.`);\n\n return Promise.resolve(file.mimeType);\n }\n\n // This kinda belongs in http core, but since we have no guarantee that\n // buffers are expected to have names there, it'll stay here for now.\n return detect(file).then((type) => {\n if (type === 'application/x-msi' || type === 'application/octet-stream') {\n logger.info(`detected filetype to be ${type}. Falling back to mime.lookup`);\n\n return getType(file.name);\n }\n\n logger.info(`detected filetype to be ${type}. returning it`);\n\n return type;\n });\n}\n"],"mappings":";;;;;;;;;AAIA,IAAAA,SAAA,GAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AALA;AACA;AACA;;AAKA;AACA;AACA;AACA;AACA;AACA;AACe,SAASE,cAAcA,CAACC,IAAI,EAAEC,MAAM,EAAE;EACnD,IAAID,IAAI,CAACE,IAAI,EAAE;IACbD,MAAM,CAACE,IAAI,0BAAAC,MAAA,CAA0BJ,IAAI,CAACE,IAAI,gCAA6B,CAAC;IAE5E,OAAOG,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACP,IAAI,CAACE,IAAI,CAAC;EACnC;EAEA,IAAIF,IAAI,CAACQ,QAAQ,EAAE;IACjBP,MAAM,CAACE,IAAI,8BAAAC,MAAA,CAA8BJ,IAAI,CAACE,IAAI,oCAAiC,CAAC;IAEpF,OAAOG,QAAA,CAAAC,OAAA,CAAQC,OAAO,CAACP,IAAI,CAACQ,QAAQ,CAAC;EACvC;;EAEA;EACA;EACA,OAAO,IAAAC,gBAAM,EAACT,IAAI,CAAC,CAACU,IAAI,CAAC,UAACR,IAAI,EAAK;IACjC,IAAIA,IAAI,KAAK,mBAAmB,IAAIA,IAAI,KAAK,0BAA0B,EAAE;MACvED,MAAM,CAACE,IAAI,4BAAAC,MAAA,CAA4BF,IAAI,kCAA+B,CAAC;MAE3E,OAAO,IAAAS,aAAO,EAACX,IAAI,CAACY,IAAI,CAAC;IAC3B;IAEAX,MAAM,CAACE,IAAI,4BAAAC,MAAA,CAA4BF,IAAI,mBAAgB,CAAC;IAE5D,OAAOA,IAAI;EACb,CAAC,CAAC;AACJ"}
|
package/dist/index.js
CHANGED
|
@@ -11,7 +11,6 @@ _Object$defineProperty(exports, "detectFileType", {
|
|
|
11
11
|
return _detectFiletype.default;
|
|
12
12
|
}
|
|
13
13
|
});
|
|
14
|
-
exports.orient = orient;
|
|
15
14
|
_Object$defineProperty(exports, "processImage", {
|
|
16
15
|
enumerable: true,
|
|
17
16
|
get: function get() {
|
|
@@ -71,13 +70,7 @@ function updateImageOrientation(file) {
|
|
|
71
70
|
function readExifData(_x, _x2) {
|
|
72
71
|
return _readExifData.apply(this, arguments);
|
|
73
72
|
}
|
|
74
|
-
/* eslint-
|
|
75
|
-
/**
|
|
76
|
-
* Rotates/flips the image on the canvas as per exif information
|
|
77
|
-
* @param {Object} options(orientation: image exif orientation range from 1-8, img: Image object, x: start x-axis, y: start y-axis, width: width of the thumbnail, height: height of the thumbnail, ctx: canvas context)
|
|
78
|
-
* @param {Object} file
|
|
79
|
-
* @returns {Object}
|
|
80
|
-
*/
|
|
73
|
+
/* eslint-enable complexity */
|
|
81
74
|
function _readExifData() {
|
|
82
75
|
_readExifData = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(file, buf) {
|
|
83
76
|
var exifData, Orientation, ExifImageHeight, ExifImageWidth;
|
|
@@ -113,51 +106,4 @@ function _readExifData() {
|
|
|
113
106
|
}));
|
|
114
107
|
return _readExifData.apply(this, arguments);
|
|
115
108
|
}
|
|
116
|
-
function orient(options, file) {
|
|
117
|
-
var width = options.width,
|
|
118
|
-
height = options.height,
|
|
119
|
-
ctx = options.ctx,
|
|
120
|
-
img = options.img,
|
|
121
|
-
orientation = options.orientation,
|
|
122
|
-
x = options.x,
|
|
123
|
-
y = options.y;
|
|
124
|
-
if (file && file.orientation && file.orientation !== 1) {
|
|
125
|
-
// explanation of orientation:
|
|
126
|
-
// https://stackoverflow.com/questions/20600800/js-client-side-exif-orientation-rotate-and-mirror-jpeg-images
|
|
127
|
-
switch (orientation) {
|
|
128
|
-
case 2:
|
|
129
|
-
// flip
|
|
130
|
-
ctx.transform(-1, 0, 0, 1, width, 0);
|
|
131
|
-
break;
|
|
132
|
-
case 3:
|
|
133
|
-
// rotateImage180
|
|
134
|
-
ctx.transform(-1, 0, 0, -1, width, height);
|
|
135
|
-
break;
|
|
136
|
-
case 4:
|
|
137
|
-
// rotate180AndFlipImage
|
|
138
|
-
ctx.transform(1, 0, 0, -1, 0, height);
|
|
139
|
-
break;
|
|
140
|
-
case 5:
|
|
141
|
-
// rotate90AndFlipImage
|
|
142
|
-
ctx.transform(0, 1, 1, 0, 0, 0);
|
|
143
|
-
break;
|
|
144
|
-
case 6:
|
|
145
|
-
// rotateImage90
|
|
146
|
-
ctx.transform(0, 1, -1, 0, height, 0);
|
|
147
|
-
break;
|
|
148
|
-
case 7:
|
|
149
|
-
// rotateNeg90AndFlipImage
|
|
150
|
-
ctx.transform(0, -1, -1, 0, height, width);
|
|
151
|
-
break;
|
|
152
|
-
case 8:
|
|
153
|
-
// rotateNeg90
|
|
154
|
-
ctx.transform(0, -1, 1, 0, 0, width);
|
|
155
|
-
break;
|
|
156
|
-
default:
|
|
157
|
-
break;
|
|
158
|
-
}
|
|
159
|
-
}
|
|
160
|
-
ctx.drawImage(img, x, y, width, height);
|
|
161
|
-
}
|
|
162
|
-
/* eslint-enable complexity */
|
|
163
109
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["require","Buffer","parse","updateImageOrientation","file","options","resolve","reader","FileReader","readAsArrayBuffer","onload","arrayBuffer","result","buf","from","then","shouldNotAddExifData","readExifData","
|
|
1
|
+
{"version":3,"names":["_processImage","_interopRequireDefault","require","_detectFiletype","_require","Buffer","_require2","parse","updateImageOrientation","file","options","arguments","length","undefined","_promise","default","resolve","reader","FileReader","readAsArrayBuffer","onload","arrayBuffer","result","buf","from","then","shouldNotAddExifData","readExifData","_x","_x2","_readExifData","apply","_asyncToGenerator2","_regenerator","mark","_callee","exifData","Orientation","ExifImageHeight","ExifImageWidth","wrap","_callee$","_context","prev","next","type","mimeType","translateValues","sent","orientation","exifHeight","exifWidth","image","abrupt","stop"],"sources":["index.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\n/* eslint no-unused-vars: [\"error\", { \"vars\": \"local\" }] */\n// eslint-disable-next-line no-redeclare\n\nconst {Buffer} = require('safe-buffer');\nconst {parse} = require('exifr/dist/lite.umd');\n\n/**\n * Updates the image file with exif information, required to correctly rotate the image activity\n * @param {Object} file\n * @param {Object} options\n * @param {boolean} options.shouldNotAddExifData\n * @returns {Promise<Object>}\n */\nexport function updateImageOrientation(file, options = {}) {\n return new Promise((resolve) => {\n const reader = new FileReader();\n\n reader.readAsArrayBuffer(file);\n reader.onload = function onload() {\n const arrayBuffer = reader.result;\n const buf = Buffer.from(arrayBuffer);\n\n resolve(buf);\n };\n }).then((buf) => {\n if (options.shouldNotAddExifData) {\n return buf;\n }\n\n return readExifData(file, buf);\n });\n}\n\n/**\n * Adds exif orientation information on the image file\n * @param {Object} file\n * @param {Object} buf\n * @returns {Promise<ExifImage>}\n */\nexport async function readExifData(file, buf) {\n // For avatar images the file.type is set as image/jpeg, however for images shared in an activity file.mimeType is set as image/jpeg. Handling both conditions.\n if (file && (file.type === 'image/jpeg' || file.mimeType === 'image/jpeg')) {\n const exifData = await parse(buf, {translateValues: false});\n\n if (exifData) {\n const {Orientation, ExifImageHeight, ExifImageWidth} = exifData;\n\n file.orientation = Orientation;\n file.exifHeight = ExifImageHeight;\n file.exifWidth = ExifImageWidth;\n\n if (file.image) {\n file.image.orientation = Orientation;\n }\n }\n }\n\n return buf;\n}\n\n/* eslint-enable complexity */\n\nexport {default as processImage} from './process-image';\nexport {default as detectFileType} from './detect-filetype';\n"],"mappings":"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"}
|
package/dist/orient.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["orient","options","file","width","height","ctx","img","orientation","x","y","transform","drawImage"],"sources":["orient.js"],"sourcesContent":["/* eslint-disable complexity */\n/**\n * Rotates/flips the image on the canvas as per exif information\n * @param {Object} options(orientation: image exif orientation range from 1-8, img: Image object, x: start x-axis, y: start y-axis, width: width of the thumbnail, height: height of the thumbnail, ctx: canvas context)\n * @param {Object} file\n * @returns {Object}\n */\nexport function orient(options, file) {\n const {width, height, ctx, img, orientation, x, y} = options;\n\n if (file && file.orientation && file.orientation !== 1) {\n // explanation of orientation:\n // https://stackoverflow.com/questions/20600800/js-client-side-exif-orientation-rotate-and-mirror-jpeg-images\n switch (orientation) {\n case 2:\n // flip\n ctx.transform(-1, 0, 0, 1, width, 0);\n break;\n case 3:\n // rotateImage180\n ctx.transform(-1, 0, 0, -1, width, height);\n break;\n case 4:\n // rotate180AndFlipImage\n ctx.transform(1, 0, 0, -1, 0, height);\n break;\n case 5:\n // rotate90AndFlipImage\n ctx.transform(0, 1, 1, 0, 0, 0);\n break;\n case 6:\n // rotateImage90\n ctx.transform(0, 1, -1, 0, height, 0);\n break;\n case 7:\n // rotateNeg90AndFlipImage\n ctx.transform(0, -1, -1, 0, height, width);\n break;\n case 8:\n // rotateNeg90\n ctx.transform(0, -1, 1, 0, 0, width);\n break;\n default:\n break;\n }\n }\n ctx.drawImage(img, x, y, width, height);\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,MAAMA,CAACC,OAAO,EAAEC,IAAI,EAAE;EACpC,IAAOC,KAAK,GAAyCF,OAAO,CAArDE,KAAK;IAAEC,MAAM,GAAiCH,OAAO,CAA9CG,MAAM;IAAEC,GAAG,GAA4BJ,OAAO,CAAtCI,GAAG;IAAEC,GAAG,GAAuBL,OAAO,CAAjCK,GAAG;IAAEC,WAAW,GAAUN,OAAO,CAA5BM,WAAW;IAAEC,CAAC,GAAOP,OAAO,CAAfO,CAAC;IAAEC,CAAC,GAAIR,OAAO,CAAZQ,CAAC;EAEjD,IAAIP,IAAI,IAAIA,IAAI,CAACK,WAAW,IAAIL,IAAI,CAACK,WAAW,KAAK,CAAC,EAAE;IACtD;IACA;IACA,QAAQA,WAAW;MACjB,KAAK,CAAC;QACJ;QACAF,GAAG,CAACK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEP,KAAK,EAAE,CAAC,CAAC;QACpC;MACF,KAAK,CAAC;QACJ;QACAE,GAAG,CAACK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEP,KAAK,EAAEC,MAAM,CAAC;QAC1C;MACF,KAAK,CAAC;QACJ;QACAC,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAEN,MAAM,CAAC;QACrC;MACF,KAAK,CAAC;QACJ;QACAC,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/B;MACF,KAAK,CAAC;QACJ;QACAL,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAEN,MAAM,EAAE,CAAC,CAAC;QACrC;MACF,KAAK,CAAC;QACJ;QACAC,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAEN,MAAM,EAAED,KAAK,CAAC;QAC1C;MACF,KAAK,CAAC;QACJ;QACAE,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEP,KAAK,CAAC;QACpC;MACF;QACE;
|
|
1
|
+
{"version":3,"names":["orient","options","file","width","height","ctx","img","orientation","x","y","transform","drawImage"],"sources":["orient.js"],"sourcesContent":["/* eslint-disable complexity */\n/**\n * Rotates/flips the image on the canvas as per exif information\n * @param {Object} options(orientation: image exif orientation range from 1-8, img: Image object, x: start x-axis, y: start y-axis, width: width of the thumbnail, height: height of the thumbnail, ctx: canvas context)\n * @param {Object} file\n * @returns {Object}\n */\nexport function orient(options, file) {\n const {width, height, ctx, img, orientation, x, y} = options;\n\n if (file && file.orientation && file.orientation !== 1) {\n // explanation of orientation:\n // https://stackoverflow.com/questions/20600800/js-client-side-exif-orientation-rotate-and-mirror-jpeg-images\n switch (orientation) {\n case 2:\n // flip\n ctx.transform(-1, 0, 0, 1, width, 0);\n break;\n case 3:\n // rotateImage180\n ctx.transform(-1, 0, 0, -1, width, height);\n break;\n case 4:\n // rotate180AndFlipImage\n ctx.transform(1, 0, 0, -1, 0, height);\n break;\n case 5:\n // rotate90AndFlipImage\n ctx.transform(0, 1, 1, 0, 0, 0);\n break;\n case 6:\n // rotateImage90\n ctx.transform(0, 1, -1, 0, height, 0);\n break;\n case 7:\n // rotateNeg90AndFlipImage\n ctx.transform(0, -1, -1, 0, height, width);\n break;\n case 8:\n // rotateNeg90\n ctx.transform(0, -1, 1, 0, 0, width);\n break;\n default:\n break;\n }\n }\n ctx.drawImage(img, x, y, width, height);\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,MAAMA,CAACC,OAAO,EAAEC,IAAI,EAAE;EACpC,IAAOC,KAAK,GAAyCF,OAAO,CAArDE,KAAK;IAAEC,MAAM,GAAiCH,OAAO,CAA9CG,MAAM;IAAEC,GAAG,GAA4BJ,OAAO,CAAtCI,GAAG;IAAEC,GAAG,GAAuBL,OAAO,CAAjCK,GAAG;IAAEC,WAAW,GAAUN,OAAO,CAA5BM,WAAW;IAAEC,CAAC,GAAOP,OAAO,CAAfO,CAAC;IAAEC,CAAC,GAAIR,OAAO,CAAZQ,CAAC;EAEjD,IAAIP,IAAI,IAAIA,IAAI,CAACK,WAAW,IAAIL,IAAI,CAACK,WAAW,KAAK,CAAC,EAAE;IACtD;IACA;IACA,QAAQA,WAAW;MACjB,KAAK,CAAC;QACJ;QACAF,GAAG,CAACK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEP,KAAK,EAAE,CAAC,CAAC;QACpC;MACF,KAAK,CAAC;QACJ;QACAE,GAAG,CAACK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAEP,KAAK,EAAEC,MAAM,CAAC;QAC1C;MACF,KAAK,CAAC;QACJ;QACAC,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAEN,MAAM,CAAC;QACrC;MACF,KAAK,CAAC;QACJ;QACAC,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;QAC/B;MACF,KAAK,CAAC;QACJ;QACAL,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAEN,MAAM,EAAE,CAAC,CAAC;QACrC;MACF,KAAK,CAAC;QACJ;QACAC,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAEN,MAAM,EAAED,KAAK,CAAC;QAC1C;MACF,KAAK,CAAC;QACJ;QACAE,GAAG,CAACK,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAEP,KAAK,CAAC;QACpC;MACF;QACE;IACJ;EACF;EACAE,GAAG,CAACM,SAAS,CAACL,GAAG,EAAEE,CAAC,EAAEC,CAAC,EAAEN,KAAK,EAAEC,MAAM,CAAC;AACzC"}
|
|
@@ -7,10 +7,13 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.default = processImage;
|
|
9
9
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
|
|
10
|
+
var _lodash = require("lodash");
|
|
11
|
+
var _orient = require("./orient");
|
|
12
|
+
/*!
|
|
13
|
+
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
14
|
+
*/
|
|
13
15
|
|
|
16
|
+
/* eslint-env browser */
|
|
14
17
|
/**
|
|
15
18
|
* Determins the dimensions of an image
|
|
16
19
|
* @param {Object} constraints
|
|
@@ -79,7 +82,7 @@ function processImage(_ref2) {
|
|
|
79
82
|
img.onerror = reject;
|
|
80
83
|
img.src = URL.createObjectURL(file);
|
|
81
84
|
}).then(function (img) {
|
|
82
|
-
var fileDimensions = (0,
|
|
85
|
+
var fileDimensions = (0, _lodash.pick)(img, 'height', 'width');
|
|
83
86
|
if (isAvatar) {
|
|
84
87
|
// only if image is a profile avatar
|
|
85
88
|
logger.info('dimensions will be set for avatar image');
|
|
@@ -108,7 +111,7 @@ function processImage(_ref2) {
|
|
|
108
111
|
canvas.width = thumbnailDimensions.width;
|
|
109
112
|
canvas.height = thumbnailDimensions.height;
|
|
110
113
|
}
|
|
111
|
-
(0,
|
|
114
|
+
(0, _orient.orient)({
|
|
112
115
|
orientation: file && file.orientation ? file.orientation : '',
|
|
113
116
|
img: img,
|
|
114
117
|
x: 0,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["computeDimensions","maxWidth","maxHeight","width","height","processImage","file","type","thumbnailMaxWidth","thumbnailMaxHeight","enableThumbnails","logger","isAvatar","startsWith","resolve","Blob","reject","img","Image","onload","onerror","src","URL","createObjectURL","then","fileDimensions","info","size","thumbnailDimensions","canvas","document","createElement","ctx","getContext","orientation","orient","x","y","parts","toDataURL","split","byteString","atob","buffer","ArrayBuffer","length","view","DataView","i","setUint8","charCodeAt"],"sources":["process-image.browser.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {pick} from 'lodash';\n\nimport {orient} from './
|
|
1
|
+
{"version":3,"names":["_lodash","require","_orient","computeDimensions","_ref","maxWidth","maxHeight","width","height","processImage","_ref2","file","type","thumbnailMaxWidth","thumbnailMaxHeight","enableThumbnails","logger","isAvatar","startsWith","_promise","default","resolve","Blob","reject","img","Image","onload","onerror","src","URL","createObjectURL","then","fileDimensions","pick","info","size","thumbnailDimensions","canvas","document","createElement","ctx","getContext","orientation","orient","x","y","parts","toDataURL","split","byteString","atob","buffer","ArrayBuffer","length","view","DataView","i","setUint8","charCodeAt"],"sources":["process-image.browser.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport {pick} from 'lodash';\n\nimport {orient} from './orient';\n/* eslint-env browser */\n\n/**\n * Determins the dimensions of an image\n * @param {Object} constraints\n * @param {Number} constraints.width\n * @param {Number} constraints.height\n * @param {Number} maxWidth\n * @param {Number} maxHeight\n * @returns {Object}\n */\nfunction computeDimensions({width, height}, maxWidth, maxHeight) {\n if (height > width) {\n if (height > maxHeight) {\n width = (width * maxHeight) / height;\n height = maxHeight;\n }\n\n if (width > maxWidth) {\n height = (height * maxWidth) / width;\n width = maxWidth;\n }\n } else {\n if (width > maxWidth) {\n height = (height * maxWidth) / width;\n width = maxWidth;\n }\n\n if (height > maxHeight) {\n width = (width * maxHeight) / height;\n height = maxHeight;\n }\n }\n\n return {height, width};\n}\n\n/**\n * Measures an image file and produces a thumbnail for it\n * @param {Object} options\n * @param {Blob|ArrayBuffer} options.file\n * @param {Number} options.thumbnailMaxWidth\n * @param {Number} options.thumbnailMaxHeight\n * @param {Boolean} options.enableThumbnails\n * @param {Object} options.logger\n * @param {Boolean} options.isAvatar\n * @returns {Promise<Array>} Buffer, Dimensions, thumbnailDimensions\n */\nexport default function processImage({\n file,\n type,\n thumbnailMaxWidth,\n thumbnailMaxHeight,\n enableThumbnails,\n logger,\n isAvatar,\n}) {\n if (!type || !type.startsWith('image')) {\n return Promise.resolve();\n }\n\n file = file instanceof Blob ? file : new Blob([file]);\n\n return new Promise((resolve, reject) => {\n const img = new Image();\n\n img.onload = function onload() {\n resolve(img);\n };\n img.onerror = reject;\n img.src = URL.createObjectURL(file);\n }).then((img) => {\n const fileDimensions = pick(img, 'height', 'width');\n\n if (isAvatar) {\n // only if image is a profile avatar\n logger.info('dimensions will be set for avatar image');\n const size =\n fileDimensions.height > fileDimensions.width ? fileDimensions.height : fileDimensions.width;\n\n fileDimensions.height = size;\n fileDimensions.width = size;\n }\n if (!enableThumbnails) {\n logger.info('thumbnails not enabled');\n\n return [null, fileDimensions, null];\n }\n const thumbnailDimensions = computeDimensions(\n fileDimensions,\n thumbnailMaxWidth,\n thumbnailMaxHeight\n );\n\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d');\n const {width, height} = thumbnailDimensions;\n\n // explanation of orientation:\n // https://stackoverflow.com/questions/20600800/js-client-side-exif-orientation-rotate-and-mirror-jpeg-images\n if (file.orientation && file.orientation > 4) {\n canvas.width = height;\n canvas.height = width;\n thumbnailDimensions.width = height;\n thumbnailDimensions.height = width;\n } else {\n canvas.width = thumbnailDimensions.width;\n canvas.height = thumbnailDimensions.height;\n }\n\n orient(\n {\n orientation: file && file.orientation ? file.orientation : '',\n img,\n x: 0,\n y: 0,\n width,\n height,\n ctx,\n },\n file\n );\n\n const parts = canvas.toDataURL('image/png').split(',');\n // Thumbnail uploads were failing with common/base64 decoding\n const byteString = atob(parts[1]);\n\n const buffer = new ArrayBuffer(byteString.length);\n const view = new DataView(buffer);\n\n for (let i = 0; i < byteString.length; i += 1) {\n view.setUint8(i, byteString.charCodeAt(i));\n }\n\n return [buffer, fileDimensions, thumbnailDimensions];\n });\n}\n"],"mappings":"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"}
|
package/dist/process-image.js
CHANGED
|
@@ -7,8 +7,8 @@ _Object$defineProperty(exports, "__esModule", {
|
|
|
7
7
|
});
|
|
8
8
|
exports.default = processImage;
|
|
9
9
|
var _promise = _interopRequireDefault(require("@babel/runtime-corejs2/core-js/promise"));
|
|
10
|
-
var _pick2 = _interopRequireDefault(require("lodash/pick"));
|
|
11
10
|
var _gm = _interopRequireDefault(require("gm"));
|
|
11
|
+
var _lodash = require("lodash");
|
|
12
12
|
/*!
|
|
13
13
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
14
14
|
*/
|
|
@@ -40,7 +40,7 @@ function processImage(_ref) {
|
|
|
40
40
|
reject(err);
|
|
41
41
|
return;
|
|
42
42
|
}
|
|
43
|
-
resolve((0,
|
|
43
|
+
resolve((0, _lodash.pick)(size, 'width', 'height'));
|
|
44
44
|
});
|
|
45
45
|
});
|
|
46
46
|
var thumbnail;
|
|
@@ -62,7 +62,7 @@ function processImage(_ref) {
|
|
|
62
62
|
reject(err);
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
|
-
resolve((0,
|
|
65
|
+
resolve((0, _lodash.pick)(size, 'width', 'height'));
|
|
66
66
|
});
|
|
67
67
|
});
|
|
68
68
|
});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["processImage","file","type","thumbnailMaxWidth","thumbnailMaxHeight","enableThumbnails","logger","fileType","startsWith","resolve","fileDimensions","reject","gm","size","err","thumbnail","thumbnailDimensions","resize","autoOrient","toBuffer","buffer","then","all","catch","errorString","toString","includes","warn","debug"],"sources":["process-image.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport gm from 'gm';\nimport {pick} from 'lodash';\n\n/**\n * Measures an image file and produces a thumbnail for it\n * @param {Object} options\n * @param {Blob|ArrayBuffer} options.file\n * @param {Number} options.thumbnailMaxWidth\n * @param {Number} options.thumbnailMaxHeight\n * @param {Boolean} options.enableThumbnails\n * @param {Object} options.logger\n * @returns {Promise<Array>} Buffer, Dimensions, thumbnailDimensions\n */\nexport default function processImage({\n file,\n type,\n thumbnailMaxWidth,\n thumbnailMaxHeight,\n enableThumbnails,\n logger,\n}) {\n const fileType = type || file.type;\n\n if (!fileType || !fileType.startsWith('image')) {\n return Promise.resolve();\n }\n\n const fileDimensions = new Promise((resolve, reject) => {\n gm(file).size((err, size) => {\n if (err) {\n reject(err);\n\n return;\n }\n\n resolve(pick(size, 'width', 'height'));\n });\n });\n\n let thumbnail;\n let thumbnailDimensions;\n\n if (enableThumbnails) {\n thumbnail = new Promise((resolve, reject) => {\n gm(file)\n .resize(thumbnailMaxWidth, thumbnailMaxHeight)\n .autoOrient()\n .toBuffer('PNG', (err, buffer) => {\n if (err) {\n reject(err);\n\n return;\n }\n\n resolve(buffer);\n });\n });\n\n thumbnailDimensions = thumbnail.then(\n (buffer) =>\n new Promise((resolve, reject) => {\n gm(buffer).size((err, size) => {\n if (err) {\n reject(err);\n\n return;\n }\n\n resolve(pick(size, 'width', 'height'));\n });\n })\n );\n }\n\n return Promise.all([thumbnail, fileDimensions, thumbnailDimensions]).catch((err) => {\n const errorString = err.toString();\n\n if (errorString.includes('EPIPE')) {\n logger.warn(err, 'Is GraphicsMagick installed?');\n\n return Promise.resolve();\n }\n\n if (errorString.includes('No decode delegate for this image format')) {\n logger.debug(err, 'File does not appear to be an image');\n\n return Promise.resolve();\n }\n\n if (errorString.includes('Stream yields empty buffer')) {\n logger.debug(err, 'File does not appear to be an image');\n\n return Promise.resolve();\n }\n\n return Promise.reject(err);\n });\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"names":["_gm","_interopRequireDefault","require","_lodash","processImage","_ref","file","type","thumbnailMaxWidth","thumbnailMaxHeight","enableThumbnails","logger","fileType","startsWith","_promise","default","resolve","fileDimensions","reject","gm","size","err","pick","thumbnail","thumbnailDimensions","resize","autoOrient","toBuffer","buffer","then","all","catch","errorString","toString","includes","warn","debug"],"sources":["process-image.js"],"sourcesContent":["/*!\n * Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.\n */\n\nimport gm from 'gm';\nimport {pick} from 'lodash';\n\n/**\n * Measures an image file and produces a thumbnail for it\n * @param {Object} options\n * @param {Blob|ArrayBuffer} options.file\n * @param {Number} options.thumbnailMaxWidth\n * @param {Number} options.thumbnailMaxHeight\n * @param {Boolean} options.enableThumbnails\n * @param {Object} options.logger\n * @returns {Promise<Array>} Buffer, Dimensions, thumbnailDimensions\n */\nexport default function processImage({\n file,\n type,\n thumbnailMaxWidth,\n thumbnailMaxHeight,\n enableThumbnails,\n logger,\n}) {\n const fileType = type || file.type;\n\n if (!fileType || !fileType.startsWith('image')) {\n return Promise.resolve();\n }\n\n const fileDimensions = new Promise((resolve, reject) => {\n gm(file).size((err, size) => {\n if (err) {\n reject(err);\n\n return;\n }\n\n resolve(pick(size, 'width', 'height'));\n });\n });\n\n let thumbnail;\n let thumbnailDimensions;\n\n if (enableThumbnails) {\n thumbnail = new Promise((resolve, reject) => {\n gm(file)\n .resize(thumbnailMaxWidth, thumbnailMaxHeight)\n .autoOrient()\n .toBuffer('PNG', (err, buffer) => {\n if (err) {\n reject(err);\n\n return;\n }\n\n resolve(buffer);\n });\n });\n\n thumbnailDimensions = thumbnail.then(\n (buffer) =>\n new Promise((resolve, reject) => {\n gm(buffer).size((err, size) => {\n if (err) {\n reject(err);\n\n return;\n }\n\n resolve(pick(size, 'width', 'height'));\n });\n })\n );\n }\n\n return Promise.all([thumbnail, fileDimensions, thumbnailDimensions]).catch((err) => {\n const errorString = err.toString();\n\n if (errorString.includes('EPIPE')) {\n logger.warn(err, 'Is GraphicsMagick installed?');\n\n return Promise.resolve();\n }\n\n if (errorString.includes('No decode delegate for this image format')) {\n logger.debug(err, 'File does not appear to be an image');\n\n return Promise.resolve();\n }\n\n if (errorString.includes('Stream yields empty buffer')) {\n logger.debug(err, 'File does not appear to be an image');\n\n return Promise.resolve();\n }\n\n return Promise.reject(err);\n });\n}\n"],"mappings":"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"}
|
package/jest.config.js
ADDED
package/package.json
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webex/helper-image",
|
|
3
|
-
"version": "3.0.0-bnr.4",
|
|
4
3
|
"description": "",
|
|
5
4
|
"license": "MIT",
|
|
6
5
|
"author": "Saurabh Jain <saurjai3@cisco.com>",
|
|
@@ -25,18 +24,38 @@
|
|
|
25
24
|
]
|
|
26
25
|
},
|
|
27
26
|
"devDependencies": {
|
|
27
|
+
"@babel/core": "^7.17.10",
|
|
28
|
+
"@webex/babel-config-legacy": "0.0.0",
|
|
29
|
+
"@webex/eslint-config-legacy": "0.0.0",
|
|
30
|
+
"@webex/jest-config-legacy": "0.0.0",
|
|
31
|
+
"@webex/legacy-tools": "0.0.0",
|
|
32
|
+
"@webex/test-helper-chai": "3.0.0-next.1",
|
|
33
|
+
"@webex/test-helper-mocha": "3.0.0-next.1",
|
|
34
|
+
"@webex/test-helper-mock-webex": "3.0.0-next.1",
|
|
35
|
+
"@webex/test-helper-test-users": "3.0.0-next.1",
|
|
36
|
+
"eslint": "^8.24.0",
|
|
37
|
+
"prettier": "^2.7.1",
|
|
28
38
|
"sinon": "^9.2.4"
|
|
29
39
|
},
|
|
30
40
|
"dependencies": {
|
|
31
|
-
"@webex/
|
|
32
|
-
"@webex/
|
|
33
|
-
"@webex/test-helper-
|
|
34
|
-
"@webex/test-helper-
|
|
35
|
-
"@webex/test-helper-mocha": "workspace:^",
|
|
41
|
+
"@webex/http-core": "3.0.0-next.1",
|
|
42
|
+
"@webex/test-helper-chai": "3.0.0-next.1",
|
|
43
|
+
"@webex/test-helper-file": "3.0.0-next.1",
|
|
44
|
+
"@webex/test-helper-mocha": "3.0.0-next.1",
|
|
36
45
|
"exifr": "^5.0.3",
|
|
37
46
|
"gm": "^1.23.1",
|
|
38
47
|
"lodash": "^4.17.21",
|
|
39
48
|
"mime": "^2.4.4",
|
|
40
49
|
"safe-buffer": "^5.2.0"
|
|
41
|
-
}
|
|
42
|
-
|
|
50
|
+
},
|
|
51
|
+
"scripts": {
|
|
52
|
+
"build": "yarn build:src",
|
|
53
|
+
"build:src": "webex-legacy-tools build -dest \"./dist\" -src \"./src\" -js -ts -maps",
|
|
54
|
+
"deploy:npm": "yarn npm publish",
|
|
55
|
+
"test": "yarn test:style && yarn test:unit && yarn test:integration && yarn test:browser",
|
|
56
|
+
"test:browser": "webex-legacy-tools test --unit --runner karma",
|
|
57
|
+
"test:style": "eslint ./src/**/*.*",
|
|
58
|
+
"test:unit": "webex-legacy-tools test --unit --runner mocha"
|
|
59
|
+
},
|
|
60
|
+
"version": "3.0.0-next.1"
|
|
61
|
+
}
|
package/process
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
module.exports = {browser: true};
|
package/src/index.js
CHANGED
|
@@ -62,54 +62,6 @@ export async function readExifData(file, buf) {
|
|
|
62
62
|
return buf;
|
|
63
63
|
}
|
|
64
64
|
|
|
65
|
-
/* eslint-disable complexity */
|
|
66
|
-
/**
|
|
67
|
-
* Rotates/flips the image on the canvas as per exif information
|
|
68
|
-
* @param {Object} options(orientation: image exif orientation range from 1-8, img: Image object, x: start x-axis, y: start y-axis, width: width of the thumbnail, height: height of the thumbnail, ctx: canvas context)
|
|
69
|
-
* @param {Object} file
|
|
70
|
-
* @returns {Object}
|
|
71
|
-
*/
|
|
72
|
-
export function orient(options, file) {
|
|
73
|
-
const {width, height, ctx, img, orientation, x, y} = options;
|
|
74
|
-
|
|
75
|
-
if (file && file.orientation && file.orientation !== 1) {
|
|
76
|
-
// explanation of orientation:
|
|
77
|
-
// https://stackoverflow.com/questions/20600800/js-client-side-exif-orientation-rotate-and-mirror-jpeg-images
|
|
78
|
-
switch (orientation) {
|
|
79
|
-
case 2:
|
|
80
|
-
// flip
|
|
81
|
-
ctx.transform(-1, 0, 0, 1, width, 0);
|
|
82
|
-
break;
|
|
83
|
-
case 3:
|
|
84
|
-
// rotateImage180
|
|
85
|
-
ctx.transform(-1, 0, 0, -1, width, height);
|
|
86
|
-
break;
|
|
87
|
-
case 4:
|
|
88
|
-
// rotate180AndFlipImage
|
|
89
|
-
ctx.transform(1, 0, 0, -1, 0, height);
|
|
90
|
-
break;
|
|
91
|
-
case 5:
|
|
92
|
-
// rotate90AndFlipImage
|
|
93
|
-
ctx.transform(0, 1, 1, 0, 0, 0);
|
|
94
|
-
break;
|
|
95
|
-
case 6:
|
|
96
|
-
// rotateImage90
|
|
97
|
-
ctx.transform(0, 1, -1, 0, height, 0);
|
|
98
|
-
break;
|
|
99
|
-
case 7:
|
|
100
|
-
// rotateNeg90AndFlipImage
|
|
101
|
-
ctx.transform(0, -1, -1, 0, height, width);
|
|
102
|
-
break;
|
|
103
|
-
case 8:
|
|
104
|
-
// rotateNeg90
|
|
105
|
-
ctx.transform(0, -1, 1, 0, 0, width);
|
|
106
|
-
break;
|
|
107
|
-
default:
|
|
108
|
-
break;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
ctx.drawImage(img, x, y, width, height);
|
|
112
|
-
}
|
|
113
65
|
/* eslint-enable complexity */
|
|
114
66
|
|
|
115
67
|
export {default as processImage} from './process-image';
|
package/src/orient.js
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/* eslint-disable complexity */
|
|
2
|
+
/**
|
|
3
|
+
* Rotates/flips the image on the canvas as per exif information
|
|
4
|
+
* @param {Object} options(orientation: image exif orientation range from 1-8, img: Image object, x: start x-axis, y: start y-axis, width: width of the thumbnail, height: height of the thumbnail, ctx: canvas context)
|
|
5
|
+
* @param {Object} file
|
|
6
|
+
* @returns {Object}
|
|
7
|
+
*/
|
|
8
|
+
export function orient(options, file) {
|
|
9
|
+
const {width, height, ctx, img, orientation, x, y} = options;
|
|
10
|
+
|
|
11
|
+
if (file && file.orientation && file.orientation !== 1) {
|
|
12
|
+
// explanation of orientation:
|
|
13
|
+
// https://stackoverflow.com/questions/20600800/js-client-side-exif-orientation-rotate-and-mirror-jpeg-images
|
|
14
|
+
switch (orientation) {
|
|
15
|
+
case 2:
|
|
16
|
+
// flip
|
|
17
|
+
ctx.transform(-1, 0, 0, 1, width, 0);
|
|
18
|
+
break;
|
|
19
|
+
case 3:
|
|
20
|
+
// rotateImage180
|
|
21
|
+
ctx.transform(-1, 0, 0, -1, width, height);
|
|
22
|
+
break;
|
|
23
|
+
case 4:
|
|
24
|
+
// rotate180AndFlipImage
|
|
25
|
+
ctx.transform(1, 0, 0, -1, 0, height);
|
|
26
|
+
break;
|
|
27
|
+
case 5:
|
|
28
|
+
// rotate90AndFlipImage
|
|
29
|
+
ctx.transform(0, 1, 1, 0, 0, 0);
|
|
30
|
+
break;
|
|
31
|
+
case 6:
|
|
32
|
+
// rotateImage90
|
|
33
|
+
ctx.transform(0, 1, -1, 0, height, 0);
|
|
34
|
+
break;
|
|
35
|
+
case 7:
|
|
36
|
+
// rotateNeg90AndFlipImage
|
|
37
|
+
ctx.transform(0, -1, -1, 0, height, width);
|
|
38
|
+
break;
|
|
39
|
+
case 8:
|
|
40
|
+
// rotateNeg90
|
|
41
|
+
ctx.transform(0, -1, 1, 0, 0, width);
|
|
42
|
+
break;
|
|
43
|
+
default:
|
|
44
|
+
break;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
ctx.drawImage(img, x, y, width, height);
|
|
48
|
+
}
|
package/test/unit/spec/index.js
CHANGED
|
@@ -2,8 +2,10 @@
|
|
|
2
2
|
* Copyright (c) 2015-2020 Cisco Systems, Inc. See LICENSE file.
|
|
3
3
|
*/
|
|
4
4
|
|
|
5
|
+
//*** This is mocha test file running on browser as well */
|
|
5
6
|
import {assert} from '@webex/test-helper-chai';
|
|
6
|
-
import {readExifData,
|
|
7
|
+
import {readExifData, updateImageOrientation} from '@webex/helper-image';
|
|
8
|
+
import {orient} from './../../../src/orient';
|
|
7
9
|
import fileHelper from '@webex/test-helper-file';
|
|
8
10
|
import sinon from 'sinon';
|
|
9
11
|
import {browserOnly, nodeOnly} from '@webex/test-helper-mocha';
|
|
@@ -13,8 +15,8 @@ describe('helper-image', () => {
|
|
|
13
15
|
xdescribe('readExifData()', () => {
|
|
14
16
|
let buffer;
|
|
15
17
|
|
|
16
|
-
browserOnly(before)(() =>
|
|
17
|
-
|
|
18
|
+
browserOnly(before)(() => fileHelper.fetch('/Portrait_7.jpg')
|
|
19
|
+
.then((resFile) => {
|
|
18
20
|
/* global FileReader */
|
|
19
21
|
const fileReader = new FileReader();
|
|
20
22
|
|
|
@@ -29,8 +31,8 @@ describe('helper-image', () => {
|
|
|
29
31
|
})
|
|
30
32
|
);
|
|
31
33
|
|
|
32
|
-
nodeOnly(before)(() =>
|
|
33
|
-
|
|
34
|
+
nodeOnly(before)(() => fileHelper.fetch('/Portrait_7.jpg')
|
|
35
|
+
.then((resFile) => {
|
|
34
36
|
buffer = resFile;
|
|
35
37
|
})
|
|
36
38
|
);
|
|
@@ -79,8 +81,8 @@ describe('helper-image', () => {
|
|
|
79
81
|
browserOnly(describe)('updateImageOrientation()', () => {
|
|
80
82
|
let file;
|
|
81
83
|
|
|
82
|
-
before(() =>
|
|
83
|
-
|
|
84
|
+
before(() => fileHelper.fetch('/Portrait_7.jpg')
|
|
85
|
+
.then((resFile) => {
|
|
84
86
|
file = resFile;
|
|
85
87
|
file.displayName = 'Portrait_7.jpg';
|
|
86
88
|
file.mimeType = 'image/jpeg';
|
package/dist/types/index.d.ts
DELETED
|
@@ -1,26 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Updates the image file with exif information, required to correctly rotate the image activity
|
|
3
|
-
* @param {Object} file
|
|
4
|
-
* @param {Object} options
|
|
5
|
-
* @param {boolean} options.shouldNotAddExifData
|
|
6
|
-
* @returns {Promise<Object>}
|
|
7
|
-
*/
|
|
8
|
-
export function updateImageOrientation(file: any, options?: {
|
|
9
|
-
shouldNotAddExifData: boolean;
|
|
10
|
-
}): Promise<any>;
|
|
11
|
-
/**
|
|
12
|
-
* Adds exif orientation information on the image file
|
|
13
|
-
* @param {Object} file
|
|
14
|
-
* @param {Object} buf
|
|
15
|
-
* @returns {Promise<ExifImage>}
|
|
16
|
-
*/
|
|
17
|
-
export function readExifData(file: any, buf: any): Promise<ExifImage>;
|
|
18
|
-
/**
|
|
19
|
-
* Rotates/flips the image on the canvas as per exif information
|
|
20
|
-
* @param {Object} options(orientation: image exif orientation range from 1-8, img: Image object, x: start x-axis, y: start y-axis, width: width of the thumbnail, height: height of the thumbnail, ctx: canvas context)
|
|
21
|
-
* @param {Object} file
|
|
22
|
-
* @returns {Object}
|
|
23
|
-
*/
|
|
24
|
-
export function orient(options: any, file: any): any;
|
|
25
|
-
export { default as processImage } from "./process-image";
|
|
26
|
-
export { default as detectFileType } from "./detect-filetype";
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Measures an image file and produces a thumbnail for it
|
|
3
|
-
* @param {Object} options
|
|
4
|
-
* @param {Blob|ArrayBuffer} options.file
|
|
5
|
-
* @param {Number} options.thumbnailMaxWidth
|
|
6
|
-
* @param {Number} options.thumbnailMaxHeight
|
|
7
|
-
* @param {Boolean} options.enableThumbnails
|
|
8
|
-
* @param {Object} options.logger
|
|
9
|
-
* @param {Boolean} options.isAvatar
|
|
10
|
-
* @returns {Promise<Array>} Buffer, Dimensions, thumbnailDimensions
|
|
11
|
-
*/
|
|
12
|
-
export default function processImage({ file, type, thumbnailMaxWidth, thumbnailMaxHeight, enableThumbnails, logger, isAvatar, }: {
|
|
13
|
-
file: Blob | ArrayBuffer;
|
|
14
|
-
thumbnailMaxWidth: number;
|
|
15
|
-
thumbnailMaxHeight: number;
|
|
16
|
-
enableThumbnails: boolean;
|
|
17
|
-
logger: any;
|
|
18
|
-
isAvatar: boolean;
|
|
19
|
-
}): Promise<any[]>;
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Measures an image file and produces a thumbnail for it
|
|
3
|
-
* @param {Object} options
|
|
4
|
-
* @param {Blob|ArrayBuffer} options.file
|
|
5
|
-
* @param {Number} options.thumbnailMaxWidth
|
|
6
|
-
* @param {Number} options.thumbnailMaxHeight
|
|
7
|
-
* @param {Boolean} options.enableThumbnails
|
|
8
|
-
* @param {Object} options.logger
|
|
9
|
-
* @returns {Promise<Array>} Buffer, Dimensions, thumbnailDimensions
|
|
10
|
-
*/
|
|
11
|
-
export default function processImage({ file, type, thumbnailMaxWidth, thumbnailMaxHeight, enableThumbnails, logger, }: {
|
|
12
|
-
file: Blob | ArrayBuffer;
|
|
13
|
-
thumbnailMaxWidth: number;
|
|
14
|
-
thumbnailMaxHeight: number;
|
|
15
|
-
enableThumbnails: boolean;
|
|
16
|
-
logger: any;
|
|
17
|
-
}): Promise<any[]>;
|