12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- import { isNodePattern } from '@jimp/utils';
- /**
- * Creates a circle out of an image.
- * @param {function(Error, Jimp)} options (optional)
- * opacity - opacity of the shadow between 0 and 1
- * size,- of the shadow
- * blur - how blurry the shadow is
- * x- x position of shadow
- * y - y position of shadow
- * @param {function(Error, Jimp)} cb (optional) a callback for when complete
- * @returns {Jimp} this for chaining of methods
- */
- export default () => ({
- shadow(options = {}, cb) {
- if (typeof options === 'function') {
- cb = options;
- options = {};
- }
- const { opacity = 0.7, size = 1.1, x = -25, y = 25, blur = 5 } = options;
- // clone the image
- const orig = this.clone();
- const shadow = this.clone();
- // turn all it's pixels black
- shadow.scan(
- 0,
- 0,
- shadow.bitmap.width,
- shadow.bitmap.height,
- (x, y, idx) => {
- shadow.bitmap.data[idx] = 0x00;
- shadow.bitmap.data[idx + 1] = 0x00;
- shadow.bitmap.data[idx + 2] = 0x00;
- // up the opacity a little,
- shadow.bitmap.data[idx + 3] = shadow.constructor.limit255(
- shadow.bitmap.data[idx + 3] * opacity
- );
- this.bitmap.data[idx] = 0x00;
- this.bitmap.data[idx + 1] = 0x00;
- this.bitmap.data[idx + 2] = 0x00;
- this.bitmap.data[idx + 3] = 0x00;
- }
- );
- // enlarge it. This creates a "shadow".
- shadow
- .resize(shadow.bitmap.width * size, shadow.bitmap.height * size)
- .blur(blur);
- // Then blit the "shadow" onto the background and the image on top of that.
- this.composite(shadow, x, y);
- this.composite(orig, 0, 0);
- if (isNodePattern(cb)) {
- cb.call(this, null, this);
- }
- return this;
- }
- });
|