@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
|
@@ -0,0 +1,133 @@
|
|
|
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 linearCommand(imageCmd) {
|
|
8
|
+
const cmd = imageCmd
|
|
9
|
+
.command('linear <input>')
|
|
10
|
+
.description('Apply linear formula: output = (a * input) + b')
|
|
11
|
+
.option('-a, --a <value>', 'Multiplier (default: 1)', parseFloat, 1)
|
|
12
|
+
.option('-b, --b <value>', 'Offset (default: 0)', parseFloat, 0)
|
|
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: 'linear',
|
|
21
|
+
emoji: '📐',
|
|
22
|
+
description: 'Apply linear transformation to pixel values. Formula: output = (a * input) + b. Control brightness and contrast precisely.',
|
|
23
|
+
usage: ['linear <input> -a 1.5 -b 10', 'linear <input> -a 0.5 -b 50'],
|
|
24
|
+
options: [
|
|
25
|
+
{ flag: '-a, --a <value>', description: 'Multiplier (default: 1, contrast control)' },
|
|
26
|
+
{ flag: '-b, --b <value>', description: 'Offset (default: 0, brightness control)' },
|
|
27
|
+
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-linear.<ext>)' },
|
|
28
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
29
|
+
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
30
|
+
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
31
|
+
],
|
|
32
|
+
examples: [
|
|
33
|
+
{ command: 'linear image.jpg -a 1.5 -b 0', description: 'Increase contrast by 50%' },
|
|
34
|
+
{ command: 'linear photo.jpg -a 1 -b 50', description: 'Increase brightness by 50' },
|
|
35
|
+
{ command: 'linear pic.jpg -a 0.8 -b 20', description: 'Reduce contrast, add brightness' },
|
|
36
|
+
{ command: 'linear dark.jpg -a 2 -b 0', description: 'Double pixel values (brighten)' }
|
|
37
|
+
],
|
|
38
|
+
additionalSections: [
|
|
39
|
+
{
|
|
40
|
+
title: 'Parameters',
|
|
41
|
+
items: [
|
|
42
|
+
'a = 1, b = 0: No change (identity)',
|
|
43
|
+
'a > 1: Increase contrast',
|
|
44
|
+
'a < 1: Decrease contrast',
|
|
45
|
+
'b > 0: Increase brightness',
|
|
46
|
+
'b < 0: Decrease brightness'
|
|
47
|
+
]
|
|
48
|
+
},
|
|
49
|
+
{
|
|
50
|
+
title: 'Common Operations',
|
|
51
|
+
items: [
|
|
52
|
+
'Brighten: a=1, b=50',
|
|
53
|
+
'Darken: a=1, b=-50',
|
|
54
|
+
'More contrast: a=1.5, b=0',
|
|
55
|
+
'Less contrast: a=0.5, b=0',
|
|
56
|
+
'Invert: a=-1, b=255',
|
|
57
|
+
'High key: a=0.5, b=128'
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
title: 'Use Cases',
|
|
62
|
+
items: [
|
|
63
|
+
'Precise brightness/contrast control',
|
|
64
|
+
'Color grading with exact values',
|
|
65
|
+
'Exposure correction',
|
|
66
|
+
'Scientific image processing',
|
|
67
|
+
'Batch processing with consistent values'
|
|
68
|
+
]
|
|
69
|
+
}
|
|
70
|
+
],
|
|
71
|
+
tips: [
|
|
72
|
+
'More precise than modulate command',
|
|
73
|
+
'Values can be negative',
|
|
74
|
+
'Results clamped to 0-255',
|
|
75
|
+
'Use for reproducible adjustments'
|
|
76
|
+
]
|
|
77
|
+
});
|
|
78
|
+
});
|
|
79
|
+
cmd.action(async (input, options) => {
|
|
80
|
+
const spinner = ora('Processing image...').start();
|
|
81
|
+
try {
|
|
82
|
+
if (!fs.existsSync(input)) {
|
|
83
|
+
spinner.fail(chalk.red(`Input file not found: ${input}`));
|
|
84
|
+
process.exit(1);
|
|
85
|
+
}
|
|
86
|
+
const a = options.a ?? 1;
|
|
87
|
+
const b = options.b ?? 0;
|
|
88
|
+
const inputPath = path.parse(input);
|
|
89
|
+
const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-linear${inputPath.ext}`);
|
|
90
|
+
if (options.verbose) {
|
|
91
|
+
spinner.info(chalk.blue('Configuration:'));
|
|
92
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
93
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
94
|
+
console.log(chalk.dim(` Formula: (${a} * input) + ${b}`));
|
|
95
|
+
spinner.start('Processing...');
|
|
96
|
+
}
|
|
97
|
+
if (options.dryRun) {
|
|
98
|
+
spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
|
|
99
|
+
console.log(chalk.green('✓ Would apply linear transformation:'));
|
|
100
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
101
|
+
console.log(chalk.dim(` Formula: (${a} * input) + ${b}`));
|
|
102
|
+
return;
|
|
103
|
+
}
|
|
104
|
+
const metadata = await createSharpInstance(input).metadata();
|
|
105
|
+
const pipeline = createSharpInstance(input).linear(a, b);
|
|
106
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
107
|
+
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
108
|
+
pipeline.jpeg({ quality: options.quality || 90 });
|
|
109
|
+
}
|
|
110
|
+
else if (outputExt === '.png') {
|
|
111
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
112
|
+
}
|
|
113
|
+
else if (outputExt === '.webp') {
|
|
114
|
+
pipeline.webp({ quality: options.quality || 90 });
|
|
115
|
+
}
|
|
116
|
+
await pipeline.toFile(outputPath);
|
|
117
|
+
const outputStats = fs.statSync(outputPath);
|
|
118
|
+
spinner.succeed(chalk.green('✓ Linear transformation applied successfully!'));
|
|
119
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
120
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
121
|
+
console.log(chalk.dim(` Formula: (${a} * input) + ${b}`));
|
|
122
|
+
console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
|
|
123
|
+
console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)} KB`));
|
|
124
|
+
}
|
|
125
|
+
catch (error) {
|
|
126
|
+
spinner.fail(chalk.red('Failed to apply linear transformation'));
|
|
127
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
128
|
+
console.error(chalk.red(errorMessage));
|
|
129
|
+
process.exit(1);
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//# sourceMappingURL=linear.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"linear.js","sourceRoot":"","sources":["../../src/commands/linear.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recomb.d.ts","sourceRoot":"","sources":["../../src/commands/recomb.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA8IrD"}
|
|
@@ -0,0 +1,146 @@
|
|
|
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
|
+
const spinner = ora();
|
|
8
|
+
export function recombCommand(imageCmd) {
|
|
9
|
+
imageCmd
|
|
10
|
+
.command('recomb <input>')
|
|
11
|
+
.description('Recombine RGB channels using matrix')
|
|
12
|
+
.option('--matrix <values>', 'Recombination matrix (3x3) as JSON', '[[1,0,0],[0,1,0],[0,0,1]]')
|
|
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
|
+
.option('--help', 'Display help for recomb command')
|
|
18
|
+
.action(async (input, options) => {
|
|
19
|
+
if (options.help) {
|
|
20
|
+
createStandardHelp({
|
|
21
|
+
commandName: 'recomb',
|
|
22
|
+
emoji: '🌈',
|
|
23
|
+
description: 'Recombine image channels using a transformation matrix. Create custom color effects by mixing R, G, B channels.',
|
|
24
|
+
usage: [
|
|
25
|
+
'recomb <input> --matrix "[[1,0,0],[0,1,0],[0,0,1]]"',
|
|
26
|
+
'recomb <input> --matrix "[[0,0,1],[0,1,0],[1,0,0]]" (swap R/B)'
|
|
27
|
+
],
|
|
28
|
+
options: [
|
|
29
|
+
{ flag: '--matrix <values>', description: '3x3 matrix as JSON array (default: identity)' },
|
|
30
|
+
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-recomb.<ext>)' },
|
|
31
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
32
|
+
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
33
|
+
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
34
|
+
],
|
|
35
|
+
examples: [
|
|
36
|
+
{ command: 'recomb image.jpg --matrix "[[0,0,1],[0,1,0],[1,0,0]]"', description: 'Swap red and blue channels' },
|
|
37
|
+
{ command: 'recomb photo.jpg --matrix "[[0.5,0.5,0],[0.5,0.5,0],[0,0,1]]"', description: 'Average red/green, keep blue' },
|
|
38
|
+
{ command: 'recomb pic.jpg --matrix "[[1,0,0],[1,0,0],[1,0,0]]"', description: 'Use red channel for all' }
|
|
39
|
+
],
|
|
40
|
+
additionalSections: [
|
|
41
|
+
{
|
|
42
|
+
title: 'Matrix Format',
|
|
43
|
+
items: [
|
|
44
|
+
'3x3 matrix: [[R],[G],[B]]',
|
|
45
|
+
'Each row defines output channel',
|
|
46
|
+
'Each column represents input channel (R, G, B)',
|
|
47
|
+
'Identity [[1,0,0],[0,1,0],[0,0,1]] = no change'
|
|
48
|
+
]
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
title: 'Common Operations',
|
|
52
|
+
items: [
|
|
53
|
+
'Swap R/B: [[0,0,1],[0,1,0],[1,0,0]]',
|
|
54
|
+
'Swap R/G: [[0,1,0],[1,0,0],[0,0,1]]',
|
|
55
|
+
'Grayscale: [[0.33,0.33,0.33],...] (all rows same)',
|
|
56
|
+
'Red only: [[1,0,0],[0,0,0],[0,0,0]]',
|
|
57
|
+
'Remove red: [[0,0,0],[0,1,0],[0,0,1]]'
|
|
58
|
+
]
|
|
59
|
+
},
|
|
60
|
+
{
|
|
61
|
+
title: 'Creative Effects',
|
|
62
|
+
items: [
|
|
63
|
+
'Channel shifting creates false color effects',
|
|
64
|
+
'Mixing channels creates unique tones',
|
|
65
|
+
'Can simulate color blindness',
|
|
66
|
+
'Create infrared-like effects'
|
|
67
|
+
]
|
|
68
|
+
}
|
|
69
|
+
],
|
|
70
|
+
tips: [
|
|
71
|
+
'Identity matrix produces no change',
|
|
72
|
+
'Values typically 0 to 1',
|
|
73
|
+
'Can use negative values for inversions',
|
|
74
|
+
'Useful for color correction and artistic effects'
|
|
75
|
+
]
|
|
76
|
+
});
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (!fs.existsSync(input)) {
|
|
80
|
+
spinner.fail(chalk.red(`Input file not found: ${input}`));
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
// Parse matrix
|
|
84
|
+
const matrixStr = options.matrix || '[[1,0,0],[0,1,0],[0,0,1]]';
|
|
85
|
+
let matrix;
|
|
86
|
+
try {
|
|
87
|
+
matrix = JSON.parse(matrixStr);
|
|
88
|
+
if (!Array.isArray(matrix) || matrix.length !== 3) {
|
|
89
|
+
throw new Error('Matrix must be 3x3');
|
|
90
|
+
}
|
|
91
|
+
for (const row of matrix) {
|
|
92
|
+
if (!Array.isArray(row) || row.length !== 3) {
|
|
93
|
+
throw new Error('Each row must have 3 values');
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
catch (e) {
|
|
98
|
+
spinner.fail(chalk.red('Invalid matrix format. Use 3x3 JSON array like [[1,0,0],[0,1,0],[0,0,1]]'));
|
|
99
|
+
process.exit(1);
|
|
100
|
+
}
|
|
101
|
+
const inputPath = path.parse(input);
|
|
102
|
+
const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-recomb${inputPath.ext}`);
|
|
103
|
+
if (options.verbose) {
|
|
104
|
+
spinner.info(chalk.blue('Configuration:'));
|
|
105
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
106
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
107
|
+
console.log(chalk.dim(` Matrix: ${JSON.stringify(matrix)}`));
|
|
108
|
+
spinner.start('Processing...');
|
|
109
|
+
}
|
|
110
|
+
if (options.dryRun) {
|
|
111
|
+
spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
|
|
112
|
+
console.log(chalk.green('✓ Would recombine channels:'));
|
|
113
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
114
|
+
console.log(chalk.dim(` Matrix: ${JSON.stringify(matrix)}`));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
try {
|
|
118
|
+
const metadata = await createSharpInstance(input).metadata();
|
|
119
|
+
const pipeline = createSharpInstance(input).recomb(matrix);
|
|
120
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
121
|
+
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
122
|
+
pipeline.jpeg({ quality: options.quality || 90 });
|
|
123
|
+
}
|
|
124
|
+
else if (outputExt === '.png') {
|
|
125
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
126
|
+
}
|
|
127
|
+
else if (outputExt === '.webp') {
|
|
128
|
+
pipeline.webp({ quality: options.quality || 90 });
|
|
129
|
+
}
|
|
130
|
+
await pipeline.toFile(outputPath);
|
|
131
|
+
const outputStats = fs.statSync(outputPath);
|
|
132
|
+
spinner.succeed(chalk.green('✓ Channels recombined successfully!'));
|
|
133
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
134
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
135
|
+
console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
|
|
136
|
+
console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)} KB`));
|
|
137
|
+
}
|
|
138
|
+
catch (error) {
|
|
139
|
+
spinner.fail(chalk.red('Failed to recombine channels'));
|
|
140
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
141
|
+
console.error(chalk.red(errorMessage));
|
|
142
|
+
process.exit(1);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=recomb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"recomb.js","sourceRoot":"","sources":["../../src/commands/recomb.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold.d.ts","sourceRoot":"","sources":["../../src/commands/threshold.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAgIxD"}
|
|
@@ -0,0 +1,126 @@
|
|
|
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 thresholdCommand(imageCmd) {
|
|
8
|
+
const cmd = imageCmd
|
|
9
|
+
.command('threshold <input>')
|
|
10
|
+
.description('Apply threshold to image (convert to binary black/white)')
|
|
11
|
+
.option('-t, --threshold <value>', 'Threshold value 0-255 (default: 128)', parseInt, 128)
|
|
12
|
+
.option('--grayscale', 'Convert to grayscale first (recommended)', true)
|
|
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' + createStandardHelp({
|
|
19
|
+
commandName: 'threshold',
|
|
20
|
+
emoji: '⚫⚪',
|
|
21
|
+
description: 'Convert image to pure black and white using threshold value. Pixels above threshold become white, below become black.',
|
|
22
|
+
usage: ['threshold <input>', 'threshold <input> -t 100'],
|
|
23
|
+
options: [
|
|
24
|
+
{ flag: '-t, --threshold <value>', description: 'Threshold value 0-255 (default: 128)' },
|
|
25
|
+
{ flag: '--grayscale', description: 'Convert to grayscale first (default: true)' },
|
|
26
|
+
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-threshold.<ext>)' },
|
|
27
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
28
|
+
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
29
|
+
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
30
|
+
],
|
|
31
|
+
examples: [
|
|
32
|
+
{ command: 'threshold document.jpg', description: 'Binary threshold at 128' },
|
|
33
|
+
{ command: 'threshold scan.jpg -t 180', description: 'Higher threshold (more white)' },
|
|
34
|
+
{ command: 'threshold image.jpg -t 80', description: 'Lower threshold (more black)' },
|
|
35
|
+
{ command: 'threshold photo.jpg -t 128 -o bw.png', description: 'Save as PNG' }
|
|
36
|
+
],
|
|
37
|
+
additionalSections: [
|
|
38
|
+
{
|
|
39
|
+
title: 'Threshold Guide',
|
|
40
|
+
items: [
|
|
41
|
+
'0: All pixels become white',
|
|
42
|
+
'128: Middle threshold (default)',
|
|
43
|
+
'255: All pixels become black',
|
|
44
|
+
'Lower value = more white pixels',
|
|
45
|
+
'Higher value = more black pixels'
|
|
46
|
+
]
|
|
47
|
+
},
|
|
48
|
+
{
|
|
49
|
+
title: 'Use Cases',
|
|
50
|
+
items: [
|
|
51
|
+
'Document scanning - clean text',
|
|
52
|
+
'OCR preprocessing',
|
|
53
|
+
'Binary image masks',
|
|
54
|
+
'Edge detection prep',
|
|
55
|
+
'QR code/barcode cleanup'
|
|
56
|
+
]
|
|
57
|
+
}
|
|
58
|
+
],
|
|
59
|
+
tips: [
|
|
60
|
+
'Use 128 for balanced results',
|
|
61
|
+
'Try 180-200 for dark text on light background',
|
|
62
|
+
'Try 60-80 for light text on dark background',
|
|
63
|
+
'Combine with scan-enhance for best document results'
|
|
64
|
+
]
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
cmd.action(async (input, options) => {
|
|
68
|
+
const spinner = ora('Processing image...').start();
|
|
69
|
+
try {
|
|
70
|
+
if (!fs.existsSync(input)) {
|
|
71
|
+
spinner.fail(chalk.red(`Input file not found: ${input}`));
|
|
72
|
+
process.exit(1);
|
|
73
|
+
}
|
|
74
|
+
const thresholdValue = Math.max(0, Math.min(255, options.threshold || 128));
|
|
75
|
+
const inputPath = path.parse(input);
|
|
76
|
+
const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-threshold${inputPath.ext}`);
|
|
77
|
+
if (options.verbose) {
|
|
78
|
+
spinner.info(chalk.blue('Configuration:'));
|
|
79
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
80
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
81
|
+
console.log(chalk.dim(` Threshold: ${thresholdValue}`));
|
|
82
|
+
spinner.start('Processing...');
|
|
83
|
+
}
|
|
84
|
+
if (options.dryRun) {
|
|
85
|
+
spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
|
|
86
|
+
console.log(chalk.green('✓ Would apply threshold:'));
|
|
87
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
88
|
+
console.log(chalk.dim(` Threshold: ${thresholdValue}`));
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
const metadata = await createSharpInstance(input).metadata();
|
|
92
|
+
let pipeline = createSharpInstance(input);
|
|
93
|
+
if (options.grayscale !== false) {
|
|
94
|
+
pipeline = pipeline.grayscale();
|
|
95
|
+
}
|
|
96
|
+
pipeline = pipeline.threshold(thresholdValue);
|
|
97
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
98
|
+
if (outputExt === '.jpg' || outputExt === '.jpeg') {
|
|
99
|
+
pipeline.jpeg({ quality: options.quality || 90 });
|
|
100
|
+
}
|
|
101
|
+
else if (outputExt === '.png') {
|
|
102
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
103
|
+
}
|
|
104
|
+
else if (outputExt === '.webp') {
|
|
105
|
+
pipeline.webp({ quality: options.quality || 90 });
|
|
106
|
+
}
|
|
107
|
+
await pipeline.toFile(outputPath);
|
|
108
|
+
const inputStats = fs.statSync(input);
|
|
109
|
+
const outputStats = fs.statSync(outputPath);
|
|
110
|
+
const sizeDiff = ((outputStats.size - inputStats.size) / inputStats.size * 100).toFixed(2);
|
|
111
|
+
spinner.succeed(chalk.green('✓ Threshold applied successfully!'));
|
|
112
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
113
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
114
|
+
console.log(chalk.dim(` Threshold: ${thresholdValue}`));
|
|
115
|
+
console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
|
|
116
|
+
console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)} KB (${sizeDiff}%)`));
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
spinner.fail(chalk.red('Failed to apply threshold'));
|
|
120
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
121
|
+
console.error(chalk.red(errorMessage));
|
|
122
|
+
process.exit(1);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
//# sourceMappingURL=threshold.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"threshold.js","sourceRoot":"","sources":["../../src/commands/threshold.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unflatten.d.ts","sourceRoot":"","sources":["../../src/commands/unflatten.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAyGxD"}
|
|
@@ -0,0 +1,105 @@
|
|
|
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 unflattenCommand(imageCmd) {
|
|
8
|
+
const cmd = imageCmd
|
|
9
|
+
.command('unflatten <input>')
|
|
10
|
+
.description('Add alpha channel to RGB image (inverse of flatten)')
|
|
11
|
+
.option('-o, --output <path>', 'Output file path')
|
|
12
|
+
.option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
|
|
13
|
+
.option('--dry-run', 'Show what would be done without executing')
|
|
14
|
+
.option('-v, --verbose', 'Verbose output');
|
|
15
|
+
cmd.addHelpText('after', () => {
|
|
16
|
+
return '\n' + createStandardHelp({
|
|
17
|
+
commandName: 'unflatten',
|
|
18
|
+
emoji: '🔓',
|
|
19
|
+
description: 'Add alpha channel to image (convert RGB to RGBA). Opposite of flatten command.',
|
|
20
|
+
usage: ['unflatten <input>', 'unflatten <input> -o transparent.png'],
|
|
21
|
+
options: [
|
|
22
|
+
{ flag: '-o, --output <path>', description: 'Output file path (default: <input>-unflat.png)' },
|
|
23
|
+
{ flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
|
|
24
|
+
{ flag: '--dry-run', description: 'Preview changes without executing' },
|
|
25
|
+
{ flag: '-v, --verbose', description: 'Show detailed output' }
|
|
26
|
+
],
|
|
27
|
+
examples: [
|
|
28
|
+
{ command: 'unflatten image.jpg', description: 'Add alpha channel' },
|
|
29
|
+
{ command: 'unflatten photo.jpg -o with-alpha.png', description: 'Convert JPG to PNG with alpha' }
|
|
30
|
+
],
|
|
31
|
+
additionalSections: [
|
|
32
|
+
{
|
|
33
|
+
title: 'Use Cases',
|
|
34
|
+
items: [
|
|
35
|
+
'Prepare image for compositing operations',
|
|
36
|
+
'Convert JPEG to PNG with transparency support',
|
|
37
|
+
'Add alpha channel before applying transparency',
|
|
38
|
+
'Prepare for further alpha manipulations'
|
|
39
|
+
]
|
|
40
|
+
}
|
|
41
|
+
],
|
|
42
|
+
tips: [
|
|
43
|
+
'All pixels will be fully opaque after unflatten',
|
|
44
|
+
'Use PNG format to preserve alpha channel',
|
|
45
|
+
'Required before some compositing operations',
|
|
46
|
+
'Increases file size (adds alpha data)'
|
|
47
|
+
]
|
|
48
|
+
});
|
|
49
|
+
});
|
|
50
|
+
cmd.action(async (input, options) => {
|
|
51
|
+
const spinner = ora('Processing image...').start();
|
|
52
|
+
try {
|
|
53
|
+
if (!fs.existsSync(input)) {
|
|
54
|
+
spinner.fail(chalk.red(`Input file not found: ${input}`));
|
|
55
|
+
process.exit(1);
|
|
56
|
+
}
|
|
57
|
+
const inputPath = path.parse(input);
|
|
58
|
+
const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-unflat.png`);
|
|
59
|
+
if (options.verbose) {
|
|
60
|
+
spinner.info(chalk.blue('Configuration:'));
|
|
61
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
62
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
63
|
+
spinner.start('Processing...');
|
|
64
|
+
}
|
|
65
|
+
if (options.dryRun) {
|
|
66
|
+
spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
|
|
67
|
+
console.log(chalk.green('✓ Would unflatten image:'));
|
|
68
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
69
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
const metadata = await createSharpInstance(input).metadata();
|
|
73
|
+
const pipeline = createSharpInstance(input).unflatten();
|
|
74
|
+
// Unflatten typically outputs PNG to preserve alpha
|
|
75
|
+
const outputExt = path.extname(outputPath).toLowerCase();
|
|
76
|
+
if (outputExt === '.png') {
|
|
77
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
78
|
+
}
|
|
79
|
+
else if (outputExt === '.webp') {
|
|
80
|
+
pipeline.webp({ quality: options.quality || 90 });
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
// Force PNG if no extension or unsupported format
|
|
84
|
+
pipeline.png({ quality: options.quality || 90 });
|
|
85
|
+
}
|
|
86
|
+
await pipeline.toFile(outputPath);
|
|
87
|
+
const inputStats = fs.statSync(input);
|
|
88
|
+
const outputStats = fs.statSync(outputPath);
|
|
89
|
+
const sizeDiff = ((outputStats.size - inputStats.size) / inputStats.size * 100).toFixed(2);
|
|
90
|
+
spinner.succeed(chalk.green('✓ Image unflattened successfully!'));
|
|
91
|
+
console.log(chalk.dim(` Input: ${input}`));
|
|
92
|
+
console.log(chalk.dim(` Output: ${outputPath}`));
|
|
93
|
+
console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
|
|
94
|
+
console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)} KB (${sizeDiff}%)`));
|
|
95
|
+
console.log(chalk.cyan('ℹ Alpha channel added (all pixels fully opaque)'));
|
|
96
|
+
}
|
|
97
|
+
catch (error) {
|
|
98
|
+
spinner.fail(chalk.red('Failed to unflatten image'));
|
|
99
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
100
|
+
console.error(chalk.red(errorMessage));
|
|
101
|
+
process.exit(1);
|
|
102
|
+
}
|
|
103
|
+
});
|
|
104
|
+
}
|
|
105
|
+
//# sourceMappingURL=unflatten.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unflatten.js","sourceRoot":"","sources":["../../src/commands/unflatten.ts"],"names":[],"mappings":"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"}
|
package/dist/register.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"register.d.ts","sourceRoot":"","sources":["../src/register.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmDzC,eAAO,MAAM,IAAI,qBAAqB,CAAC;AACvC,eAAO,MAAM,OAAO,UAAU,CAAC;AAE/B,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAuE/C"}
|