mirror of
https://github.com/lovell/sharp.git
synced 2025-07-09 10:30:15 +02:00
add corner gavity support
This commit is contained in:
parent
ef62daccf9
commit
25e5f27785
4
index.js
4
index.js
@ -137,11 +137,11 @@ Sharp.prototype._write = function(chunk, encoding, callback) {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Crop this part of the resized image (Center/Centre, North, East, South, West)
|
// Crop this part of the resized image (Center/Centre, North, East, South, West)
|
||||||
module.exports.gravity = {'center': 0, 'centre': 0, 'north': 1, 'east': 2, 'south': 3, 'west': 4};
|
module.exports.gravity = {'center': 0, 'centre': 0, 'north': 1, 'east': 2, 'south': 3, 'west': 4, 'northeast': 5, 'southeast': 6, 'southwest': 7, 'northwest': 8};
|
||||||
|
|
||||||
Sharp.prototype.crop = function(gravity) {
|
Sharp.prototype.crop = function(gravity) {
|
||||||
this.options.canvas = 'crop';
|
this.options.canvas = 'crop';
|
||||||
if (typeof gravity === 'number' && !Number.isNaN(gravity) && gravity >= 0 && gravity <= 4) {
|
if (typeof gravity === 'number' && !Number.isNaN(gravity) && gravity >= 0 && gravity <= 8) {
|
||||||
this.options.gravity = gravity;
|
this.options.gravity = gravity;
|
||||||
} else if (typeof gravity === 'string' && typeof module.exports.gravity[gravity] === 'number') {
|
} else if (typeof gravity === 'string' && typeof module.exports.gravity[gravity] === 'number') {
|
||||||
this.options.gravity = module.exports.gravity[gravity];
|
this.options.gravity = module.exports.gravity[gravity];
|
||||||
|
@ -1096,6 +1096,16 @@ class PipelineWorker : public AsyncWorker {
|
|||||||
case 4: // West
|
case 4: // West
|
||||||
top = (inHeight - outHeight + 1) / 2;
|
top = (inHeight - outHeight + 1) / 2;
|
||||||
break;
|
break;
|
||||||
|
case 5: // Northeast
|
||||||
|
left = inWidth - outWidth;
|
||||||
|
break;
|
||||||
|
case 6: // Southeast
|
||||||
|
left = inWidth - outWidth;
|
||||||
|
top = inHeight - outHeight;
|
||||||
|
case 7: // Southwest
|
||||||
|
top = inHeight - outHeight;
|
||||||
|
case 8: // Northwest
|
||||||
|
break;
|
||||||
default: // Centre
|
default: // Centre
|
||||||
left = (inWidth - outWidth + 1) / 2;
|
left = (inWidth - outWidth + 1) / 2;
|
||||||
top = (inHeight - outHeight + 1) / 2;
|
top = (inHeight - outHeight + 1) / 2;
|
||||||
|
@ -9,76 +9,119 @@ sharp.cache(0);
|
|||||||
|
|
||||||
describe('Crop gravities', function() {
|
describe('Crop gravities', function() {
|
||||||
|
|
||||||
it('North', function(done) {
|
var testSettings = [
|
||||||
sharp(fixtures.inputJpg)
|
{
|
||||||
.resize(320, 80)
|
name: 'North',
|
||||||
.crop(sharp.gravity.north)
|
width: 320,
|
||||||
.toBuffer(function(err, data, info) {
|
height: 80,
|
||||||
if (err) throw err;
|
gravity: sharp.gravity.north,
|
||||||
assert.strictEqual(320, info.width);
|
fixture: 'gravity-north.jpg'
|
||||||
assert.strictEqual(80, info.height);
|
},
|
||||||
fixtures.assertSimilar(fixtures.expected('gravity-north.jpg'), data, done);
|
{
|
||||||
});
|
name: 'East',
|
||||||
});
|
width: 80,
|
||||||
|
height: 320,
|
||||||
|
gravity: sharp.gravity.east,
|
||||||
|
fixture: 'gravity-east.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'South',
|
||||||
|
width: 320,
|
||||||
|
height: 80,
|
||||||
|
gravity: sharp.gravity.south,
|
||||||
|
fixture: 'gravity-south.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'West',
|
||||||
|
width: 80,
|
||||||
|
height: 320,
|
||||||
|
gravity: sharp.gravity.west,
|
||||||
|
fixture: 'gravity-west.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Center',
|
||||||
|
width: 320,
|
||||||
|
height: 80,
|
||||||
|
gravity: sharp.gravity.center,
|
||||||
|
fixture: 'gravity-center.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Centre',
|
||||||
|
width: 80,
|
||||||
|
height: 320,
|
||||||
|
gravity: sharp.gravity.centre,
|
||||||
|
fixture: 'gravity-centre.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Northeast',
|
||||||
|
width: 320,
|
||||||
|
height: 80,
|
||||||
|
gravity: sharp.gravity.northeast,
|
||||||
|
fixture: 'gravity-north.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Northeast',
|
||||||
|
width: 80,
|
||||||
|
height: 320,
|
||||||
|
gravity: sharp.gravity.northeast,
|
||||||
|
fixture: 'gravity-east.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Southeast',
|
||||||
|
width: 320,
|
||||||
|
height: 80,
|
||||||
|
gravity: sharp.gravity.southeast,
|
||||||
|
fixture: 'gravity-south.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Southeast',
|
||||||
|
width: 80,
|
||||||
|
height: 320,
|
||||||
|
gravity: sharp.gravity.southeast,
|
||||||
|
fixture: 'gravity-east.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Southwest',
|
||||||
|
width: 320,
|
||||||
|
height: 80,
|
||||||
|
gravity: sharp.gravity.southwest,
|
||||||
|
fixture: 'gravity-south.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Southwest',
|
||||||
|
width: 80,
|
||||||
|
height: 320,
|
||||||
|
gravity: sharp.gravity.southwest,
|
||||||
|
fixture: 'gravity-west.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Northwest',
|
||||||
|
width: 320,
|
||||||
|
height: 80,
|
||||||
|
gravity: sharp.gravity.northwest,
|
||||||
|
fixture: 'gravity-north.jpg'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Northwest',
|
||||||
|
width: 80,
|
||||||
|
height: 320,
|
||||||
|
gravity: sharp.gravity.northwest,
|
||||||
|
fixture: 'gravity-west.jpg'
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
it('East', function(done) {
|
testSettings.forEach(function(settings) {
|
||||||
sharp(fixtures.inputJpg)
|
it(settings.name, function(done) {
|
||||||
.resize(80, 320)
|
sharp(fixtures.inputJpg)
|
||||||
.crop(sharp.gravity.east)
|
.resize(settings.width, settings.height)
|
||||||
.toBuffer(function(err, data, info) {
|
.crop(settings.gravity)
|
||||||
if (err) throw err;
|
.toBuffer(function(err, data, info) {
|
||||||
assert.strictEqual(80, info.width);
|
if (err) throw err;
|
||||||
assert.strictEqual(320, info.height);
|
assert.strictEqual(settings.width, info.width);
|
||||||
fixtures.assertSimilar(fixtures.expected('gravity-east.jpg'), data, done);
|
assert.strictEqual(settings.height, info.height);
|
||||||
});
|
fixtures.assertSimilar(fixtures.expected(settings.fixture), data, done);
|
||||||
});
|
});
|
||||||
|
});
|
||||||
it('South', function(done) {
|
|
||||||
sharp(fixtures.inputJpg)
|
|
||||||
.resize(320, 80)
|
|
||||||
.crop(sharp.gravity.south)
|
|
||||||
.toBuffer(function(err, data, info) {
|
|
||||||
if (err) throw err;
|
|
||||||
assert.strictEqual(320, info.width);
|
|
||||||
assert.strictEqual(80, info.height);
|
|
||||||
fixtures.assertSimilar(fixtures.expected('gravity-south.jpg'), data, done);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('West', function(done) {
|
|
||||||
sharp(fixtures.inputJpg)
|
|
||||||
.resize(80, 320)
|
|
||||||
.crop(sharp.gravity.west)
|
|
||||||
.toBuffer(function(err, data, info) {
|
|
||||||
if (err) throw err;
|
|
||||||
assert.strictEqual(80, info.width);
|
|
||||||
assert.strictEqual(320, info.height);
|
|
||||||
fixtures.assertSimilar(fixtures.expected('gravity-west.jpg'), data, done);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Center', function(done) {
|
|
||||||
sharp(fixtures.inputJpg)
|
|
||||||
.resize(320, 80)
|
|
||||||
.crop(sharp.gravity.center)
|
|
||||||
.toBuffer(function(err, data, info) {
|
|
||||||
if (err) throw err;
|
|
||||||
assert.strictEqual(320, info.width);
|
|
||||||
assert.strictEqual(80, info.height);
|
|
||||||
fixtures.assertSimilar(fixtures.expected('gravity-center.jpg'), data, done);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Centre', function(done) {
|
|
||||||
sharp(fixtures.inputJpg)
|
|
||||||
.resize(80, 320)
|
|
||||||
.crop(sharp.gravity.centre)
|
|
||||||
.toBuffer(function(err, data, info) {
|
|
||||||
if (err) throw err;
|
|
||||||
assert.strictEqual(80, info.width);
|
|
||||||
assert.strictEqual(320, info.height);
|
|
||||||
fixtures.assertSimilar(fixtures.expected('gravity-centre.jpg'), data, done);
|
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('allows specifying the gravity as a string', function(done) {
|
it('allows specifying the gravity as a string', function(done) {
|
||||||
@ -95,7 +138,7 @@ describe('Crop gravities', function() {
|
|||||||
|
|
||||||
it('Invalid number', function() {
|
it('Invalid number', function() {
|
||||||
assert.throws(function() {
|
assert.throws(function() {
|
||||||
sharp(fixtures.inputJpg).crop(5);
|
sharp(fixtures.inputJpg).crop(9);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user