-
Notifications
You must be signed in to change notification settings - Fork 1.2k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #889 from blikblum/png-sync
Use sync version of zlib deflate method to compress png images
- Loading branch information
Showing
4 changed files
with
210 additions
and
19 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
const PDFDocument = require('../'); | ||
const fs = require('fs'); | ||
|
||
const doc = new PDFDocument(); | ||
|
||
// files with alpha channel -> uses zlib.deflate | ||
const files = [ | ||
'test.png', | ||
'test3.png' | ||
]; | ||
|
||
const filesData = files.map(fileName => { | ||
return fs.readFileSync(`images/${fileName}`); | ||
}); | ||
|
||
const iterationCount = 100; | ||
|
||
console.time('png-bench') | ||
|
||
for (let i = 0; i < iterationCount; i++) { | ||
filesData.forEach(data => { | ||
doc.image(data) | ||
doc.addPage() | ||
}) | ||
} | ||
|
||
doc.on('data', () => {}) | ||
|
||
doc.on('end', () => { | ||
console.timeEnd('png-bench'); | ||
}); | ||
|
||
doc.end(); |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,170 @@ | ||
const PDFDocument = require("../../lib/document").default; | ||
const PDFReference = require("../../lib/reference").default; | ||
const PNGImage = require("../../lib/image/png").default; | ||
const fs = require("fs"); | ||
|
||
describe("PNGImage", () => { | ||
let document; | ||
|
||
const createImage = fileName => { | ||
const img = new PNGImage(fs.readFileSync(fileName), "I1"); | ||
// noop data manipulation methods | ||
img.loadIndexedAlphaChannel = () => { | ||
if (img.image.hasAlphaChannel) { | ||
img.alphaChannel = {}; | ||
} | ||
}; | ||
img.splitAlphaChannel = () => { | ||
if (img.image.hasAlphaChannel) { | ||
img.alphaChannel = {}; | ||
} | ||
}; | ||
img.embed(document); | ||
img.finalize(); | ||
return img; | ||
}; | ||
|
||
beforeEach(() => { | ||
document = new PDFDocument(); | ||
}); | ||
|
||
test("RGB", () => { | ||
// ImageWidth = 400 | ||
// ImageHeight = 533 | ||
// BitDepth = 8 | ||
// ColorType = 2 (RGB) | ||
// Compression = 0 | ||
// Filter = 0 | ||
// Interlace = 0 | ||
|
||
const img = createImage("./demo/images/test2.png"); | ||
|
||
expect(img.obj.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
ColorSpace: "DeviceRGB", | ||
Filter: "FlateDecode", | ||
Height: 533, | ||
Length: 397011, | ||
Subtype: "Image", | ||
Type: "XObject", | ||
Width: 400, | ||
DecodeParms: expect.any(PDFReference) | ||
}); | ||
|
||
expect(img.obj.data.DecodeParms.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
Colors: 3, | ||
Columns: 400, | ||
Predictor: 15 | ||
}); | ||
}); | ||
|
||
test("RGB with Alpha", () => { | ||
// ImageWidth = 409 | ||
// ImageHeight = 400 | ||
// BitDepth = 8 | ||
// ColorType = 6 (RGB with Alpha) | ||
// Compression = 0 | ||
// Filter = 0 | ||
// Interlace = 0 | ||
|
||
const img = createImage("./tests/images/bee.png"); | ||
|
||
expect(img.obj.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
ColorSpace: "DeviceRGB", | ||
Filter: "FlateDecode", | ||
Height: 400, | ||
Length: 47715, | ||
Subtype: "Image", | ||
Type: "XObject", | ||
Width: 409, | ||
SMask: expect.any(PDFReference) | ||
}); | ||
|
||
expect(img.obj.data.SMask.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
ColorSpace: "DeviceGray", | ||
Decode: [ | ||
0, | ||
1 | ||
], | ||
Filter: "FlateDecode", | ||
Height: 400, | ||
Length: 16, | ||
Subtype: "Image", | ||
Type: "XObject", | ||
Width: 409, | ||
}); | ||
}); | ||
|
||
test("Pallete", () => { | ||
// ImageWidth = 980 | ||
// ImageHeight = 540 | ||
// BitDepth = 8 | ||
// ColorType = 3 (Pallete) | ||
// Compression = 0 | ||
// Filter = 0 | ||
// Interlace = 0 | ||
|
||
const img = createImage("./demo/images/test3.png"); | ||
|
||
expect(img.obj.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
ColorSpace: ["Indexed", "DeviceRGB", 255, expect.any(PDFReference)], | ||
Filter: "FlateDecode", | ||
Height: 540, | ||
Length: 56682, | ||
Subtype: "Image", | ||
Type: "XObject", | ||
Width: 980, | ||
DecodeParms: expect.any(PDFReference) | ||
}); | ||
|
||
expect(img.obj.data.DecodeParms.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
Colors: 1, | ||
Columns: 980, | ||
Predictor: 15 | ||
}); | ||
}); | ||
|
||
test("Grayscale with Alpha", () => { | ||
// ImageWidth = 112 | ||
// ImageHeight = 112 | ||
// BitDepth = 8 | ||
// ColorType = 4 (Grayscale with Alpha) | ||
// Compression = 0 | ||
// Filter = 0 | ||
// Interlace = 0 | ||
|
||
const img = createImage("./tests/images/fish.png"); | ||
|
||
expect(img.obj.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
ColorSpace: "DeviceGray", | ||
Filter: "FlateDecode", | ||
Height: 112, | ||
Length: 9922, | ||
Subtype: "Image", | ||
Type: "XObject", | ||
Width: 112, | ||
SMask: expect.any(PDFReference) | ||
}); | ||
|
||
expect(img.obj.data.SMask.data).toMatchObject({ | ||
BitsPerComponent: 8, | ||
ColorSpace: "DeviceGray", | ||
Decode: [ | ||
0, | ||
1 | ||
], | ||
Filter: "FlateDecode", | ||
Height: 112, | ||
Length: 16, | ||
Subtype: "Image", | ||
Type: "XObject", | ||
Width: 112, | ||
}); | ||
}); | ||
}); |