diff --git a/dist/index.js b/dist/index.js index 077ee59..2d70d72 100644 --- a/dist/index.js +++ b/dist/index.js @@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true }); +exports.changeDpiBuffer = changeDpiBuffer; exports.changeDpiBlob = changeDpiBlob; exports.changeDpiDataUrl = changeDpiDataUrl; @@ -51,6 +52,40 @@ var _H = 'H'.charCodeAt(0); var _Y = 'Y'.charCodeAt(0); var _S = 's'.charCodeAt(0); +function isBufferPNG(buffer) { + if (buffer.length < 8) return; + return buffer[0] === 137 && buffer[1] === 80 && buffer[2] === 78 && buffer[3] === 71 && buffer[4] === 13 && buffer[5] === 10 && buffer[6] === 26 && buffer[7] === 10; +} + +function isBufferJPEG(buffer) { + if (buffer.length < 3) return; + return buffer[0] === 255 && buffer[1] === 216 && buffer[2] === 255; +} + +function getType(buffer) { + if (isBufferJPEG(buffer)) { + return JPEG; + } + if (isBufferPNG(buffer)) { + return PNG; + } +} + +function mergedTypedArrays(a, b) { + var c = new a.constructor(a.length + b.length); + c.set(a); + c.set(b, a.length); + return c; +} + +function changeDpiBuffer(buffer, dpi) { + var headerChunk = new Uint8Array(buffer.slice(0, 33)); + var rest = buffer.slice(33); + var type = getType(buffer); + var changedHeader = changeDpiOnArray(headerChunk, dpi, type); + return mergedTypedArrays(changedHeader, rest); +} + function changeDpiBlob(blob, dpi) { // 33 bytes are ok for pngs and jpegs // to contain the information. diff --git a/src/index.js b/src/index.js index cc52a9c..4290d6a 100644 --- a/src/index.js +++ b/src/index.js @@ -41,6 +41,40 @@ const _H = 'H'.charCodeAt(0); const _Y = 'Y'.charCodeAt(0); const _S = 's'.charCodeAt(0); +function isBufferPNG(buffer) { + if (buffer.length < 8) return; + return buffer[0] === 137 && buffer[1] === 80 && buffer[2] === 78 && buffer[3] === 71 && buffer[4] === 13 && buffer[5] === 10 && buffer[6] === 26 && buffer[7] === 10; +} + +function isBufferJPEG(buffer) { + if (buffer.length < 3) return; + return buffer[0] === 255 && buffer[1] === 216 && buffer[2] === 255; +} + +function getType(buffer) { + if (isBufferJPEG(buffer)) { + return JPEG; + } + if (isBufferPNG(buffer)) { + return PNG; + } +} + +function mergedTypedArrays(a, b) { + var c = new a.constructor(a.length + b.length); + c.set(a); + c.set(b, a.length); + return c; +} + +export function changeDpiBuffer(buffer, dpi) { + const headerChunk = new Uint8Array(buffer.slice(0, 33)); + const rest = buffer.slice(33); + const type = getType(buffer); + const changedHeader = changeDpiOnArray(headerChunk, dpi, type); + return mergedTypedArrays(changedHeader, rest); +} + export function changeDpiBlob(blob, dpi) { // 33 bytes are ok for pngs and jpegs // to contain the information. diff --git a/test/test.spec.js b/test/test.spec.js index f75252b..1a91744 100644 --- a/test/test.spec.js +++ b/test/test.spec.js @@ -1,6 +1,6 @@ import chai, { expect } from 'chai'; import fs from 'fs'; -import { changeDpiDataUrl, changeDpiBlob } from '../src/index'; +import { changeDpiDataUrl, changeDpiBlob, changeDpiBuffer } from '../src/index'; import btoa from 'btoa'; import atob from 'atob'; @@ -58,6 +58,13 @@ describe('It can convert dpi', function() { expect(Buffer.compare(blob,b)).to.not.equal(0); }); }); + it("JPEG conversion buffer", function() { + const jpeg123 = fs.readFileSync(__dirname + '/jpeg123.jpg'); + const jpeg456 = fs.readFileSync(__dirname + '/jpeg456.jpg'); + const converted = changeDpiBuffer(jpeg123, 456, 'image/jpeg'); + expect(Buffer.compare(converted,jpeg456)).to.equal(0); + expect(Buffer.compare(converted,jpeg123)).to.not.equal(0); + }) // it('PNG conversion blob', function() { // const b = fs.readFileSync(__dirname + '/test415.png'); // const a = fs.readFileSync(__dirname + '/test830.png');