UNPKG

@khoohaoyit/image-size

Version:

A stream based image size extractor in Node

87 lines (83 loc) 4.14 kB
"use strict"; var __await = (this && this.__await) || function (v) { return this instanceof __await ? (this.v = v, this) : new __await(v); } var __asyncGenerator = (this && this.__asyncGenerator) || function (thisArg, _arguments, generator) { if (!Symbol.asyncIterator) throw new TypeError("Symbol.asyncIterator is not defined."); var g = generator.apply(thisArg, _arguments || []), i, q = []; return i = {}, verb("next"), verb("throw"), verb("return"), i[Symbol.asyncIterator] = function () { return this; }, i; function verb(n) { if (g[n]) i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; } function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } } function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); } function fulfill(value) { resume("next", value); } function reject(value) { resume("throw", value); } function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.extractTiffSize = void 0; exports.extractTiffSize = function (stream) { return __asyncGenerator(this, arguments, function* () { // 0x492049, // currently not supported // 0x4d4d002a, // BigTIFF > 4GB. currently not supported /// Image File Header const byteOrderHeader = yield __await(stream.readString(0, 2)); if (byteOrderHeader !== 'II' /// LE && byteOrderHeader !== 'MM' /// BE ) return yield __await(void 0); stream.setEndianness(byteOrderHeader === 'II' ? 'LE' : 'BE'); if ((yield __await(stream.readUint(2, 2))) !== 42) return yield __await(void 0); const ifdOffset = yield __await(stream.readUint(4, 4)); /// End of Image File Header let width = null, height = null; let entryAmount = yield __await(stream.readUint(ifdOffset, 2)); for (let currentOffset = ifdOffset + 2; entryAmount; --entryAmount) { const tag = yield __await(stream.readUint(currentOffset, 2)); const type = yield __await(stream.readUint(currentOffset + 2, 2)); const count = yield __await(stream.readUint(currentOffset + 4, 4)); switch (tag) { default: break; case TagType.ImageWidth: case TagType.ImageLength: { if (count !== 1) break; const valueSize = type === FieldType.SHORT ? 2 : 4; const size = yield __await(stream.readUint(currentOffset + 8, valueSize)); if (tag === TagType.ImageWidth) width = size; else height = size; } break; } currentOffset += 12; if (width !== null && height !== null) break; } if (width === null || height === null) return yield __await(void 0); return yield __await(yield yield __await({ width, height })); }); }; var TagType; (function (TagType) { TagType[TagType["ImageWidth"] = 256] = "ImageWidth"; TagType[TagType["ImageLength"] = 257] = "ImageLength"; })(TagType || (TagType = {})); var FieldType; (function (FieldType) { FieldType[FieldType["BYTE"] = 1] = "BYTE"; FieldType[FieldType["ASCII"] = 2] = "ASCII"; FieldType[FieldType["SHORT"] = 3] = "SHORT"; FieldType[FieldType["LONG"] = 4] = "LONG"; FieldType[FieldType["RATIONAL"] = 5] = "RATIONAL"; })(FieldType || (FieldType = {})); /* tiff ifd format -> https://www.nationalarchives.gov.uk/PRONOM/Format/proFormatSearch.aspx?status=detailReport&id=1099&strPageToDisplay=summary -> https://web.archive.org/web/20211031081158/https://www.adobe.io/content/dam/udp/en/open/standards/tiff/TIFF6.pdf nef?? http://lclevy.free.fr/nef https://exiftool.org/TagNames/EXIF.html */