From 58e8cdc8d3da403c37476c80f7d9d3ca0a8c4d34 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Thu, 29 Oct 2020 22:45:02 +0000 Subject: [PATCH] Add annotate-image node --- utility/annotate-image/LICENSE | 14 ++ utility/annotate-image/README.md | 72 ++++++++ .../annotate-image/SourceSansPro-Regular.ttf | Bin 0 -> 149508 bytes utility/annotate-image/annotate.html | 165 ++++++++++++++++++ utility/annotate-image/annotate.js | 155 ++++++++++++++++ utility/annotate-image/package.json | 26 +++ 6 files changed, 432 insertions(+) create mode 100644 utility/annotate-image/LICENSE create mode 100644 utility/annotate-image/README.md create mode 100644 utility/annotate-image/SourceSansPro-Regular.ttf create mode 100644 utility/annotate-image/annotate.html create mode 100644 utility/annotate-image/annotate.js create mode 100644 utility/annotate-image/package.json diff --git a/utility/annotate-image/LICENSE b/utility/annotate-image/LICENSE new file mode 100644 index 00000000..f5b60114 --- /dev/null +++ b/utility/annotate-image/LICENSE @@ -0,0 +1,14 @@ +Copyright 2016 JS Foundation and other contributors, https://js.foundation/ +Copyright 2013-2016 IBM Corp. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/utility/annotate-image/README.md b/utility/annotate-image/README.md new file mode 100644 index 00000000..d541563a --- /dev/null +++ b/utility/annotate-image/README.md @@ -0,0 +1,72 @@ +node-red-node-annotate-image +================== + +A Node-RED node that can annotate +a JPEG image. + +The node is currently limited to drawing rectangles and circles over the image. +That can be used, for example, to annotate an image with bounding boxes of features +detected in the image by a TensorFlow node. + +Install +------- + +Run the following command in your Node-RED user directory - typically `~/.node-red` + + npm install node-red-node-annotate-image + + +Usage +----- + +The JPEG image should be passed to the node as a Buffer object under `msg.payload`. + +The annotations are provided in msg.annotations and are applied in order. + +Each annotation is an object with the following properties: + + - `type` (*string*) : the type of the annotation - `rect` or `circle` + - `x`/`y` (*number*) : the top-left corner of a `rect` annotation, or the center of a `circle` annotation. + - `w`/`h` (*number*) : the width and height of a `rect` annotation + - `r` (*number*) : the radius of a `circle` annotation + - `bbox` (*array*) : this can be used instead of `x`, `y`, `w`, `h` and `r`. + It should be an array of four values giving the bounding box of the annotation: + `[x, y, w, h]`. + - `label` (*string*) : an optional piece of text to label the annotation with + - `stroke` (*string*) : the color of the annotation. Default: `#ffC000` + - `lineWidth` (*number*) : the stroke width used to draw the annotation. Default: `5` + - `fontSize` (*number*) : the font size to use for the label. Default: `24` + - `fontColor` (*string*) : the color of the font to use for the label. Default: `#ffC000` + + +Examples +-------- + +```javascript +msg.annotations = [ { + type: "rect", + x: 10, y: 10, w: 50, h: 50, + label: "hello" +}] +``` +```javascript +msg.annotations = [ + { + type: "circle", + x: 50, y: 50, r: 20, + lineWidth: 10 + + }, + { + type: "rect", + x: 30, y: 30, w: 40, h: 40, + stroke: "blue" + } +] +``` +```javascript +msg.annotations = [ { + type: "rect", + bbox: [ 10, 10, 50, 50] +}] +``` diff --git a/utility/annotate-image/SourceSansPro-Regular.ttf b/utility/annotate-image/SourceSansPro-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..24962c7c87d684a76190c65cbd4629c75eeb4551 GIT binary patch literal 149508 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 literal 0 HcmV?d00001 diff --git a/utility/annotate-image/annotate.html b/utility/annotate-image/annotate.html new file mode 100644 index 00000000..efc18e25 --- /dev/null +++ b/utility/annotate-image/annotate.html @@ -0,0 +1,165 @@ + + + + + + diff --git a/utility/annotate-image/annotate.js b/utility/annotate-image/annotate.js new file mode 100644 index 00000000..ea5edb75 --- /dev/null +++ b/utility/annotate-image/annotate.js @@ -0,0 +1,155 @@ +module.exports = function(RED) { + "use strict"; + const pureimage = require("pureimage"); + const Readable = require("stream").Readable; + const Writable = require("stream").Writable; + const path = require("path"); + + let fontLoaded = false; + function loadFont() { + if (!fontLoaded) { + const fnt = pureimage.registerFont(path.join(__dirname,'./SourceSansPro-Regular.ttf'),'Source Sans Pro'); + fnt.load(); + fontLoaded = true; + } + } + + function AnnotateNode(n) { + RED.nodes.createNode(this,n); + var node = this; + const defaultFill = n.fill || ""; + const defaultStroke = n.stroke || "#ffC000"; + const defaultLineWidth = parseInt(n.lineWidth) || 5; + const defaultFontSize = n.fontSize || 24; + const defaultFontColor = n.fontColor || "#ffC000" + loadFont(); + + this.on("input", function(msg) { + if (Buffer.isBuffer(msg.payload)) { + if (msg.payload[0] !== 0xFF || msg.payload[1] !== 0xD8) { + node.error("Not a JPEG image",msg); + } else if (Array.isArray(msg.annotations) && msg.annotations.length > 0) { + const stream = new Readable(); + stream.push(msg.payload); + stream.push(null); + pureimage.decodeJPEGFromStream(stream).then(img => { + const c = pureimage.make(img.width, img.height); + const ctx = c.getContext('2d'); + ctx.drawImage(img,0,0,img.width,img.height); + + ctx.lineJoin = 'bevel'; + + msg.annotations.forEach(function(annotation) { + ctx.fillStyle = annotation.fill || defaultFill; + ctx.strokeStyle = annotation.stroke || defaultStroke; + ctx.lineWidth = annotation.lineWidth || defaultLineWidth; + ctx.lineJoin = 'bevel'; + let x,y,r,w,h; + switch(annotation.type) { + case 'rect': + if (annotation.bbox) { + x = annotation.bbox[0] + y = annotation.bbox[1] + w = annotation.bbox[2] + h = annotation.bbox[3] + } else { + x = annotation.x + y = annotation.y + w = annotation.w + h = annotation.h + } + + if (x < 0) { + w += x; + x = 0; + } + if (y < 0) { + h += y; + y = 0; + } + ctx.beginPath(); + ctx.lineWidth = annotation.lineWidth || defaultLineWidth; + ctx.rect(x,y,w,h); + ctx.closePath(); + ctx.stroke(); + + if (annotation.label) { + ctx.font = `${annotation.fontSize || defaultFontSize}pt 'Source Sans Pro'`; + ctx.fillStyle = annotation.fontColor || defaultFontColor; + ctx.textBaseline = "top"; + ctx.textAlign = "left"; + ctx.fillText(annotation.label, x+2,y) + } + break; + case 'circle': + if (annotation.bbox) { + x = annotation.bbox[0] + annotation.bbox[2]/2 + y = annotation.bbox[1] + annotation.bbox[3]/2 + r = Math.min(annotation.bbox[2],annotation.bbox[3])/2; + } else { + x = annotation.x + y = annotation.y + r = annotation.r; + } + ctx.beginPath(); + ctx.lineWidth = annotation.lineWidth || defaultLineWidth; + ctx.arc(x,y,r,0,Math.PI*2); + ctx.closePath(); + ctx.stroke(); + if (annotation.label) { + ctx.font = `${annotation.fontSize || defaultFontSize}pt 'Source Sans Pro'`; + ctx.fillStyle = annotation.fontColor || defaultFontColor; + ctx.textBaseline = "middle"; + ctx.textAlign = "center"; + ctx.fillText(annotation.label, x+2,y) + } + break; + } + }); + const bufferOutput = getWritableBuffer(); + pureimage.encodeJPEGToStream(c,bufferOutput.stream,90).then(() => { + msg.payload = bufferOutput.getBuffer(); + node.send(msg); + }) + }).catch(err => { + node.error(err,msg); + }) + } else { + // No annotations to make - send the message on + node.send(msg); + } + } else { + node.error("Payload not a Buffer",msg) + } + return msg; + }); + } + RED.nodes.registerType("annotate-image",AnnotateNode); + + + + function getWritableBuffer() { + var currentSize = 0; + var buffer = null; + const stream = new Writable({ + write(chunk, encoding, callback) { + if (!buffer) { + buffer = Buffer.from(chunk); + } else { + var newBuffer = Buffer.allocUnsafe(currentSize + chunk.length); + buffer.copy(newBuffer); + chunk.copy(newBuffer,currentSize); + buffer = newBuffer; + } + currentSize += chunk.length + callback(); + } + }); + return { + stream: stream, + getBuffer: function() { + return buffer; + } + } + } +} diff --git a/utility/annotate-image/package.json b/utility/annotate-image/package.json new file mode 100644 index 00000000..48b164f3 --- /dev/null +++ b/utility/annotate-image/package.json @@ -0,0 +1,26 @@ +{ + "name": "node-red-node-annotate-image", + "version": "0.1.0", + "description": "A Node-RED node that can annotate an image", + "dependencies": { + "pureimage": "^0.2.5" + }, + "repository": { + "type": "git", + "url": "https://github.com/node-red/node-red-nodes/tree/master/utility/iamge-annotate" + }, + "license": "Apache-2.0", + "keywords": [ + "node-red" + ], + "node-red": { + "nodes": { + "annotate": "annotate.js" + } + }, + "contributors": [ + { + "name": "Nick O'Leary" + } + ] +} \ No newline at end of file