UNPKG

png-dpi-reader-writer

Version:

Reader/Writer for png chunk pHYs on browsers

86 lines (71 loc) 2.26 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.isPng = isPng; exports.readBytes = readBytes; exports.readIHDR = readIHDR; exports.getCharCodes = getCharCodes; exports.convertToDataURI = convertToDataURI; exports.convertToByteArray = convertToByteArray; exports.toHex = exports.toBin = void 0; var toBin = function toBin(value, digits) { return value.toString(2).padStart(digits, '0'); }; exports.toBin = toBin; var toHex = function toHex(value, digits) { return value.toString(16).padStart(digits, '0'); }; exports.toHex = toHex; function isPng(byteArray, ptr) { var pngSignature = '89 50 4E 47 0D 0A 1A 0A'; var signature = readBytes(byteArray, ptr, 8).map(function (v) { return toHex(v, 2); }); return signature.join(' ').toUpperCase() === pngSignature; } function readBytes(byteArray, ptr, byteLength) { var pos = ptr.pos; var res = byteArray.slice(pos, pos + byteLength); ptr.pos += byteLength; return Array.from(res); } function readIHDR(byteArray, ptr) { // https://tools.ietf.org/html/rfc2083#page-15 // Length, ChunkType ptr.pos += 4 + 4; var width = readBytes(byteArray, ptr, 4).map(function (v) { return toBin(v, 8); }); width = parseInt(width.join(''), 2); var height = readBytes(byteArray, ptr, 4).map(function (v) { return toBin(v, 8); }); height = parseInt(height.join(''), 2); // Bit depth, Color type, Compression method, Filter method, nterlace method, CRC ptr.pos += 1 + 1 + 1 + 1 + 1 + 4; return { width: width, height: height }; } function getCharCodes(str) { return str.split('').map(function (c) { return c.charCodeAt(0); }).join(' '); } var dataURIScheme = 'data:image/png;base64,'; function convertToDataURI(arrayBuffer) { var byteArray = new Uint8Array(arrayBuffer); return dataURIScheme + btoa(byteArray.reduce(function (data, byte) { return data + String.fromCharCode(byte); }, '')); } function convertToByteArray(dataURI) { if (!dataURI.startsWith(dataURIScheme)) return []; var rawStr = atob(dataURI.split(dataURIScheme)[1]); var array = new Uint8Array(new ArrayBuffer(rawStr.length)); for (var i = 0; i < rawStr.length; i++) { array[i] = rawStr.charCodeAt(i); } return array; }