mirror of
https://github.com/lovell/sharp.git
synced 2025-12-19 07:15:08 +01:00
Combine new tile* API methods
Use v7.40.0+ libvips loader methods Separate Openslide as input vs Deep Zoom as output Split tile-based tests into new file Added assertions for generated tile size
This commit is contained in:
113
test/unit/io.js
113
test/unit/io.js
@@ -519,42 +519,6 @@ describe('Input/output', function() {
|
||||
});
|
||||
}
|
||||
|
||||
if (sharp.format.dz.output.file) {
|
||||
it('Convert JPEG to DZ', function(done) {
|
||||
sharp(fixtures.inputJpg)
|
||||
.resize(320, 240)
|
||||
.toFormat(sharp.format.dz)
|
||||
.toFile(fixtures.path('output.jpg.dzi'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, info.size > 0);
|
||||
assert.strictEqual('dz', info.format);
|
||||
assert.strictEqual(320, info.width);
|
||||
assert.strictEqual(240, info.height);
|
||||
assert.strictEqual(256, info.tileSize);
|
||||
assert.strictEqual(0, info.tileOverlap);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it('Convert JPEG to DZ (test tileSize and tileOverlap)', function(done) {
|
||||
sharp(fixtures.inputJpg)
|
||||
.resize(320, 240)
|
||||
.toFormat(sharp.format.dz)
|
||||
.tileSize(512)
|
||||
.tileOverlap(10)
|
||||
.toFile(fixtures.path('output.tileTest.jpg.dzi'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, info.size > 0);
|
||||
assert.strictEqual('dz', info.format);
|
||||
assert.strictEqual(320, info.width);
|
||||
assert.strictEqual(240, info.height);
|
||||
assert.strictEqual(512, info.tileSize);
|
||||
assert.strictEqual(10, info.tileOverlap);
|
||||
done();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (sharp.format.tiff.input.buffer) {
|
||||
it('Load TIFF from Buffer', function(done) {
|
||||
var inputTiffBuffer = fs.readFileSync(fixtures.inputTiff);
|
||||
@@ -591,6 +555,22 @@ describe('Input/output', function() {
|
||||
});
|
||||
}
|
||||
|
||||
if (sharp.format.openslide.input.file) {
|
||||
it('Load Aperio SVS file via Openslide', function(done) {
|
||||
sharp(fixtures.inputSvs)
|
||||
.resize(320, 240)
|
||||
.jpeg()
|
||||
.toBuffer(function(err, data, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, data.length > 0);
|
||||
assert.strictEqual('jpeg', info.format);
|
||||
assert.strictEqual(320, info.width);
|
||||
assert.strictEqual(240, info.height);
|
||||
done();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
if (sharp.format.raw.output.buffer) {
|
||||
describe('Ouput raw, uncompressed image data', function() {
|
||||
it('1 channel greyscale image', function(done) {
|
||||
@@ -704,65 +684,4 @@ describe('Input/output', function() {
|
||||
|
||||
});
|
||||
|
||||
if(sharp.format.openslide.input.file) {
|
||||
describe('Openslide output', function() {
|
||||
it('Aperio - convert SVS to PNG', function(done) {
|
||||
sharp(fixtures.inputSvs)
|
||||
.toFile(fixtures.path('output.svs.png'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, info.size > 0);
|
||||
assert.strictEqual('png', info.format);
|
||||
assert.strictEqual(2220, info.width);
|
||||
assert.strictEqual(2967, info.height);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('Aperio - convert SVS to JPEG', function(done) {
|
||||
sharp(fixtures.inputSvs)
|
||||
.toFile(fixtures.path('output.svs.jpeg'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, info.size > 0);
|
||||
assert.strictEqual('jpeg', info.format);
|
||||
assert.strictEqual(2220, info.width);
|
||||
assert.strictEqual(2967, info.height);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('Aperio - convert SVS to TIFF', function(done) {
|
||||
sharp(fixtures.inputSvs)
|
||||
.toFile(fixtures.path('output.svs.tiff'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, info.size > 0);
|
||||
assert.strictEqual('tiff', info.format);
|
||||
assert.strictEqual(2220, info.width);
|
||||
assert.strictEqual(2967, info.height);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('Aperio - convert SVS to WEBP', function(done) {
|
||||
sharp(fixtures.inputSvs)
|
||||
.toFile(fixtures.path('output.svs.webp'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, info.size > 0);
|
||||
assert.strictEqual('webp', info.format);
|
||||
assert.strictEqual(2220, info.width);
|
||||
assert.strictEqual(2967, info.height);
|
||||
done();
|
||||
});
|
||||
});
|
||||
it('Aperio - convert SVS to DZI', function(done) {
|
||||
sharp(fixtures.inputSvs)
|
||||
.toFile(fixtures.path('output.aperio.svs.dzi'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual(true, info.size > 0);
|
||||
assert.strictEqual('dz', info.format);
|
||||
assert.strictEqual(2220, info.width);
|
||||
assert.strictEqual(2967, info.height);
|
||||
assert.strictEqual(256, info.tileSize);
|
||||
assert.strictEqual(0, info.tileOverlap);
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
@@ -109,6 +109,22 @@ describe('Image metadata', function() {
|
||||
});
|
||||
});
|
||||
|
||||
if (sharp.format.openslide.input.file) {
|
||||
it('Aperio SVS via openslide', function(done) {
|
||||
sharp(fixtures.inputSvs).metadata(function(err, metadata) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual('openslide', metadata.format);
|
||||
assert.strictEqual(2220, metadata.width);
|
||||
assert.strictEqual(2967, metadata.height);
|
||||
assert.strictEqual(4, metadata.channels);
|
||||
assert.strictEqual('rgb', metadata.space);
|
||||
assert.strictEqual(false, metadata.hasProfile);
|
||||
assert.strictEqual(true, metadata.hasAlpha);
|
||||
done();
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
it('File in, Promise out', function(done) {
|
||||
sharp(fixtures.inputJpg).metadata().then(function(metadata) {
|
||||
assert.strictEqual('jpeg', metadata.format);
|
||||
|
||||
204
test/unit/tile.js
Executable file
204
test/unit/tile.js
Executable file
@@ -0,0 +1,204 @@
|
||||
'use strict';
|
||||
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
var assert = require('assert');
|
||||
|
||||
var async = require('async');
|
||||
var rimraf = require('rimraf');
|
||||
|
||||
var sharp = require('../../index');
|
||||
var fixtures = require('../fixtures');
|
||||
|
||||
sharp.cache(0);
|
||||
|
||||
// Verifies all tiles in a given dz output directory are <= size
|
||||
var assertDeepZoomTiles = function(directory, expectedSize, expectedLevels, done) {
|
||||
// Get levels
|
||||
var levels = fs.readdirSync(directory);
|
||||
assert.strictEqual(expectedLevels, levels.length);
|
||||
// Get tiles
|
||||
var tiles = [];
|
||||
levels.forEach(function(level) {
|
||||
// Verify level directory name
|
||||
assert.strictEqual(true, /^[0-9]+$/.test(level));
|
||||
fs.readdirSync(path.join(directory, level)).forEach(function(tile) {
|
||||
// Verify tile file name
|
||||
assert.strictEqual(true, /^[0-9]+_[0-9]+\.jpeg$/.test(tile));
|
||||
tiles.push(path.join(directory, level, tile));
|
||||
});
|
||||
});
|
||||
// Verify each tile is <= expectedSize
|
||||
async.eachSeries(tiles, function(tile, done) {
|
||||
sharp(tile).metadata(function(err, metadata) {
|
||||
if (err) {
|
||||
done(err);
|
||||
} else {
|
||||
assert.strictEqual('jpeg', metadata.format);
|
||||
assert.strictEqual('srgb', metadata.space);
|
||||
assert.strictEqual(3, metadata.channels);
|
||||
assert.strictEqual(false, metadata.hasProfile);
|
||||
assert.strictEqual(false, metadata.hasAlpha);
|
||||
assert.strictEqual(true, metadata.width <= expectedSize);
|
||||
assert.strictEqual(true, metadata.height <= expectedSize);
|
||||
done();
|
||||
}
|
||||
});
|
||||
}, done);
|
||||
};
|
||||
|
||||
describe('Tile', function() {
|
||||
|
||||
describe('Invalid tile values', function() {
|
||||
it('size - NaN', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile('zoinks');
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('size - float', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(1.1);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('size - negative', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(-1);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('size - zero', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(0);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('size - too large', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(8193);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('overlap - NaN', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(null, 'zoinks');
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('overlap - float', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(null, 1.1);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('overlap - negative', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(null, -1);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('overlap - too large', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(null, 8193);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('overlap - larger than default size', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(null, 257);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
it('overlap - larger than provided size', function(done) {
|
||||
var isValid = true;
|
||||
try {
|
||||
sharp().tile(512, 513);
|
||||
} catch (err) {
|
||||
isValid = false;
|
||||
}
|
||||
assert.strictEqual(false, isValid);
|
||||
done();
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
if (sharp.format.dz.output.file) {
|
||||
describe('Deep Zoom output', function() {
|
||||
|
||||
it('Tile size - 256px default', function(done) {
|
||||
var directory = fixtures.path('output256_files');
|
||||
rimraf(directory, function() {
|
||||
sharp(fixtures.inputJpg).toFile(fixtures.path('output256.dzi'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual('dz', info.format);
|
||||
assertDeepZoomTiles(directory, 256, 13, done);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
it('Tile size/overlap - 512/16px', function(done) {
|
||||
var directory = fixtures.path('output512_files');
|
||||
rimraf(directory, function() {
|
||||
sharp(fixtures.inputJpg).tile(512, 16).toFile(fixtures.path('output512.dzi'), function(err, info) {
|
||||
if (err) throw err;
|
||||
assert.strictEqual('dz', info.format);
|
||||
assertDeepZoomTiles(directory, 512 + 2 * 16, 13, done);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
});
|
||||
Reference in New Issue
Block a user