Add paint bucket module (#556)

* Add paint-bucket

* Add tolerance input
This commit is contained in:
Mridul97
2019-01-22 18:33:42 +05:30
committed by Jeffrey Warren
parent 17d79c4b44
commit 4fd814dd95
7 changed files with 340 additions and 43 deletions

View File

@@ -50956,7 +50956,7 @@ function deflate(strm, flush) {
(!s.gzhead.extra ? 0 : 4) +
(!s.gzhead.name ? 0 : 8) +
(!s.gzhead.comment ? 0 : 16)
);
);
put_byte(s, s.gzhead.time & 0xff);
put_byte(s, (s.gzhead.time >> 8) & 0xff);
put_byte(s, (s.gzhead.time >> 16) & 0xff);
@@ -53681,6 +53681,8 @@ module.exports = {
// misrepresented as being the original software.
// 3. This notice may not be removed or altered from any source distribution.
/* eslint-disable space-unary-ops */
var utils = require('../utils/common');
/* Public constants ==========================================================*/
@@ -65611,7 +65613,7 @@ ImageSequencer = function ImageSequencer(options) {
}
module.exports = ImageSequencer;
},{"./AddStep":153,"./ExportBin":154,"./FormatInput":155,"./InsertStep":157,"./Modules":158,"./ReplaceImage":159,"./Run":160,"./SavedSequences.json":162,"./ui/LoadImage":256,"./ui/SetInputStep":257,"./ui/UserInterface":258,"./util/getStep.js":261,"fs":11}],157:[function(require,module,exports){
},{"./AddStep":153,"./ExportBin":154,"./FormatInput":155,"./InsertStep":157,"./Modules":158,"./ReplaceImage":159,"./Run":160,"./SavedSequences.json":162,"./ui/LoadImage":260,"./ui/SetInputStep":261,"./ui/UserInterface":262,"./util/getStep.js":265,"fs":11}],157:[function(require,module,exports){
const getStepUtils = require('./util/getStep.js');
// insert one or more steps at a given index in the sequencer
@@ -65678,7 +65680,7 @@ function InsertStep(ref, image, index, name, o) {
}
module.exports = InsertStep;
},{"./util/getStep.js":261}],158:[function(require,module,exports){
},{"./util/getStep.js":265}],158:[function(require,module,exports){
/*
* Core modules and their info files
*/
@@ -65706,6 +65708,7 @@ module.exports = {
'invert': require('image-sequencer-invert'),
'ndvi': require('./modules/Ndvi'),
'ndvi-colormap': require('./modules/NdviColormap'),
'paint-bucket': require('./modules/PaintBucket'),
'overlay': require('./modules/Overlay'),
'resize': require('./modules/Resize'),
'rotate': require('./modules/Rotate'),
@@ -65713,7 +65716,7 @@ module.exports = {
'white-balance': require('./modules/WhiteBalance')
}
},{"./modules/Average":164,"./modules/Blend":167,"./modules/Blur":171,"./modules/Brightness":174,"./modules/Channel":177,"./modules/Colorbar":180,"./modules/Colormap":184,"./modules/Contrast":188,"./modules/Convolution":192,"./modules/Crop":197,"./modules/DecodeQr":200,"./modules/Dither":204,"./modules/DrawRectangle":208,"./modules/Dynamic":211,"./modules/EdgeDetect":215,"./modules/FisheyeGl":218,"./modules/GammaCorrection":221,"./modules/Gradient":224,"./modules/Histogram":227,"./modules/ImportImage":231,"./modules/Ndvi":235,"./modules/NdviColormap":238,"./modules/Overlay":241,"./modules/Resize":244,"./modules/Rotate":247,"./modules/Saturation":250,"./modules/WhiteBalance":253,"image-sequencer-invert":46}],159:[function(require,module,exports){
},{"./modules/Average":164,"./modules/Blend":167,"./modules/Blur":171,"./modules/Brightness":174,"./modules/Channel":177,"./modules/Colorbar":180,"./modules/Colormap":184,"./modules/Contrast":188,"./modules/Convolution":192,"./modules/Crop":197,"./modules/DecodeQr":200,"./modules/Dither":204,"./modules/DrawRectangle":208,"./modules/Dynamic":211,"./modules/EdgeDetect":215,"./modules/FisheyeGl":218,"./modules/GammaCorrection":221,"./modules/Gradient":224,"./modules/Histogram":227,"./modules/ImportImage":231,"./modules/Ndvi":235,"./modules/NdviColormap":238,"./modules/Overlay":241,"./modules/PaintBucket":245,"./modules/Resize":248,"./modules/Rotate":251,"./modules/Saturation":254,"./modules/WhiteBalance":257,"image-sequencer-invert":46}],159:[function(require,module,exports){
// Uses a given image as input and replaces it with the output.
// Works only in the browser.
function ReplaceImage(ref,selector,steps,options) {
@@ -65869,7 +65872,7 @@ function Run(ref, json_q, callback, ind, progressObj) {
}
module.exports = Run;
},{"./RunToolkit":161,"./util/getStep.js":261}],161:[function(require,module,exports){
},{"./RunToolkit":161,"./util/getStep.js":265}],161:[function(require,module,exports){
const getPixels = require('get-pixels');
const pixelManipulation = require('./modules/_nomodule/PixelManipulation');
const lodash = require('lodash');
@@ -65884,7 +65887,7 @@ module.exports = function(input) {
input.savePixels = savePixels;
return input;
}
},{"./modules/_nomodule/PixelManipulation":255,"data-uri-to-buffer":21,"get-pixels":32,"lodash":60,"save-pixels":127}],162:[function(require,module,exports){
},{"./modules/_nomodule/PixelManipulation":259,"data-uri-to-buffer":21,"get-pixels":32,"lodash":60,"save-pixels":127}],162:[function(require,module,exports){
module.exports={"sample":[{"name":"invert","options":{}},{"name":"channel","options":{"channel":"red"}},{"name":"blur","options":{"blur":"5"}}]}
},{}],163:[function(require,module,exports){
/*
@@ -65964,7 +65967,7 @@ module.exports = function Average(options, UI){
}
}
},{"../_nomodule/PixelManipulation.js":255}],164:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],164:[function(require,module,exports){
module.exports = [
require('./Module'),
require('./info.json')
@@ -66053,7 +66056,7 @@ module.exports = function Dynamic(options, UI, util) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"get-pixels":32}],167:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"get-pixels":32}],167:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":166,"./info.json":168,"dup":164}],168:[function(require,module,exports){
module.exports={
@@ -66209,7 +66212,7 @@ module.exports = function Blur(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"./Blur":169}],171:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./Blur":169}],171:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":170,"./info.json":172,"dup":164}],172:[function(require,module,exports){
module.exports={
@@ -66286,7 +66289,7 @@ module.exports = function Brightness(options,UI){
}
}
},{"../_nomodule/PixelManipulation.js":255}],174:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],174:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":173,"./info.json":175,"dup":164}],175:[function(require,module,exports){
module.exports={
@@ -66355,7 +66358,7 @@ module.exports = function Channel(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255}],177:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],177:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":176,"./info.json":178,"dup":164}],178:[function(require,module,exports){
module.exports={
@@ -66668,7 +66671,7 @@ module.exports = function Colormap(options,UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"./Colormap":182}],184:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./Colormap":182}],184:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":183,"./info.json":185,"dup":164}],185:[function(require,module,exports){
module.exports={
@@ -66784,7 +66787,7 @@ module.exports = function Contrast(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"./Contrast":186}],188:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./Contrast":186}],188:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":187,"./info.json":189,"dup":164}],189:[function(require,module,exports){
module.exports={
@@ -66922,7 +66925,7 @@ module.exports = function Convolution(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"./Convolution":190}],192:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./Convolution":190}],192:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":191,"./info.json":193,"dup":164}],193:[function(require,module,exports){
module.exports={
@@ -67090,7 +67093,7 @@ module.exports = function CropModule(options, UI) {
}
}
},{"../../util/ParseInputCoordinates":260,"./Crop":194,"./Ui.js":196}],196:[function(require,module,exports){
},{"../../util/ParseInputCoordinates":264,"./Crop":194,"./Ui.js":196}],196:[function(require,module,exports){
// hide on save
module.exports = function CropModuleUi(step, ui) {
@@ -67395,7 +67398,7 @@ module.exports = function Dither(options, UI){
UI: UI
}
}
},{"../_nomodule/PixelManipulation.js":255,"./Dither":202}],204:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./Dither":202}],204:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":203,"./info.json":205,"dup":164}],205:[function(require,module,exports){
module.exports={
@@ -67495,7 +67498,7 @@ module.exports = function DrawRectangle(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"./DrawRectangle":206}],208:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./DrawRectangle":206}],208:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":207,"./info.json":209,"dup":164}],209:[function(require,module,exports){
module.exports={
@@ -67641,7 +67644,7 @@ module.exports = function Dynamic(options,UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255}],211:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],211:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":210,"./info.json":212,"dup":164}],212:[function(require,module,exports){
module.exports={
@@ -67907,7 +67910,7 @@ module.exports = function edgeDetect(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"./EdgeUtils":213,"ndarray-gaussian-filter":65}],215:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./EdgeUtils":213,"ndarray-gaussian-filter":65}],215:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":214,"./info.json":216,"dup":164}],216:[function(require,module,exports){
module.exports={
@@ -68125,7 +68128,7 @@ module.exports = function Gamma(options,UI){
}
}
},{"../_nomodule/PixelManipulation.js":255}],221:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],221:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":220,"./info.json":222,"dup":164}],222:[function(require,module,exports){
module.exports={
@@ -68311,7 +68314,7 @@ module.exports = function Channel(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255}],227:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],227:[function(require,module,exports){
module.exports = [
require('./Module.js'),
require('./info.json')
@@ -68393,7 +68396,7 @@ module.exports = function ImportImageModule(options, UI) {
}
}
},{"../../util/GetFormat":259,"./Ui.js":230}],230:[function(require,module,exports){
},{"../../util/GetFormat":263,"./Ui.js":230}],230:[function(require,module,exports){
// hide on save
module.exports = function ImportImageModuleUi(step, ui) {
@@ -68525,7 +68528,7 @@ module.exports = function Ndvi(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"./Ui.js":234}],234:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"./Ui.js":234}],234:[function(require,module,exports){
// hide on save
module.exports = function CropModuleUi(step, ui) {
@@ -68682,7 +68685,7 @@ module.exports = function Dynamic(options, UI, util) {
}
}
},{"../../util/ParseInputCoordinates":260,"../_nomodule/PixelManipulation.js":255,"get-pixels":32}],241:[function(require,module,exports){
},{"../../util/ParseInputCoordinates":264,"../_nomodule/PixelManipulation.js":259,"get-pixels":32}],241:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":240,"./info.json":242,"dup":164}],242:[function(require,module,exports){
module.exports={
@@ -68708,6 +68711,154 @@ module.exports={
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md"
}
},{}],243:[function(require,module,exports){
module.exports = function PaintBucket(options, UI) {
var output;
function draw(input, callback, progressObj) {
progressObj.stop(true);
progressObj.overrideFlag = true;
var step = this;
function changePixel(r, g, b, a) {
return [r, g, b, a]
}
function extraManipulation(pixels) {
pixels = require('./PaintBucket')(pixels, options)
return pixels
}
function output(image, datauri, mimetype) {
// This output is accesible by Image Sequencer
step.output = { src: datauri, format: mimetype };
}
return require('../_nomodule/PixelManipulation.js')(input, {
output: output,
changePixel: changePixel,
extraManipulation: extraManipulation,
format: input.format,
image: options.image,
inBrowser: options.inBrowser,
callback: callback
});
}
return {
options: options,
draw: draw,
output: output,
UI: UI
}
}
},{"../_nomodule/PixelManipulation.js":259,"./PaintBucket":244}],244:[function(require,module,exports){
module.exports = exports = function(pixels, options){
var fillColor = options.fillColor || '100 100 100 255',
x = parseInt(options.startingX) || 10,
y = parseInt(options.startingY) || 10,
height = pixels.shape[1],
width = pixels.shape[0],
r = pixels.get(x, y, 0),
g = pixels.get(x,y,1),
b = pixels.get(x,y,2),
a = pixels.get(x, y, 3),
queuex = [x],
queuey = [y],
curry, currx,
north,
south,
n,
tolerance = parseInt(options.tolerance) || 10,
maxFactor = (1 + tolerance/100),
minFactor = (1 - tolerance/100);
fillColor = fillColor.split(" ");
function isSimilar(currx, curry){
return (pixels.get(currx, curry, 0) > r*minFactor && pixels.get(currx, curry, 0) < r*maxFactor &&
pixels.get(currx, curry, 1) > g*minFactor && pixels.get(currx, curry, 1) < g*maxFactor &&
pixels.get(currx, curry, 2) > b*minFactor && pixels.get(currx, curry, 2) < b*maxFactor &&
pixels.get(currx, curry, 3) > a*minFactor && pixels.get(currx, curry, 3) < a*maxFactor);
}
while (queuey.length) {
currx = queuex.pop()
curry = queuey.pop()
if (isSimilar(currx, curry)) {
north = south = curry
do {
north -= 1
} while (isSimilar(currx, north) && north >= 0)
do {
south += 1
} while (isSimilar(currx, south) && south < height)
for (n = north + 1; n < south; n += 1) {
pixels.set(currx, n, 0, fillColor[0]);
pixels.set(currx, n, 1, fillColor[1]);
pixels.set(currx, n, 2, fillColor[2]);
pixels.set(currx, n, 3, fillColor[3]);
if (isSimilar(currx - 1, n)) {
queuex.push(currx - 1)
queuey.push(n)
}
if (isSimilar(currx + 1, n)) {
queuex.push(currx + 1)
queuey.push(n)
}
}
}
}
return pixels;
}
},{}],245:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":243,"./info.json":246,"dup":164}],246:[function(require,module,exports){
module.exports={
"name": "PaintBucket",
"description": "Fill color in pixels",
"inputs": {
"startingX": {
"type": "integer",
"desc": "value of the starting x-coordinate",
"default": "10"
},
"startingY": {
"type": "integer",
"desc": "value of the starting y-coordinate",
"default": "10"
},
"fillColor": {
"type": "String",
"desc": "four space separated numbers representing the RGBA values of fill-color",
"default": "100 100 100 255",
"placeholder": "100 100 100 255"
},
"tolerance": {
"type": "range",
"desc": "% tolerance",
"default": "10",
"min": "5",
"max": "15",
"step": "1"
}
}
}
},{}],247:[function(require,module,exports){
/*
* Resize the image by given percentage value
*/
@@ -68780,9 +68931,9 @@ module.exports = function Resize(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"imagejs":47}],244:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"imagejs":47}],248:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":243,"./info.json":245,"dup":164}],245:[function(require,module,exports){
},{"./Module":247,"./info.json":249,"dup":164}],249:[function(require,module,exports){
module.exports={
"name": "Resize",
"description": "Resize image by given percentage value",
@@ -68795,7 +68946,7 @@ module.exports={
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md"
}
},{}],246:[function(require,module,exports){
},{}],250:[function(require,module,exports){
/*
* Rotates image
*/
@@ -68859,9 +69010,9 @@ module.exports = function Rotate(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255,"imagejs":47}],247:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259,"imagejs":47}],251:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":246,"./info.json":248,"dup":164}],248:[function(require,module,exports){
},{"./Module":250,"./info.json":252,"dup":164}],252:[function(require,module,exports){
module.exports={
"name": "Rotate",
"description": "Rotates image by specified degrees",
@@ -68877,7 +69028,7 @@ module.exports={
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md"
}
},{}],249:[function(require,module,exports){
},{}],253:[function(require,module,exports){
/*
* Saturate an image with a value from 0 to 1
*/
@@ -68935,9 +69086,9 @@ module.exports = function Saturation(options,UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255}],250:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],254:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":249,"./info.json":251,"dup":164}],251:[function(require,module,exports){
},{"./Module":253,"./info.json":255,"dup":164}],255:[function(require,module,exports){
module.exports={
"name": "Saturation",
"description": "Change the saturation of the image by given value, from 0-1, with 1 being 100% saturated.",
@@ -68954,7 +69105,7 @@ module.exports={
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md"
}
},{}],252:[function(require,module,exports){
},{}],256:[function(require,module,exports){
module.exports = function Balance(options, UI) {
var output;
@@ -69041,9 +69192,9 @@ module.exports = function Balance(options, UI) {
}
}
},{"../_nomodule/PixelManipulation.js":255}],253:[function(require,module,exports){
},{"../_nomodule/PixelManipulation.js":259}],257:[function(require,module,exports){
arguments[4][164][0].apply(exports,arguments)
},{"./Module":252,"./info.json":254,"dup":164}],254:[function(require,module,exports){
},{"./Module":256,"./info.json":258,"dup":164}],258:[function(require,module,exports){
module.exports={
"name": "White Balance",
"description": "Change the colour balance of the image by adjusting the colour temperature.",
@@ -69056,7 +69207,7 @@ module.exports={
},
"docs-link":"https://github.com/publiclab/image-sequencer/blob/main/docs/MODULES.md"
}
},{}],255:[function(require,module,exports){
},{}],259:[function(require,module,exports){
(function (process,Buffer){
/*
* General purpose per-pixel manipulation
@@ -69157,7 +69308,7 @@ module.exports = function PixelManipulation(image, options) {
};
}).call(this,require('_process'),require("buffer").Buffer)
},{"_process":114,"buffer":12,"get-pixels":32,"pace":79,"save-pixels":127}],256:[function(require,module,exports){
},{"_process":114,"buffer":12,"get-pixels":32,"pace":79,"save-pixels":127}],260:[function(require,module,exports){
// special module to load an image into the start of the sequence; used in the HTML UI
function LoadImage(ref, name, src, main_callback) {
function makeImage(datauri) {
@@ -69264,7 +69415,7 @@ function LoadImage(ref, name, src, main_callback) {
module.exports = LoadImage;
},{"urify":149}],257:[function(require,module,exports){
},{"urify":149}],261:[function(require,module,exports){
// TODO: potentially move this into ImportImage module
function setInputStepInit() {
@@ -69363,7 +69514,7 @@ function setInputStepInit() {
}
module.exports = setInputStepInit;
},{}],258:[function(require,module,exports){
},{}],262:[function(require,module,exports){
/*
* User Interface Handling Module
*/
@@ -69427,7 +69578,7 @@ module.exports = function UserInterface(events = {}) {
}
},{}],259:[function(require,module,exports){
},{}],263:[function(require,module,exports){
/*
* Determine format from a URL or data-url, return "jpg" "png" "gif" etc
* TODO: write a test for this using the examples
@@ -69469,7 +69620,7 @@ module.exports = function GetFormat(src) {
}
},{}],260:[function(require,module,exports){
},{}],264:[function(require,module,exports){
module.exports = function parseCornerCoordinateInputs(options,coord,callback) {
var getPixels = require('get-pixels');
getPixels(coord.src, function(err, pixels) {
@@ -69494,7 +69645,7 @@ module.exports = function parseCornerCoordinateInputs(options,coord,callback) {
callback(options, coord);
})
}
},{"get-pixels":32}],261:[function(require,module,exports){
},{"get-pixels":32}],265:[function(require,module,exports){
module.exports = {
getPreviousStep: function() {
return this.getStep(-1);