CLI supports CMY ColorNegative split mode

This commit is contained in:
Matt McWilliams 2026-06-06 14:47:46 -04:00
parent 66a4e97af1
commit 7ba696a9a8
14 changed files with 298 additions and 9 deletions

1
dist/cli/index.d.ts vendored
View File

@ -30,5 +30,6 @@ export declare class CLI {
private forward;
private backward;
private rgb;
private colorNegative;
private parseDimensions;
}

105
dist/cli/index.js vendored
View File

@ -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

4
dist/fi/index.d.ts vendored
View File

@ -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>;
}

19
dist/fi/index.js vendored
View File

@ -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 };

View File

@ -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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"}

View File

@ -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>;
}

20
dist/image/index.js vendored
View File

@ -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 };

View File

@ -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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"}

View File

@ -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(',');

View File

@ -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 };

View File

@ -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 };

BIN
test/RGB.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

View File

@ -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