Replace color with another one pixel by pixel.
replace-color
replaces color with another one pixel by pixel. Especially this will be helpful if you want to remove the watermarks from the images. This package is built on top of Jimp.
npm install --save replace-color
replace-color
supports both Node.js error-first callbacks and promises. The package returns a Jimp's instance which you can use to execute some other image manipulations methods or save it with Jimp's write
method.
const replaceColor = require('replace-color')
replaceColor({
image: './input.jpg',
colors: {
type: 'hex',
targetColor: '#FF0000',
replaceColor: '#FFFFFF'
}
}, (err, jimpObject) => {
if (err) return console.log(err)
jimpObject.write('./output.jpg', (err) => {
if (err) return console.log(err)
})
})
const replaceColor = require('replace-color')
replaceColor({
image: './input.jpg',
colors: {
type: 'hex',
targetColor: '#FF0000',
replaceColor: '#FFFFFF'
}
})
.then((jimpObject) => {
jimpObject.write('./output.jpg', (err) => {
if (err) return console.log(err)
})
})
.catch((err) => {
console.log(err)
})
options
Object (required) - the options.
image
Buffer | Object | String (required) - an image being processed. It can be a buffer, Jimp's instance, a path to an image on your host machine or a URL address to an image on the internet. Please, take a look at the tests to understand all these options.colors
Object (required) - the colors.
type
String (required) - a targetColor
and replaceColor
type. Supported values are hex
and rgb
.targetColor
String | Array (required) - a color you want to replace. A 7-symbol string in case of hex
type (e.g. #000000
, #FFFFFF
). An array of 3
integers from 0
to 255
in case of rgb
type (e.g. [0, 0, 0]
, [255, 255, 255]
).replaceColor
String | Array (required) - a new color which will be used instead of a targetColor
color. A 7-symbol string in case of hex
type (e.g. #000000
, #FFFFFF
). An array of 3
integers from 0
to 255
in case of rgb
type (e.g. [0, 0, 0]
, [255, 255, 255]
). You can also define a transparent channel for a replaceColor
color. To achieve this, you can use a 9-symbol string in case of hex
type (e.g. #00000000
, #FFFFFFFF
). Based on this Stack Overflow answer, an alpha channel is controlled by the first pair of digits in a hex code (e.g., 00
means fully transparent, 7F
means 50%, FF
means fully opaque). Also, you can use an array of 4
integers in case of rgb
type. The first 3
integers must be from 0
to 255
and the last one must be from 0
to 1
(e.g., 0
means fully transparent, 0.5
means 50%, 1
means fully opaque).formula
String (optional) - one of the three formulas to calculate the color difference. Supported values are E76
, E94
and E00
. The default value is E00
(the best algorithm).deltaE
Number (optional) - a deltaE
value which corresponds to a JND. The default value is 2.3
. Please, read more about deltaE
here. Generaly speaking, if the processed by the replace-color
package image still has the watermarks, you should increase the deltaE
value.callback
Function (optional) - a Node.js error-first callback.Let's try to remove a watermark from this picture.
const replaceColor = require('replace-color')
replaceColor({
image: 'https://i.imgur.com/XqNTuzp.jpg',
colors: {
type: 'hex',
targetColor: '#FFB3B7',
replaceColor: '#FFFFFF'
},
deltaE: 20
})
.then((jimpObject) => {
jimpObject.write('./output.jpg', (err) => {
if (err) return console.log(err)
})
})
.catch((err) => {
console.log(err)
})
Let's try to change a background color for this picture.
const replaceColor = require('replace-color')
replaceColor({
image: 'https://i.imgur.com/aCxZpaq.png',
colors: {
type: 'hex',
targetColor: '#66AE74',
replaceColor: '#63A4FF'
},
deltaE: 10
})
.then((jimpObject) => {
jimpObject.write('./output.png', (err) => {
if (err) return console.log(err)
})
})
.catch((err) => {
console.log(err)
})
hex
type)Let's try to change a background color for this picture.
const replaceColor = require('replace-color')
replaceColor({
image: 'https://i.imgur.com/aCxZpaq.png',
colors: {
type: 'hex',
targetColor: '#66AE74',
replaceColor: '#00000000'
},
deltaE: 10
})
.then((jimpObject) => {
jimpObject.write('./output.png', (err) => {
if (err) return console.log(err)
})
})
.catch((err) => {
console.log(err)
})
rgb
type)Let's try to change a background color for this picture.
const replaceColor = require('replace-color')
replaceColor({
image: 'https://i.imgur.com/aCxZpaq.png',
colors: {
type: 'rgb',
targetColor: [102, 174, 116],
replaceColor: [102, 174, 116, 0.5]
},
deltaE: 10
})
.then((jimpObject) => {
jimpObject.write('./output.png', (err) => {
if (err) return console.log(err)
})
})
.catch((err) => {
console.log(err)
})
To indicate the replace-color
's errors you should use the err instanceof replaceColor.ReplaceColorError
class.
replaceColor({}, (err, jimpObject) => {
if (err instanceof replaceColor.ReplaceColorError) {
// A replace-color's error occurred.
} else if (err) {
// An unknown error occurred.
}
// Everything went fine.
})
A replace-color
's error
instance has the code
and field
properties. For now, the package has two codes: PARAMETER_INVALID
and PARAMETER_REQUIRED
. The field
property shows which exact property was not passed or is invalid using the glob notation (e.g. options.colors.type
). Please, take a look at the tests to see all the possible cases.