@mediaproc/image 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +529 -67
- package/dist/cli.js +22 -0
- package/dist/cli.js.map +1 -1
- package/dist/commands/affine.d.ts +3 -0
- package/dist/commands/affine.d.ts.map +1 -0
- package/dist/commands/affine.js +154 -0
- package/dist/commands/affine.js.map +1 -0
- package/dist/commands/auto-orient.d.ts +3 -0
- package/dist/commands/auto-orient.d.ts.map +1 -0
- package/dist/commands/auto-orient.js +106 -0
- package/dist/commands/auto-orient.js.map +1 -0
- package/dist/commands/boolean.d.ts +3 -0
- package/dist/commands/boolean.d.ts.map +1 -0
- package/dist/commands/boolean.js +153 -0
- package/dist/commands/boolean.js.map +1 -0
- package/dist/commands/dilate.d.ts +3 -0
- package/dist/commands/dilate.d.ts.map +1 -0
- package/dist/commands/dilate.js +139 -0
- package/dist/commands/dilate.js.map +1 -0
- package/dist/commands/erode.d.ts +3 -0
- package/dist/commands/erode.d.ts.map +1 -0
- package/dist/commands/erode.js +139 -0
- package/dist/commands/erode.js.map +1 -0
- package/dist/commands/flatten.d.ts +3 -0
- package/dist/commands/flatten.d.ts.map +1 -0
- package/dist/commands/flatten.js +130 -0
- package/dist/commands/flatten.js.map +1 -0
- package/dist/commands/flop.d.ts +3 -0
- package/dist/commands/flop.d.ts.map +1 -0
- package/dist/commands/flop.js +87 -0
- package/dist/commands/flop.js.map +1 -0
- package/dist/commands/linear.d.ts +3 -0
- package/dist/commands/linear.d.ts.map +1 -0
- package/dist/commands/linear.js +133 -0
- package/dist/commands/linear.js.map +1 -0
- package/dist/commands/recomb.d.ts +3 -0
- package/dist/commands/recomb.d.ts.map +1 -0
- package/dist/commands/recomb.js +146 -0
- package/dist/commands/recomb.js.map +1 -0
- package/dist/commands/threshold.d.ts +3 -0
- package/dist/commands/threshold.d.ts.map +1 -0
- package/dist/commands/threshold.js +126 -0
- package/dist/commands/threshold.js.map +1 -0
- package/dist/commands/unflatten.d.ts +3 -0
- package/dist/commands/unflatten.d.ts.map +1 -0
- package/dist/commands/unflatten.js +105 -0
- package/dist/commands/unflatten.js.map +1 -0
- package/dist/register.d.ts.map +1 -1
- package/dist/register.js +22 -0
- package/dist/register.js.map +1 -1
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -38,6 +38,17 @@ import { metadataCommand } from './commands/metadata-cmd.js';
|
|
|
38
38
|
import { stackCommand } from './commands/stack.js';
|
|
39
39
|
import { mirrorCommand } from './commands/mirror.js';
|
|
40
40
|
import { dominantColorCommand } from './commands/dominant-color.js';
|
|
41
|
+
import { flopCommand } from './commands/flop.js';
|
|
42
|
+
import { autoOrientCommand } from './commands/auto-orient.js';
|
|
43
|
+
import { affineCommand } from './commands/affine.js';
|
|
44
|
+
import { thresholdCommand } from './commands/threshold.js';
|
|
45
|
+
import { flattenCommand } from './commands/flatten.js';
|
|
46
|
+
import { unflattenCommand } from './commands/unflatten.js';
|
|
47
|
+
import { dilateCommand } from './commands/dilate.js';
|
|
48
|
+
import { erodeCommand } from './commands/erode.js';
|
|
49
|
+
import { booleanCommand } from './commands/boolean.js';
|
|
50
|
+
import { linearCommand } from './commands/linear.js';
|
|
51
|
+
import { recombCommand } from './commands/recomb.js';
|
|
41
52
|
const program = new Command();
|
|
42
53
|
program
|
|
43
54
|
.name('mediaproc-image')
|
|
@@ -82,6 +93,17 @@ metadataCommand(program);
|
|
|
82
93
|
stackCommand(program);
|
|
83
94
|
mirrorCommand(program);
|
|
84
95
|
dominantColorCommand(program);
|
|
96
|
+
flopCommand(program);
|
|
97
|
+
autoOrientCommand(program);
|
|
98
|
+
affineCommand(program);
|
|
99
|
+
thresholdCommand(program);
|
|
100
|
+
flattenCommand(program);
|
|
101
|
+
unflattenCommand(program);
|
|
102
|
+
dilateCommand(program);
|
|
103
|
+
erodeCommand(program);
|
|
104
|
+
booleanCommand(program);
|
|
105
|
+
linearCommand(program);
|
|
106
|
+
recombCommand(program);
|
|
85
107
|
program.parse(process.argv);
|
|
86
108
|
if (!process.argv.slice(2).length) {
|
|
87
109
|
program.outputHelp();
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAC3D,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAC5D,OAAO,EAAE,eAAe,EAAE,MAAM,wBAAwB,CAAC;AACzD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4BAA4B,CAAC;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AACrD,OAAO,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"affine.d.ts","sourceRoot":"","sources":["../../src/commands/affine.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA2JrD"}
|
|
@@ -0,0 +1,154 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { createSharpInstance } from '../utils/sharp.js';
|
|
6
|
+
import { createStandardHelp } from '../utils/helpFormatter.js';
|
|
7
|
+
export function affineCommand(imageCmd) {
|
|
8
|
+
const cmd = imageCmd
|
|
9
|
+
.command('affine <input>')
|
|
10
|
+
.description('Apply affine transformation matrix')
|
|
11
|
+
.option('--matrix <values>', 'Affine matrix [a,b,c,d] or 6 values', '[1,0,0,1]')
|
|
12
|
+
.option('--background <color>', 'Background color (default: transparent)', 'transparent')
|
|
13
|
+
.option('--interpolator <type>', 'Interpolator: nearest, bilinear, bicubic, nohalo, lbb, vsqbs (default: bilinear)', 'bilinear')
|
|
14
|
+
.option('-o, --output <path>', 'Output file path')
|
|
15
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
|
|
16
|
+
.option('--dry-run', 'Show what would be done without executing')
|
|
17
|
+
.option('-v, --verbose', 'Verbose output');
|
|
18
|
+
cmd.addHelpText('after', () => {
|
|
19
|
+
return '\n' + createStandardHelp({
|
|
20
|
+
commandName: 'affine',
|
|
21
|
+
emoji: '🔢',
|
|
22
|
+
description: 'Apply affine transformation using a 2x2 matrix. Enables custom scaling, rotation, shearing, and reflection transformations.',
|
|
23
|
+
usage: [
|
|
24
|
+
'affine <input> --matrix "[1,0,0,1]"',
|
|
25
|
+
'affine <input> --matrix "[2,0,0,2]" (2x scale)',
|
|
26
|
+
'affine <input> --matrix "[1,0.5,0,1]" (shear)'
|
|
27
|
+
],
|
|
28
|
+
options: [
|
|
29
|
+
{ flag: '--matrix <values>', description: 'Affine matrix [a,b,c,d] as JSON array' },
|
|
30
|
+
{ flag: '--background <color>', description: 'Background color for empty areas' },
|
|
31
|
+
{ flag: '--interpolator <type>', description: 'Interpolation method (default: bilinear)' },
|
|
32
|
+
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-affine.<ext>)' },
|
|
33
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
34
|
+
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
35
|
+
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
36
|
+
],
|
|
37
|
+
examples: [
|
|
38
|
+
{ command: 'affine image.jpg --matrix "[2,0,0,2]"', description: 'Scale 2x in both directions' },
|
|
39
|
+
{ command: 'affine photo.jpg --matrix "[1,0.5,0,1]"', description: 'Horizontal shear' },
|
|
40
|
+
{ command: 'affine pic.jpg --matrix "[1,0,0,-1]"', description: 'Vertical flip via matrix' },
|
|
41
|
+
{ command: 'affine image.jpg --matrix "[0.5,0,0,0.5]" --interpolator bicubic', description: 'Downscale 0.5x with quality' }
|
|
42
|
+
],
|
|
43
|
+
additionalSections: [
|
|
44
|
+
{
|
|
45
|
+
title: 'Matrix Format',
|
|
46
|
+
items: [
|
|
47
|
+
'[a, b, c, d] where:',
|
|
48
|
+
'a: horizontal scaling',
|
|
49
|
+
'b: horizontal shearing',
|
|
50
|
+
'c: vertical shearing',
|
|
51
|
+
'd: vertical scaling',
|
|
52
|
+
'Identity matrix [1,0,0,1] = no change'
|
|
53
|
+
]
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
title: 'Common Transformations',
|
|
57
|
+
items: [
|
|
58
|
+
'Scale 2x: [2,0,0,2]',
|
|
59
|
+
'Scale 0.5x: [0.5,0,0,0.5]',
|
|
60
|
+
'Horizontal flip: [-1,0,0,1]',
|
|
61
|
+
'Vertical flip: [1,0,0,-1]',
|
|
62
|
+
'Horizontal shear: [1,0.5,0,1]',
|
|
63
|
+
'Vertical shear: [1,0,0.5,1]'
|
|
64
|
+
]
|
|
65
|
+
},
|
|
66
|
+
{
|
|
67
|
+
title: 'Interpolators',
|
|
68
|
+
items: [
|
|
69
|
+
'nearest: Fastest, lowest quality',
|
|
70
|
+
'bilinear: Good balance (default)',
|
|
71
|
+
'bicubic: Higher quality, slower',
|
|
72
|
+
'nohalo: Excellent quality',
|
|
73
|
+
'lbb: Lanczos-based best',
|
|
74
|
+
'vsqbs: Very high quality'
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
],
|
|
78
|
+
tips: [
|
|
79
|
+
'For simple rotation, use rotate command instead',
|
|
80
|
+
'Use bicubic or nohalo for high-quality transforms',
|
|
81
|
+
'Background color matters for rotations/shears'
|
|
82
|
+
]
|
|
83
|
+
});
|
|
84
|
+
});
|
|
85
|
+
cmd.action(async (input, options) => {
|
|
86
|
+
const spinner = ora('Processing image...').start();
|
|
87
|
+
try {
|
|
88
|
+
if (!fs.existsSync(input)) {
|
|
89
|
+
spinner.fail(chalk.red(`Input file not found: ${input}`));
|
|
90
|
+
process.exit(1);
|
|
91
|
+
}
|
|
92
|
+
// Parse matrix
|
|
93
|
+
const matrixStr = options.matrix || '[1,0,0,1]';
|
|
94
|
+
let matrix;
|
|
95
|
+
try {
|
|
96
|
+
matrix = JSON.parse(matrixStr);
|
|
97
|
+
if (!Array.isArray(matrix) || (matrix.length !== 4 && matrix.length !== 6)) {
|
|
98
|
+
throw new Error('Matrix must have 4 or 6 values');
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
catch (e) {
|
|
102
|
+
spinner.fail(chalk.red('Invalid matrix format. Use JSON array like [1,0,0,1]'));
|
|
103
|
+
process.exit(1);
|
|
104
|
+
}
|
|
105
|
+
const inputPath = path.parse(input);
|
|
106
|
+
const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-affine${inputPath.ext}`);
|
|
107
|
+
if (options.verbose) {
|
|
108
|
+
spinner.info(chalk.blue('Configuration:'));
|
|
109
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
110
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
111
|
+
console.log(chalk.dim(` Matrix: [${matrix.join(', ')}]`));
|
|
112
|
+
console.log(chalk.dim(` Interpolator: ${options.interpolator || 'bilinear'}`));
|
|
113
|
+
spinner.start('Processing...');
|
|
114
|
+
}
|
|
115
|
+
if (options.dryRun) {
|
|
116
|
+
spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
|
|
117
|
+
console.log(chalk.green('✓ Would apply affine transformation:'));
|
|
118
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
119
|
+
console.log(chalk.dim(` Matrix: [${matrix.join(', ')}]`));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const metadata = await createSharpInstance(input).metadata();
|
|
123
|
+
const pipeline = createSharpInstance(input).affine(matrix, {
|
|
124
|
+
background: options.background || 'transparent',
|
|
125
|
+
interpolator: options.interpolator || 'bilinear'
|
|
126
|
+
});
|
|
127
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
128
|
+
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
129
|
+
pipeline.jpeg({ quality: options.quality || 90 });
|
|
130
|
+
}
|
|
131
|
+
else if (outputExt === '.png') {
|
|
132
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
133
|
+
}
|
|
134
|
+
else if (outputExt === '.webp') {
|
|
135
|
+
pipeline.webp({ quality: options.quality || 90 });
|
|
136
|
+
}
|
|
137
|
+
await pipeline.toFile(outputPath);
|
|
138
|
+
const outputStats = fs.statSync(outputPath);
|
|
139
|
+
spinner.succeed(chalk.green('✓ Affine transformation applied successfully!'));
|
|
140
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
141
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
142
|
+
console.log(chalk.dim(` Matrix: [${matrix.join(', ')}]`));
|
|
143
|
+
console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
|
|
144
|
+
console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)} KB`));
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
spinner.fail(chalk.red('Failed to apply affine transformation'));
|
|
148
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
149
|
+
console.error(chalk.red(errorMessage));
|
|
150
|
+
process.exit(1);
|
|
151
|
+
}
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
//# sourceMappingURL=affine.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"affine.js","sourceRoot":"","sources":["../../src/commands/affine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-orient.d.ts","sourceRoot":"","sources":["../../src/commands/auto-orient.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA2GzD"}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { createSharpInstance } from '../utils/sharp.js';
|
|
6
|
+
import { createStandardHelp } from '../utils/helpFormatter.js';
|
|
7
|
+
export function autoOrientCommand(imageCmd) {
|
|
8
|
+
const cmd = imageCmd
|
|
9
|
+
.command('auto-orient <input>')
|
|
10
|
+
.alias('rotate-auto')
|
|
11
|
+
.description('Auto-rotate image based on EXIF orientation')
|
|
12
|
+
.option('-o, --output <path>', 'Output file path')
|
|
13
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
|
|
14
|
+
.option('--dry-run', 'Show what would be done without executing')
|
|
15
|
+
.option('-v, --verbose', 'Verbose output');
|
|
16
|
+
cmd.addHelpText('after', () => {
|
|
17
|
+
return '\n' + createStandardHelp({
|
|
18
|
+
commandName: 'auto-orient',
|
|
19
|
+
emoji: '🧭',
|
|
20
|
+
description: 'Automatically rotate image based on EXIF orientation metadata. Corrects photos taken with rotated cameras.',
|
|
21
|
+
usage: ['auto-orient <input>', 'rotate-auto <input>'],
|
|
22
|
+
options: [
|
|
23
|
+
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-oriented.<ext>)' },
|
|
24
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
25
|
+
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
26
|
+
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
27
|
+
],
|
|
28
|
+
examples: [
|
|
29
|
+
{ command: 'auto-orient photo.jpg', description: 'Auto-correct orientation' },
|
|
30
|
+
{ command: 'rotate-auto image.jpg', description: 'Fix camera rotation (using alias)' },
|
|
31
|
+
{ command: 'auto-orient *.jpg', description: 'Batch fix orientation for all JPGs' }
|
|
32
|
+
],
|
|
33
|
+
additionalSections: [
|
|
34
|
+
{
|
|
35
|
+
title: 'EXIF Orientation',
|
|
36
|
+
items: [
|
|
37
|
+
'1: No rotation needed',
|
|
38
|
+
'3: 180° rotation',
|
|
39
|
+
'6: 90° clockwise (vertical photo)',
|
|
40
|
+
'8: 90° counter-clockwise',
|
|
41
|
+
'Also handles horizontal/vertical flips'
|
|
42
|
+
]
|
|
43
|
+
}
|
|
44
|
+
],
|
|
45
|
+
tips: [
|
|
46
|
+
'Essential for photos from cameras/phones',
|
|
47
|
+
'Removes EXIF orientation tag after correction',
|
|
48
|
+
'Safe to run on already-oriented images'
|
|
49
|
+
]
|
|
50
|
+
});
|
|
51
|
+
});
|
|
52
|
+
cmd.action(async (input, options) => {
|
|
53
|
+
const spinner = ora('Processing image...').start();
|
|
54
|
+
try {
|
|
55
|
+
if (!fs.existsSync(input)) {
|
|
56
|
+
spinner.fail(chalk.red(`Input file not found: ${input}`));
|
|
57
|
+
process.exit(1);
|
|
58
|
+
}
|
|
59
|
+
const inputPath = path.parse(input);
|
|
60
|
+
const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-oriented${inputPath.ext}`);
|
|
61
|
+
const metadata = await createSharpInstance(input).metadata();
|
|
62
|
+
const orientation = metadata.orientation || 1;
|
|
63
|
+
if (options.verbose) {
|
|
64
|
+
spinner.info(chalk.blue('Configuration:'));
|
|
65
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
66
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
67
|
+
console.log(chalk.dim(` EXIF Orientation: ${orientation}`));
|
|
68
|
+
spinner.start('Processing...');
|
|
69
|
+
}
|
|
70
|
+
if (options.dryRun) {
|
|
71
|
+
spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
|
|
72
|
+
console.log(chalk.green('✓ Would auto-orient image:'));
|
|
73
|
+
console.log(chalk.dim(` From: ${input}`));
|
|
74
|
+
console.log(chalk.dim(` To: ${outputPath}`));
|
|
75
|
+
console.log(chalk.dim(` Current orientation: ${orientation}`));
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const pipeline = createSharpInstance(input).rotate(); // rotate() with no args uses EXIF
|
|
79
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
80
|
+
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
81
|
+
pipeline.jpeg({ quality: options.quality || 90 });
|
|
82
|
+
}
|
|
83
|
+
else if (outputExt === '.png') {
|
|
84
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
85
|
+
}
|
|
86
|
+
else if (outputExt === '.webp') {
|
|
87
|
+
pipeline.webp({ quality: options.quality || 90 });
|
|
88
|
+
}
|
|
89
|
+
await pipeline.toFile(outputPath);
|
|
90
|
+
const outputStats = fs.statSync(outputPath);
|
|
91
|
+
spinner.succeed(chalk.green('✓ Image auto-oriented successfully!'));
|
|
92
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
93
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
94
|
+
console.log(chalk.dim(` Original EXIF orientation: ${orientation}`));
|
|
95
|
+
console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
|
|
96
|
+
console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)} KB`));
|
|
97
|
+
}
|
|
98
|
+
catch (error) {
|
|
99
|
+
spinner.fail(chalk.red('Failed to auto-orient image'));
|
|
100
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
101
|
+
console.error(chalk.red(errorMessage));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
//# sourceMappingURL=auto-orient.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"auto-orient.js","sourceRoot":"","sources":["../../src/commands/auto-orient.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.d.ts","sourceRoot":"","sources":["../../src/commands/boolean.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA4JtD"}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import ora from 'ora';
|
|
3
|
+
import path from 'path';
|
|
4
|
+
import fs from 'fs';
|
|
5
|
+
import { createSharpInstance } from '../utils/sharp.js';
|
|
6
|
+
import { createStandardHelp } from '../utils/helpFormatter.js';
|
|
7
|
+
export function booleanCommand(imageCmd) {
|
|
8
|
+
const cmd = imageCmd
|
|
9
|
+
.command('boolean <input>')
|
|
10
|
+
.description('Perform boolean operations between images')
|
|
11
|
+
.requiredOption('--operation <op>', 'Boolean operation: and, or, eor (XOR)')
|
|
12
|
+
.requiredOption('--operand <path>', 'Second image for operation')
|
|
13
|
+
.option('-o, --output <path>', 'Output file path')
|
|
14
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
|
|
15
|
+
.option('--dry-run', 'Show what would be done without executing')
|
|
16
|
+
.option('-v, --verbose', 'Verbose output');
|
|
17
|
+
cmd.addHelpText('after', () => {
|
|
18
|
+
return '\n' +
|
|
19
|
+
createStandardHelp({
|
|
20
|
+
commandName: 'boolean',
|
|
21
|
+
emoji: '⚡',
|
|
22
|
+
description: 'Perform bitwise boolean operations between two images. Combine images using AND, OR, or XOR (EOR) logic.',
|
|
23
|
+
usage: [
|
|
24
|
+
'boolean <input> --operation and --operand mask.png',
|
|
25
|
+
'boolean <input> --operation or --operand overlay.png',
|
|
26
|
+
'boolean <input> --operation eor --operand pattern.png'
|
|
27
|
+
],
|
|
28
|
+
options: [
|
|
29
|
+
{ flag: '--operation <op>', description: 'Operation: and, or, eor (required)' },
|
|
30
|
+
{ flag: '--operand <path>', description: 'Second image path (required)' },
|
|
31
|
+
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-boolean.<ext>)' },
|
|
32
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
33
|
+
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
34
|
+
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
35
|
+
],
|
|
36
|
+
examples: [
|
|
37
|
+
{ command: 'boolean image.jpg --operation and --operand mask.png', description: 'AND operation (extract masked region)' },
|
|
38
|
+
{ command: 'boolean photo.jpg --operation or --operand overlay.png', description: 'OR operation (combine images)' },
|
|
39
|
+
{ command: 'boolean pic.jpg --operation eor --operand pattern.png', description: 'XOR operation (find differences)' }
|
|
40
|
+
],
|
|
41
|
+
additionalSections: [
|
|
42
|
+
{
|
|
43
|
+
title: 'Operations',
|
|
44
|
+
items: [
|
|
45
|
+
'and: Bitwise AND - keeps pixels present in both',
|
|
46
|
+
'or: Bitwise OR - combines pixels from both',
|
|
47
|
+
'eor (XOR): Exclusive OR - highlights differences'
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
title: 'Use Cases',
|
|
52
|
+
items: [
|
|
53
|
+
'AND: Apply masks, extract regions',
|
|
54
|
+
'OR: Combine patterns, merge images',
|
|
55
|
+
'XOR: Detect changes, create patterns',
|
|
56
|
+
'Watermarking and steganography',
|
|
57
|
+
'Image differencing'
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
title: 'Requirements',
|
|
62
|
+
items: [
|
|
63
|
+
'Both images should have same dimensions',
|
|
64
|
+
'Works best with grayscale or similar formats',
|
|
65
|
+
'Output format follows input format',
|
|
66
|
+
'Bitwise operations on pixel values'
|
|
67
|
+
]
|
|
68
|
+
},
|
|
69
|
+
{
|
|
70
|
+
title: 'Tips',
|
|
71
|
+
items: [
|
|
72
|
+
'XOR useful for change detection',
|
|
73
|
+
'AND useful for masking operations',
|
|
74
|
+
'OR useful for compositing',
|
|
75
|
+
'Consider converting to grayscale first'
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
tips: [
|
|
80
|
+
'Images should have matching dimensions',
|
|
81
|
+
'XOR highlights differences between images',
|
|
82
|
+
'AND is useful for applying masks',
|
|
83
|
+
'Results depend on pixel bit patterns'
|
|
84
|
+
]
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
cmd.action(async (input, options) => {
|
|
88
|
+
const spinner = ora('Processing image...').start();
|
|
89
|
+
try {
|
|
90
|
+
if (!fs.existsSync(input)) {
|
|
91
|
+
spinner.fail(chalk.red(`Input file not found: ${input}`));
|
|
92
|
+
process.exit(1);
|
|
93
|
+
}
|
|
94
|
+
if (!options.operand || !fs.existsSync(options.operand)) {
|
|
95
|
+
spinner.fail(chalk.red(`Operand image not found: ${options.operand}`));
|
|
96
|
+
process.exit(1);
|
|
97
|
+
}
|
|
98
|
+
const validOperations = ['and', 'or', 'eor'];
|
|
99
|
+
const operation = options.operation.toLowerCase();
|
|
100
|
+
if (!validOperations.includes(operation)) {
|
|
101
|
+
spinner.fail(chalk.red(`Invalid operation. Use: ${validOperations.join(', ')}`));
|
|
102
|
+
process.exit(1);
|
|
103
|
+
}
|
|
104
|
+
const inputPath = path.parse(input);
|
|
105
|
+
const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-boolean${inputPath.ext}`);
|
|
106
|
+
if (options.verbose) {
|
|
107
|
+
spinner.info(chalk.blue('Configuration:'));
|
|
108
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
109
|
+
console.log(chalk.dim(` Operand: ${options.operand}`));
|
|
110
|
+
console.log(chalk.dim(` Operation: ${operation.toUpperCase()}`));
|
|
111
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
112
|
+
spinner.start('Processing...');
|
|
113
|
+
}
|
|
114
|
+
if (options.dryRun) {
|
|
115
|
+
spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
|
|
116
|
+
console.log(chalk.green('✓ Would perform boolean operation:'));
|
|
117
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
118
|
+
console.log(chalk.dim(` Operand: ${options.operand}`));
|
|
119
|
+
console.log(chalk.dim(` Operation: ${operation.toUpperCase()}`));
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const metadata = await createSharpInstance(input).metadata();
|
|
123
|
+
const operandBuffer = await createSharpInstance(options.operand).toBuffer();
|
|
124
|
+
const pipeline = createSharpInstance(input).boolean(operandBuffer, operation);
|
|
125
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
126
|
+
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
127
|
+
pipeline.jpeg({ quality: options.quality || 90 });
|
|
128
|
+
}
|
|
129
|
+
else if (outputExt === '.png') {
|
|
130
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
131
|
+
}
|
|
132
|
+
else if (outputExt === '.webp') {
|
|
133
|
+
pipeline.webp({ quality: options.quality || 90 });
|
|
134
|
+
}
|
|
135
|
+
await pipeline.toFile(outputPath);
|
|
136
|
+
const outputStats = fs.statSync(outputPath);
|
|
137
|
+
spinner.succeed(chalk.green('✓ Boolean operation applied successfully!'));
|
|
138
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
139
|
+
console.log(chalk.dim(` Operand: ${options.operand}`));
|
|
140
|
+
console.log(chalk.dim(` Operation: ${operation.toUpperCase()}`));
|
|
141
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
142
|
+
console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
|
|
143
|
+
console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)} KB`));
|
|
144
|
+
}
|
|
145
|
+
catch (error) {
|
|
146
|
+
spinner.fail(chalk.red('Failed to apply boolean operation'));
|
|
147
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
148
|
+
console.error(chalk.red(errorMessage));
|
|
149
|
+
process.exit(1);
|
|
150
|
+
}
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=boolean.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"boolean.js","sourceRoot":"","sources":["../../src/commands/boolean.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dilate.d.ts","sourceRoot":"","sources":["../../src/commands/dilate.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAWzC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA6IrD"}
|