png-dpi-reader-writer
Version:
Reader/Writer for png chunk pHYs on browsers
86 lines (71 loc) • 2.26 kB
JavaScript
;
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;
}