@khoohaoyit/image-size
Version:
A stream based image size extractor in Node
87 lines (83 loc) • 4.14 kB
JavaScript
;
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
*/