CLI supports CMY ColorNegative split mode
This commit is contained in:
parent
66a4e97af1
commit
7ba696a9a8
|
|
@ -30,5 +30,6 @@ export declare class CLI {
|
|||
private forward;
|
||||
private backward;
|
||||
private rgb;
|
||||
private colorNegative;
|
||||
private parseDimensions;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -22,10 +22,11 @@ var Actions;
|
|||
Actions[Actions["RGB"] = 1] = "RGB";
|
||||
Actions[Actions["INVERT"] = 2] = "INVERT";
|
||||
Actions[Actions["IRGB"] = 3] = "IRGB";
|
||||
Actions[Actions["DELAY"] = 4] = "DELAY";
|
||||
Actions[Actions["FORWARD"] = 5] = "FORWARD";
|
||||
Actions[Actions["BACKWARD"] = 6] = "BACKWARD";
|
||||
Actions[Actions["GOTO"] = 7] = "GOTO";
|
||||
Actions[Actions["CN"] = 4] = "CN";
|
||||
Actions[Actions["DELAY"] = 5] = "DELAY";
|
||||
Actions[Actions["FORWARD"] = 6] = "FORWARD";
|
||||
Actions[Actions["BACKWARD"] = 7] = "BACKWARD";
|
||||
Actions[Actions["GOTO"] = 8] = "GOTO";
|
||||
})(Actions || (Actions = {}));
|
||||
class CLI {
|
||||
constructor() {
|
||||
|
|
@ -167,6 +168,9 @@ class CLI {
|
|||
case 'IRGB':
|
||||
cmd.action = Actions.IRGB;
|
||||
break;
|
||||
case 'CN':
|
||||
cmd.action = Actions.CN;
|
||||
break;
|
||||
case 'D':
|
||||
cmd.action = Actions.DELAY;
|
||||
cmd.time = 1000;
|
||||
|
|
@ -217,6 +221,17 @@ class CLI {
|
|||
];
|
||||
}
|
||||
break;
|
||||
case Actions.CN:
|
||||
if (parts.length > 1)
|
||||
cmd.file = parts[1].trim();
|
||||
if (parts.length > 4) {
|
||||
cmd.times = [
|
||||
parseInt(parts[2]),
|
||||
parseInt(parts[3]),
|
||||
parseInt(parts[4])
|
||||
];
|
||||
}
|
||||
break;
|
||||
case Actions.FORWARD:
|
||||
if (parts.length > 1)
|
||||
cmd.count = parseInt(parts[1]);
|
||||
|
|
@ -249,6 +264,9 @@ class CLI {
|
|||
case Actions.IRGB:
|
||||
await this.rgb(cmd, true);
|
||||
break;
|
||||
case Actions.CN:
|
||||
await this.colorNegative(cmd);
|
||||
break;
|
||||
case Actions.FORWARD:
|
||||
await this.forward(cmd);
|
||||
break;
|
||||
|
|
@ -407,6 +425,85 @@ class CLI {
|
|||
}
|
||||
await this.camera.close();
|
||||
}
|
||||
async colorNegative(cmd) {
|
||||
const start = Date.now();
|
||||
let result;
|
||||
let channels;
|
||||
const stats = await (0, promises_1.lstat)(cmd.file);
|
||||
const img = await files_1.Files.getImageObject(cmd.file, stats);
|
||||
const info = await this.ffprobe.info(cmd.file);
|
||||
let dimensions;
|
||||
this.display.setSource(info.width, info.height);
|
||||
if (this.altDimensions !== null) {
|
||||
this.display.setOffsetX(this.altDimensions.x);
|
||||
this.display.setOffsetY(this.altDimensions.y);
|
||||
this.display.setWidth(this.altDimensions.w);
|
||||
this.display.setHeight(this.altDimensions.h);
|
||||
}
|
||||
dimensions = this.display.getOutgoingPosition();
|
||||
this.log.info(`CN: ${img.name}`);
|
||||
await this.camera.direction(true);
|
||||
try {
|
||||
channels = await this.image.colorNegative(img.path);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error getting temp files for channels`, err);
|
||||
}
|
||||
//cyan
|
||||
try {
|
||||
await this.fd.load(channels.red, dimensions.x, dimensions.y, dimensions.w, dimensions.h);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error loading red channel for display`, err);
|
||||
}
|
||||
try {
|
||||
await this.camera.open();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error opening camera`, err);
|
||||
}
|
||||
try {
|
||||
result = await this.fd.display(channels.red, [cmd.times[0]]);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error displaying red channel`, err);
|
||||
}
|
||||
//magenta
|
||||
try {
|
||||
await this.fd.load(channels.green, dimensions.x, dimensions.y, dimensions.w, dimensions.h);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error loading green channel`, err);
|
||||
}
|
||||
try {
|
||||
result = await this.fd.display(channels.green, [cmd.times[1]]);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error displaying green channel`, err);
|
||||
}
|
||||
//yellow
|
||||
try {
|
||||
await this.fd.load(channels.blue, dimensions.x, dimensions.y, dimensions.w, dimensions.h);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error loading blue channel`, err);
|
||||
}
|
||||
try {
|
||||
result = await this.fd.display(channels.blue, [cmd.times[2]]);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error displaying blue channel`, err);
|
||||
}
|
||||
try {
|
||||
await (0, promises_1.unlink)(channels.red);
|
||||
await (0, promises_1.unlink)(channels.green);
|
||||
await (0, promises_1.unlink)(channels.blue);
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error cleaning up temp channel files`, err);
|
||||
}
|
||||
await this.camera.close();
|
||||
}
|
||||
parseDimensions(dimensionsStr) {
|
||||
if (dimensionsStr === null)
|
||||
return null;
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1,7 +1,8 @@
|
|||
export declare enum fiMode {
|
||||
RGB = 0,
|
||||
IRGB = 1,
|
||||
INVERT = 2
|
||||
INVERT = 2,
|
||||
COLORNEGATIVE = 3
|
||||
}
|
||||
export declare class FilmoutImage {
|
||||
private log;
|
||||
|
|
@ -9,4 +10,5 @@ export declare class FilmoutImage {
|
|||
constructor(bin: string);
|
||||
rgb(image: string, red: string, green: string, blue: string, invert?: boolean): Promise<void>;
|
||||
invert(image: string, inverted: string): Promise<void>;
|
||||
colorNegative(image: string, red: string, green: string, blue: string): Promise<void>;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ var fiMode;
|
|||
fiMode[fiMode["RGB"] = 0] = "RGB";
|
||||
fiMode[fiMode["IRGB"] = 1] = "IRGB";
|
||||
fiMode[fiMode["INVERT"] = 2] = "INVERT";
|
||||
fiMode[fiMode["COLORNEGATIVE"] = 3] = "COLORNEGATIVE";
|
||||
})(fiMode || (exports.fiMode = fiMode = {}));
|
||||
class FilmoutImage {
|
||||
constructor(bin) {
|
||||
|
|
@ -48,6 +49,24 @@ class FilmoutImage {
|
|||
this.log.error(`Error executing ${cmd.join(' ')}`, err);
|
||||
}
|
||||
}
|
||||
async colorNegative(image, red, green, blue) {
|
||||
const cmd = [
|
||||
this.bin,
|
||||
image,
|
||||
'-m', fiMode.COLORNEGATIVE,
|
||||
'-r', red,
|
||||
'-g', green,
|
||||
'-b', blue
|
||||
];
|
||||
this.log.info(`Executing: ${cmd.join(' ')}`);
|
||||
const shell = new shell_1.Shell(cmd, null, function (stdio) { console.log(stdio); }, null, null, true);
|
||||
try {
|
||||
await shell.execute();
|
||||
}
|
||||
catch (err) {
|
||||
this.log.error(`Error executing ${cmd.join(' ')}`, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
exports.FilmoutImage = FilmoutImage;
|
||||
module.exports = { FilmoutImage };
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fi/index.ts"],"names":[],"mappings":";;;AACA,gCAAkC;AAClC,oCAAiC;AAEjC,IAAY,MAIX;AAJD,WAAY,MAAM;IACjB,iCAAO,CAAA;IACP,mCAAQ,CAAA;IACR,uCAAU,CAAA;AACX,CAAC,EAJW,MAAM,sBAAN,MAAM,QAIjB;AAED,MAAa,YAAY;IAIxB,YAAa,GAAY;QACxB,IAAI,CAAC,GAAG,GAAG,IAAA,eAAS,EAAC,IAAI,CAAC,CAAC;QAC3B,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,GAAG,CAAE,KAAc,EAAE,GAAY,EAAE,KAAc,EAAE,IAAa,EAAE,SAAmB,KAAK;QACtG,MAAM,GAAG,GAAW;YACnB,IAAI,CAAC,GAAG;YACR,KAAK;YACL,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG;YACvC,IAAI,EAAE,GAAG;YACT,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI;SACV,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAW,IAAI,aAAK,CAAC,GAAG,EAAE,IAAI,EAAE,UAAS,KAAc,IAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE9G,IAAI,CAAC;YACJ,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;IAEM,KAAK,CAAC,MAAM,CAAE,KAAc,EAAE,QAAiB;QACrD,MAAM,GAAG,GAAW;YACnB,IAAI,CAAC,GAAG;YACR,KAAK;YACL,IAAI,EAAE,MAAM,CAAC,MAAM;YACnB,IAAI,EAAE,QAAQ;SACd,CAAC;QACF,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,eAAe,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9C,MAAM,KAAK,GAAW,IAAI,aAAK,CAAC,GAAG,EAAE,IAAI,EAAE,UAAS,KAAc,IAAG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAE9G,IAAI,CAAC;YACJ,MAAM,KAAK,CAAC,OAAO,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,mBAAmB,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;QACzD,CAAC;IACF,CAAC;CACD;AA5CD,oCA4CC;AAED,MAAM,CAAC,OAAO,GAAG,EAAE,YAAY,EAAE,CAAC"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/fi/index.ts"],"names":[],"mappings":"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"}
|
||||
|
|
@ -14,4 +14,5 @@ export declare class Image {
|
|||
gray(width: number, height: number): Promise<Buffer>;
|
||||
invert(image: string): Promise<string>;
|
||||
rgb(image: string, invert?: boolean): Promise<Channels>;
|
||||
colorNegative(image: string): Promise<Channels>;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -127,6 +127,26 @@ class Image {
|
|||
}
|
||||
return { red, green, blue };
|
||||
}
|
||||
async colorNegative(image) {
|
||||
let red;
|
||||
let green;
|
||||
let blue;
|
||||
try {
|
||||
red = await this.tmp.mktemp('tif');
|
||||
green = await this.tmp.mktemp('tif');
|
||||
blue = await this.tmp.mktemp('tif');
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
try {
|
||||
await this.fi.colorNegative(image, red, green, blue);
|
||||
}
|
||||
catch (err) {
|
||||
throw err;
|
||||
}
|
||||
return { red, green, blue };
|
||||
}
|
||||
}
|
||||
exports.Image = Image;
|
||||
module.exports = { Image };
|
||||
|
|
|
|||
|
|
@ -1 +1 @@
|
|||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/image/index.ts"],"names":[],"mappings":"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"}
|
||||
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/image/index.ts"],"names":[],"mappings":"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"}
|
||||
104
src/cli/index.ts
104
src/cli/index.ts
|
|
@ -27,6 +27,7 @@ enum Actions {
|
|||
RGB,
|
||||
INVERT,
|
||||
IRGB,
|
||||
CN,
|
||||
DELAY,
|
||||
FORWARD,
|
||||
BACKWARD,
|
||||
|
|
@ -237,6 +238,9 @@ export class CLI {
|
|||
case 'IRGB' :
|
||||
cmd.action = Actions.IRGB;
|
||||
break;
|
||||
case 'CN' :
|
||||
cmd.action = Actions.CN;
|
||||
break;
|
||||
case 'D':
|
||||
cmd.action = Actions.DELAY;
|
||||
cmd.time = 1000;
|
||||
|
|
@ -282,6 +286,16 @@ export class CLI {
|
|||
];
|
||||
}
|
||||
break;
|
||||
case Actions.CN :
|
||||
if (parts.length > 1) cmd.file = parts[1].trim();
|
||||
if (parts.length > 4) {
|
||||
cmd.times = [
|
||||
parseInt(parts[2]),
|
||||
parseInt(parts[3]),
|
||||
parseInt(parts[4])
|
||||
];
|
||||
}
|
||||
break;
|
||||
case Actions.FORWARD :
|
||||
if (parts.length > 1) cmd.count = parseInt(parts[1]);
|
||||
break;
|
||||
|
|
@ -313,6 +327,9 @@ export class CLI {
|
|||
case Actions.IRGB :
|
||||
await this.rgb(cmd, true);
|
||||
break;
|
||||
case Actions.CN :
|
||||
await this.colorNegative(cmd);
|
||||
break;
|
||||
case Actions.FORWARD :
|
||||
await this.forward(cmd);
|
||||
break;
|
||||
|
|
@ -490,6 +507,93 @@ export class CLI {
|
|||
await this.camera.close();
|
||||
}
|
||||
|
||||
private async colorNegative (cmd : CMD) {
|
||||
const start : number = Date.now();
|
||||
let result : fdResult;
|
||||
let channels : Channels;
|
||||
|
||||
const stats : Stats = await lstat(cmd.file);
|
||||
const img : ImageObject = await Files.getImageObject(cmd.file, stats);
|
||||
const info : VideoInfo = await this.ffprobe.info(cmd.file);
|
||||
let dimensions : fdOutgoingPosition;
|
||||
|
||||
this.display.setSource(info.width, info.height);
|
||||
|
||||
if (this.altDimensions !== null) {
|
||||
this.display.setOffsetX(this.altDimensions.x);
|
||||
this.display.setOffsetY(this.altDimensions.y);
|
||||
this.display.setWidth(this.altDimensions.w);
|
||||
this.display.setHeight(this.altDimensions.h);
|
||||
}
|
||||
|
||||
dimensions = this.display.getOutgoingPosition();
|
||||
|
||||
this.log.info(`CN: ${img.name}`);
|
||||
|
||||
await this.camera.direction(true);
|
||||
|
||||
try {
|
||||
channels = await this.image.colorNegative(img.path);
|
||||
} catch (err) {
|
||||
this.log.error(`Error getting temp files for channels`, err);
|
||||
}
|
||||
|
||||
//cyan
|
||||
try {
|
||||
await this.fd.load(channels.red, dimensions.x, dimensions.y, dimensions.w, dimensions.h);
|
||||
} catch (err) {
|
||||
this.log.error(`Error loading red channel for display`, err);
|
||||
}
|
||||
|
||||
try {
|
||||
await this.camera.open();
|
||||
} catch (err) {
|
||||
this.log.error(`Error opening camera`, err);
|
||||
}
|
||||
|
||||
try {
|
||||
result = await this.fd.display(channels.red, [ cmd.times[0] ] );
|
||||
} catch (err) {
|
||||
this.log.error(`Error displaying red channel`, err);
|
||||
}
|
||||
|
||||
//magenta
|
||||
try {
|
||||
await this.fd.load(channels.green, dimensions.x, dimensions.y, dimensions.w, dimensions.h);
|
||||
} catch (err) {
|
||||
this.log.error(`Error loading green channel`, err);
|
||||
}
|
||||
|
||||
try {
|
||||
result = await this.fd.display(channels.green, [ cmd.times[1] ] );
|
||||
} catch (err) {
|
||||
this.log.error(`Error displaying green channel`, err);
|
||||
}
|
||||
|
||||
//yellow
|
||||
try {
|
||||
await this.fd.load(channels.blue, dimensions.x, dimensions.y, dimensions.w, dimensions.h);
|
||||
} catch (err) {
|
||||
this.log.error(`Error loading blue channel`, err);
|
||||
}
|
||||
|
||||
try {
|
||||
result = await this.fd.display(channels.blue, [ cmd.times[2] ] );
|
||||
} catch (err) {
|
||||
this.log.error(`Error displaying blue channel`, err);
|
||||
}
|
||||
|
||||
try {
|
||||
await unlink(channels.red);
|
||||
await unlink(channels.green);
|
||||
await unlink(channels.blue);
|
||||
} catch (err) {
|
||||
this.log.error(`Error cleaning up temp channel files`, err);
|
||||
}
|
||||
|
||||
await this.camera.close();
|
||||
}
|
||||
|
||||
private parseDimensions (dimensionsStr : string | null) : fdOutgoingPosition | null {
|
||||
if (dimensionsStr === null) return null;
|
||||
let parts : string[] = dimensionsStr.trim().split(',');
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ import { Shell } from '../shell';
|
|||
export enum fiMode {
|
||||
RGB = 0,
|
||||
IRGB = 1,
|
||||
INVERT = 2
|
||||
INVERT = 2,
|
||||
COLORNEGATIVE = 3
|
||||
}
|
||||
|
||||
export class FilmoutImage {
|
||||
|
|
@ -52,6 +53,25 @@ export class FilmoutImage {
|
|||
this.log.error(`Error executing ${cmd.join(' ')}`, err);
|
||||
}
|
||||
}
|
||||
|
||||
public async colorNegative (image : string, red : string, green : string, blue : string) {
|
||||
const cmd : any[] = [
|
||||
this.bin,
|
||||
image,
|
||||
'-m', fiMode.COLORNEGATIVE,
|
||||
'-r', red,
|
||||
'-g', green,
|
||||
'-b', blue
|
||||
];
|
||||
this.log.info(`Executing: ${cmd.join(' ')}`);
|
||||
const shell : Shell = new Shell(cmd, null, function(stdio : string){ console.log(stdio); }, null, null, true);
|
||||
|
||||
try {
|
||||
await shell.execute();
|
||||
} catch (err) {
|
||||
this.log.error(`Error executing ${cmd.join(' ')}`, err);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { FilmoutImage };
|
||||
|
|
@ -133,6 +133,28 @@ export class Image {
|
|||
|
||||
return { red, green, blue };
|
||||
}
|
||||
|
||||
public async colorNegative (image : string) : Promise<Channels> {
|
||||
let red : string;
|
||||
let green : string;
|
||||
let blue : string;
|
||||
|
||||
try {
|
||||
red = await this.tmp.mktemp('tif');
|
||||
green = await this.tmp.mktemp('tif');
|
||||
blue = await this.tmp.mktemp('tif');
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
try {
|
||||
await this.fi.colorNegative(image, red, green, blue);
|
||||
} catch (err) {
|
||||
throw err;
|
||||
}
|
||||
|
||||
return { red, green, blue };
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = { Image };
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
|
|
@ -3,3 +3,6 @@ I,test/grayscale_43.jpg,1500
|
|||
E,test/grayscale_43.jpg,1000
|
||||
RGB,test/grayscale_43.jpg,1000,2000,3000
|
||||
IRGB,test/grayscale_43.jpg,3000,2000,1000
|
||||
RGB,test/RGB.png,1000,1000,1000
|
||||
CN,test/grayscale_43.jpg,2000,1000,500
|
||||
CN,test/RGB.png,300,400,500
|
||||
|
|
|
|||
Loading…
Reference in New Issue