@khoohaoyit/image-size
Version:
A stream based image size extractor in Node
64 lines (63 loc) • 3.45 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.extractWebpSize = void 0;
exports.extractWebpSize = function (stream) {
return __asyncGenerator(this, arguments, function* () {
const riffHeader = 'RIFF' === (yield __await(stream.read(0, 4))) + '';
const webpHeader = 'WEBP' === (yield __await(stream.read(8, 4))) + '';
const vp8Header = 'VP8' === (yield __await(stream.read(12, 3))) + '';
if (!riffHeader || !webpHeader || !vp8Header)
return yield __await(void 0);
switch (yield __await(stream.readString(12, 4))) {
default:
break;
case 'VP8X':
{
const extendedHeader = yield __await(stream.readUint8(20));
const validStart = (extendedHeader & 0xc0) === 0;
const validEnd = (extendedHeader & 0x01) === 0;
if (!validStart || !validEnd)
break;
return yield __await(yield yield __await({
width: 1 + (yield __await(stream.readUIntLE(20 + 4, 3))),
height: 1 + (yield __await(stream.readUIntLE(20 + 7, 3))),
}));
}
break;
case 'VP8 ':
{
// `& 0x3fff` returns the last 14 bits
// TO-DO: include webp scaling in the calculations
return yield __await(yield yield __await({
width: (yield __await(stream.readInt16LE(20 + 6))) & 0x3fff,
height: (yield __await(stream.readInt16LE(20 + 8))) & 0x3fff,
}));
}
break;
case 'VP8L':
{
const signature = yield __await(stream.read(20 + 3, 3));
if (signature.toString('hex') === '9d012a')
break;
const buffer = yield __await(stream.read(20 + 1, 4));
return yield __await(yield yield __await({
width: 1 + (((buffer[1] & 0x3f) << 8) | buffer[0]),
height: 1 + (((buffer[3] & 0xf) << 10) | (buffer[2] << 2) | ((buffer[1] & 0xc0) >> 6)),
}));
}
break;
}
});
};