You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
1.7 KiB
64 lines
1.7 KiB
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; |
|
} |
|
});
|
|
|