@mediaproc/image 1.0.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.
Files changed (179) hide show
  1. package/README.md +2516 -0
  2. package/bin/cli.js +6 -0
  3. package/dist/cli.d.ts +3 -0
  4. package/dist/cli.d.ts.map +1 -0
  5. package/dist/cli.js +89 -0
  6. package/dist/cli.js.map +1 -0
  7. package/dist/commands/auto-enhance.d.ts +3 -0
  8. package/dist/commands/auto-enhance.d.ts.map +1 -0
  9. package/dist/commands/auto-enhance.js +148 -0
  10. package/dist/commands/auto-enhance.js.map +1 -0
  11. package/dist/commands/batch.d.ts +3 -0
  12. package/dist/commands/batch.d.ts.map +1 -0
  13. package/dist/commands/batch.js +230 -0
  14. package/dist/commands/batch.js.map +1 -0
  15. package/dist/commands/blur.d.ts +3 -0
  16. package/dist/commands/blur.d.ts.map +1 -0
  17. package/dist/commands/blur.js +122 -0
  18. package/dist/commands/blur.js.map +1 -0
  19. package/dist/commands/border.d.ts +3 -0
  20. package/dist/commands/border.d.ts.map +1 -0
  21. package/dist/commands/border.js +122 -0
  22. package/dist/commands/border.js.map +1 -0
  23. package/dist/commands/clahe.d.ts +3 -0
  24. package/dist/commands/clahe.d.ts.map +1 -0
  25. package/dist/commands/clahe.js +121 -0
  26. package/dist/commands/clahe.js.map +1 -0
  27. package/dist/commands/composite.d.ts +3 -0
  28. package/dist/commands/composite.d.ts.map +1 -0
  29. package/dist/commands/composite.js +167 -0
  30. package/dist/commands/composite.js.map +1 -0
  31. package/dist/commands/convert.d.ts +3 -0
  32. package/dist/commands/convert.d.ts.map +1 -0
  33. package/dist/commands/convert.js +136 -0
  34. package/dist/commands/convert.js.map +1 -0
  35. package/dist/commands/convolve.d.ts +3 -0
  36. package/dist/commands/convolve.d.ts.map +1 -0
  37. package/dist/commands/convolve.js +171 -0
  38. package/dist/commands/convolve.js.map +1 -0
  39. package/dist/commands/crop.d.ts +3 -0
  40. package/dist/commands/crop.d.ts.map +1 -0
  41. package/dist/commands/crop.js +120 -0
  42. package/dist/commands/crop.js.map +1 -0
  43. package/dist/commands/dominant-color.d.ts +3 -0
  44. package/dist/commands/dominant-color.d.ts.map +1 -0
  45. package/dist/commands/dominant-color.js +175 -0
  46. package/dist/commands/dominant-color.js.map +1 -0
  47. package/dist/commands/extend.d.ts +3 -0
  48. package/dist/commands/extend.d.ts.map +1 -0
  49. package/dist/commands/extend.js +146 -0
  50. package/dist/commands/extend.js.map +1 -0
  51. package/dist/commands/extract.d.ts +3 -0
  52. package/dist/commands/extract.d.ts.map +1 -0
  53. package/dist/commands/extract.js +169 -0
  54. package/dist/commands/extract.js.map +1 -0
  55. package/dist/commands/flip.d.ts +3 -0
  56. package/dist/commands/flip.d.ts.map +1 -0
  57. package/dist/commands/flip.js +112 -0
  58. package/dist/commands/flip.js.map +1 -0
  59. package/dist/commands/gamma.d.ts +3 -0
  60. package/dist/commands/gamma.d.ts.map +1 -0
  61. package/dist/commands/gamma.js +129 -0
  62. package/dist/commands/gamma.js.map +1 -0
  63. package/dist/commands/grayscale.d.ts +3 -0
  64. package/dist/commands/grayscale.d.ts.map +1 -0
  65. package/dist/commands/grayscale.js +94 -0
  66. package/dist/commands/grayscale.js.map +1 -0
  67. package/dist/commands/grid.d.ts +3 -0
  68. package/dist/commands/grid.d.ts.map +1 -0
  69. package/dist/commands/grid.js +193 -0
  70. package/dist/commands/grid.js.map +1 -0
  71. package/dist/commands/median.d.ts +3 -0
  72. package/dist/commands/median.d.ts.map +1 -0
  73. package/dist/commands/median.js +132 -0
  74. package/dist/commands/median.js.map +1 -0
  75. package/dist/commands/metadata-cmd.d.ts +3 -0
  76. package/dist/commands/metadata-cmd.d.ts.map +1 -0
  77. package/dist/commands/metadata-cmd.js +201 -0
  78. package/dist/commands/metadata-cmd.js.map +1 -0
  79. package/dist/commands/mirror.d.ts +3 -0
  80. package/dist/commands/mirror.d.ts.map +1 -0
  81. package/dist/commands/mirror.js +218 -0
  82. package/dist/commands/mirror.js.map +1 -0
  83. package/dist/commands/modulate.d.ts +3 -0
  84. package/dist/commands/modulate.d.ts.map +1 -0
  85. package/dist/commands/modulate.js +151 -0
  86. package/dist/commands/modulate.js.map +1 -0
  87. package/dist/commands/negate.d.ts +3 -0
  88. package/dist/commands/negate.d.ts.map +1 -0
  89. package/dist/commands/negate.js +111 -0
  90. package/dist/commands/negate.js.map +1 -0
  91. package/dist/commands/normalize.d.ts +3 -0
  92. package/dist/commands/normalize.d.ts.map +1 -0
  93. package/dist/commands/normalize.js +119 -0
  94. package/dist/commands/normalize.js.map +1 -0
  95. package/dist/commands/optimize.d.ts +3 -0
  96. package/dist/commands/optimize.d.ts.map +1 -0
  97. package/dist/commands/optimize.js +137 -0
  98. package/dist/commands/optimize.js.map +1 -0
  99. package/dist/commands/palette.d.ts +3 -0
  100. package/dist/commands/palette.d.ts.map +1 -0
  101. package/dist/commands/palette.js +138 -0
  102. package/dist/commands/palette.js.map +1 -0
  103. package/dist/commands/pixelate.d.ts +3 -0
  104. package/dist/commands/pixelate.d.ts.map +1 -0
  105. package/dist/commands/pixelate.js +123 -0
  106. package/dist/commands/pixelate.js.map +1 -0
  107. package/dist/commands/resize.d.ts +3 -0
  108. package/dist/commands/resize.d.ts.map +1 -0
  109. package/dist/commands/resize.js +187 -0
  110. package/dist/commands/resize.js.map +1 -0
  111. package/dist/commands/rotate.d.ts +3 -0
  112. package/dist/commands/rotate.d.ts.map +1 -0
  113. package/dist/commands/rotate.js +103 -0
  114. package/dist/commands/rotate.js.map +1 -0
  115. package/dist/commands/sepia.d.ts +3 -0
  116. package/dist/commands/sepia.d.ts.map +1 -0
  117. package/dist/commands/sepia.js +119 -0
  118. package/dist/commands/sepia.js.map +1 -0
  119. package/dist/commands/sharpen.d.ts +3 -0
  120. package/dist/commands/sharpen.d.ts.map +1 -0
  121. package/dist/commands/sharpen.js +123 -0
  122. package/dist/commands/sharpen.js.map +1 -0
  123. package/dist/commands/smart-crop.d.ts +3 -0
  124. package/dist/commands/smart-crop.d.ts.map +1 -0
  125. package/dist/commands/smart-crop.js +137 -0
  126. package/dist/commands/smart-crop.js.map +1 -0
  127. package/dist/commands/split.d.ts +3 -0
  128. package/dist/commands/split.d.ts.map +1 -0
  129. package/dist/commands/split.js +177 -0
  130. package/dist/commands/split.js.map +1 -0
  131. package/dist/commands/stack.d.ts +3 -0
  132. package/dist/commands/stack.d.ts.map +1 -0
  133. package/dist/commands/stack.js +205 -0
  134. package/dist/commands/stack.js.map +1 -0
  135. package/dist/commands/stats.d.ts +3 -0
  136. package/dist/commands/stats.d.ts.map +1 -0
  137. package/dist/commands/stats.js +187 -0
  138. package/dist/commands/stats.js.map +1 -0
  139. package/dist/commands/thumbnail.d.ts +3 -0
  140. package/dist/commands/thumbnail.d.ts.map +1 -0
  141. package/dist/commands/thumbnail.js +131 -0
  142. package/dist/commands/thumbnail.js.map +1 -0
  143. package/dist/commands/tint.d.ts +3 -0
  144. package/dist/commands/tint.d.ts.map +1 -0
  145. package/dist/commands/tint.js +123 -0
  146. package/dist/commands/tint.js.map +1 -0
  147. package/dist/commands/trim.d.ts +3 -0
  148. package/dist/commands/trim.d.ts.map +1 -0
  149. package/dist/commands/trim.js +123 -0
  150. package/dist/commands/trim.js.map +1 -0
  151. package/dist/commands/vignette.d.ts +3 -0
  152. package/dist/commands/vignette.d.ts.map +1 -0
  153. package/dist/commands/vignette.js +139 -0
  154. package/dist/commands/vignette.js.map +1 -0
  155. package/dist/commands/watermark.d.ts +3 -0
  156. package/dist/commands/watermark.d.ts.map +1 -0
  157. package/dist/commands/watermark.js +172 -0
  158. package/dist/commands/watermark.js.map +1 -0
  159. package/dist/index.d.ts +3 -0
  160. package/dist/index.d.ts.map +1 -0
  161. package/dist/index.js +2 -0
  162. package/dist/index.js.map +1 -0
  163. package/dist/register.d.ts +5 -0
  164. package/dist/register.d.ts.map +1 -0
  165. package/dist/register.js +93 -0
  166. package/dist/register.js.map +1 -0
  167. package/dist/types.d.ts +91 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/types.js +2 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/utils/helpFormatter.d.ts +63 -0
  172. package/dist/utils/helpFormatter.d.ts.map +1 -0
  173. package/dist/utils/helpFormatter.js +171 -0
  174. package/dist/utils/helpFormatter.js.map +1 -0
  175. package/dist/utils/sharp.d.ts +20 -0
  176. package/dist/utils/sharp.d.ts.map +1 -0
  177. package/dist/utils/sharp.js +14 -0
  178. package/dist/utils/sharp.js.map +1 -0
  179. package/package.json +55 -0
@@ -0,0 +1,112 @@
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 flipCommand(imageCmd) {
8
+ imageCmd
9
+ .command('flip <input>')
10
+ .description('Flip image horizontally, vertically, or both')
11
+ .option('--horizontal', 'Flip horizontally (mirror left-right)')
12
+ .option('--vertical', 'Flip vertically (mirror top-bottom)')
13
+ .option('--both', 'Flip both horizontally and vertically (rotate 180°)')
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
+ .option('--help', 'Display help for flip command')
19
+ .action(async (input, options) => {
20
+ if (options.help) {
21
+ createStandardHelp({
22
+ commandName: 'flip',
23
+ emoji: '🔃',
24
+ description: 'Flip (mirror) images horizontally, vertically, or both. Create mirror effects or correct image orientation.',
25
+ usage: ['flip <input> --horizontal', 'flip <input> --vertical', 'flip <input> --both'],
26
+ options: [
27
+ { flag: '--horizontal', description: 'Flip horizontally (mirror left-right)' },
28
+ { flag: '--vertical', description: 'Flip vertically (mirror top-bottom)' },
29
+ { flag: '--both', description: 'Flip both ways (equivalent to 180° rotation)' },
30
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-flipped.<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: 'flip photo.jpg --horizontal', description: 'Create horizontal mirror effect' },
37
+ { command: 'flip image.png --vertical', description: 'Flip image upside down' },
38
+ { command: 'flip pic.jpg --both', description: 'Flip both directions (180° rotation)' },
39
+ { command: 'flip selfie.jpg --horizontal', description: 'Correct selfie mirror effect' }
40
+ ],
41
+ tips: ['Default is horizontal flip if no option specified', 'Flip operations are very fast']
42
+ });
43
+ process.exit(0);
44
+ }
45
+ const spinner = ora('Processing image...').start();
46
+ try {
47
+ if (!fs.existsSync(input)) {
48
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
49
+ process.exit(1);
50
+ }
51
+ if (!options.horizontal && !options.vertical && !options.both) {
52
+ options.horizontal = true;
53
+ }
54
+ const inputPath = path.parse(input);
55
+ const flipType = options.both ? 'both' : options.vertical ? 'vertical' : 'horizontal';
56
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-flipped-${flipType}${inputPath.ext}`);
57
+ if (options.verbose) {
58
+ spinner.info(chalk.blue('Configuration:'));
59
+ console.log(chalk.dim(` Input: ${input}`));
60
+ console.log(chalk.dim(` Output: ${outputPath}`));
61
+ console.log(chalk.dim(` Mode: ${flipType}`));
62
+ spinner.start('Processing...');
63
+ }
64
+ if (options.dryRun) {
65
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
66
+ console.log(chalk.green('✓ Would flip image:'));
67
+ console.log(chalk.dim(` From: ${input}`));
68
+ console.log(chalk.dim(` To: ${outputPath}`));
69
+ console.log(chalk.dim(` Mode: ${flipType}`));
70
+ return;
71
+ }
72
+ const metadata = await createSharpInstance(input).metadata();
73
+ let pipeline = createSharpInstance(input);
74
+ if (options.both) {
75
+ pipeline = pipeline.flip().flop();
76
+ }
77
+ else if (options.vertical) {
78
+ pipeline = pipeline.flip();
79
+ }
80
+ else {
81
+ pipeline = pipeline.flop();
82
+ }
83
+ const outputExt = path.extname(outputPath).toLowerCase();
84
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
85
+ pipeline.jpeg({ quality: options.quality || 90 });
86
+ }
87
+ else if (outputExt === '.png') {
88
+ pipeline.png({ quality: options.quality || 90 });
89
+ }
90
+ else if (outputExt === '.webp') {
91
+ pipeline.webp({ quality: options.quality || 90 });
92
+ }
93
+ await pipeline.toFile(outputPath);
94
+ spinner.succeed(chalk.green('✓ Image flipped successfully!'));
95
+ console.log(chalk.dim(` Input: ${input}`));
96
+ console.log(chalk.dim(` Output: ${outputPath}`));
97
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
98
+ console.log(chalk.dim(` Mode: ${flipType} flip`));
99
+ }
100
+ catch (error) {
101
+ spinner.fail(chalk.red('Failed to flip image'));
102
+ if (options.verbose) {
103
+ console.error(chalk.red('Error details:'), error);
104
+ }
105
+ else {
106
+ console.error(chalk.red(error.message));
107
+ }
108
+ process.exit(1);
109
+ }
110
+ });
111
+ }
112
+ //# sourceMappingURL=flip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flip.js","sourceRoot":"","sources":["../../src/commands/flip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function gammaCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=gamma.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamma.d.ts","sourceRoot":"","sources":["../../src/commands/gamma.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAmIpD"}
@@ -0,0 +1,129 @@
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 gammaCommand(imageCmd) {
8
+ imageCmd
9
+ .command('gamma <input>')
10
+ .description('Apply gamma correction')
11
+ .option('-g, --gamma <value>', 'Gamma value (1-3, default: 2.2)', parseFloat, 2.2)
12
+ .option('--gamma-out <value>', 'Output gamma (optional)', parseFloat)
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 gamma command')
18
+ .action(async (input, options) => {
19
+ if (options.help) {
20
+ createStandardHelp({
21
+ commandName: 'gamma',
22
+ emoji: '🌓',
23
+ description: 'Apply gamma correction to adjust image midtones without affecting shadows/highlights. Essential for color correction and monitor calibration.',
24
+ usage: ['gamma <input>', 'gamma <input> -g <value>', 'gamma <input> -g 2.2 --gamma-out 1.8'],
25
+ options: [
26
+ { flag: '-g, --gamma <value>', description: 'Gamma value 1-3 (default: 2.2, standard sRGB)' },
27
+ { flag: '--gamma-out <value>', description: 'Output gamma value (optional, for specific workflows)' },
28
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-gamma.<ext>)' },
29
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
30
+ { flag: '--dry-run', description: 'Preview changes without executing' },
31
+ { flag: '-v, --verbose', description: 'Show detailed output' }
32
+ ],
33
+ examples: [
34
+ { command: 'gamma photo.jpg -g 2.2', description: 'Standard sRGB gamma correction' },
35
+ { command: 'gamma image.png -g 1.5', description: 'Brighten midtones' },
36
+ { command: 'gamma pic.jpg -g 2.8', description: 'Darken midtones' },
37
+ { command: 'gamma photo.jpg -g 2.2 --gamma-out 1.8', description: 'Convert between gamma spaces' }
38
+ ],
39
+ additionalSections: [
40
+ {
41
+ title: 'Gamma Values',
42
+ items: [
43
+ '1.0 - Linear (no correction)',
44
+ '1.5 - Lighter midtones',
45
+ '2.2 - Standard sRGB (most common)',
46
+ '2.4 - Rec. 709 (video)',
47
+ '2.8 - Darker midtones'
48
+ ]
49
+ },
50
+ {
51
+ title: 'Understanding Gamma',
52
+ items: [
53
+ 'Lower gamma (<2.2) - Brightens image',
54
+ 'Higher gamma (>2.2) - Darkens image',
55
+ 'Gamma 2.2 - Standard for web/sRGB',
56
+ 'Affects midtones more than extremes',
57
+ 'Essential for color accuracy'
58
+ ]
59
+ }
60
+ ],
61
+ tips: [
62
+ 'Use 2.2 for standard web images',
63
+ 'Lower values brighten without washing out',
64
+ 'Higher values darken without crushing blacks',
65
+ 'Different from brightness - affects midtones'
66
+ ]
67
+ });
68
+ process.exit(0);
69
+ }
70
+ const spinner = ora('Processing image...').start();
71
+ try {
72
+ if (!fs.existsSync(input)) {
73
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
74
+ process.exit(1);
75
+ }
76
+ const inputPath = path.parse(input);
77
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-gamma${inputPath.ext}`);
78
+ if (options.verbose) {
79
+ spinner.info(chalk.blue('Configuration:'));
80
+ console.log(chalk.dim(` Input: ${input}`));
81
+ console.log(chalk.dim(` Output: ${outputPath}`));
82
+ console.log(chalk.dim(` Gamma: ${options.gamma || 2.2}`));
83
+ if (options.gammaOut) {
84
+ console.log(chalk.dim(` Gamma out: ${options.gammaOut}`));
85
+ }
86
+ spinner.start('Processing...');
87
+ }
88
+ if (options.dryRun) {
89
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
90
+ console.log(chalk.green('✓ Would apply gamma correction:'));
91
+ console.log(chalk.dim(` From: ${input}`));
92
+ console.log(chalk.dim(` To: ${outputPath}`));
93
+ console.log(chalk.dim(` Gamma: ${options.gamma || 2.2}`));
94
+ return;
95
+ }
96
+ const metadata = await createSharpInstance(input).metadata();
97
+ const pipeline = createSharpInstance(input).gamma(options.gamma || 2.2, options.gammaOut);
98
+ const outputExt = path.extname(outputPath).toLowerCase();
99
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
100
+ pipeline.jpeg({ quality: options.quality || 90 });
101
+ }
102
+ else if (outputExt === '.png') {
103
+ pipeline.png({ quality: options.quality || 90 });
104
+ }
105
+ else if (outputExt === '.webp') {
106
+ pipeline.webp({ quality: options.quality || 90 });
107
+ }
108
+ await pipeline.toFile(outputPath);
109
+ const outputStats = fs.statSync(outputPath);
110
+ spinner.succeed(chalk.green('✓ Gamma correction applied successfully!'));
111
+ console.log(chalk.dim(` Input: ${input}`));
112
+ console.log(chalk.dim(` Output: ${outputPath}`));
113
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
114
+ console.log(chalk.dim(` Gamma: ${options.gamma || 2.2}`));
115
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
116
+ }
117
+ catch (error) {
118
+ spinner.fail(chalk.red('Failed to apply gamma correction'));
119
+ if (options.verbose) {
120
+ console.error(chalk.red('Error details:'), error);
121
+ }
122
+ else {
123
+ console.error(chalk.red(error.message));
124
+ }
125
+ process.exit(1);
126
+ }
127
+ });
128
+ }
129
+ //# sourceMappingURL=gamma.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"gamma.js","sourceRoot":"","sources":["../../src/commands/gamma.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function grayscaleCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=grayscale.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grayscale.d.ts","sourceRoot":"","sources":["../../src/commands/grayscale.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AASzC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA6FxD"}
@@ -0,0 +1,94 @@
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 grayscaleCommand(imageCmd) {
8
+ imageCmd
9
+ .command('grayscale <input>')
10
+ .alias('greyscale')
11
+ .description('Convert image to grayscale (black and white)')
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
+ .option('--help', 'Display help for grayscale command')
17
+ .action(async (input, options) => {
18
+ if (options.help) {
19
+ createStandardHelp({
20
+ commandName: 'grayscale',
21
+ emoji: '⚫',
22
+ description: 'Convert color images to grayscale (black and white). Perfect for creating artistic effects, reducing file size, or preparing images for print.',
23
+ usage: ['grayscale <input>', 'grayscale <input> -o <output>', 'greyscale <input>'],
24
+ options: [
25
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-grayscale.<ext>)' },
26
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
27
+ { flag: '--dry-run', description: 'Preview changes without executing' },
28
+ { flag: '-v, --verbose', description: 'Show detailed output' }
29
+ ],
30
+ examples: [
31
+ { command: 'grayscale photo.jpg', description: 'Convert to grayscale with default settings' },
32
+ { command: 'grayscale image.png -o bw.png', description: 'Convert with custom output name' },
33
+ { command: 'greyscale portrait.jpg -q 95', description: 'Convert with high quality (UK spelling)' }
34
+ ],
35
+ tips: ['Grayscale images are typically smaller than color images', 'Both "grayscale" and "greyscale" commands work identically']
36
+ });
37
+ process.exit(0);
38
+ }
39
+ const spinner = ora('Processing image...').start();
40
+ try {
41
+ if (!fs.existsSync(input)) {
42
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
43
+ process.exit(1);
44
+ }
45
+ const inputPath = path.parse(input);
46
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-grayscale${inputPath.ext}`);
47
+ if (options.verbose) {
48
+ spinner.info(chalk.blue('Configuration:'));
49
+ console.log(chalk.dim(` Input: ${input}`));
50
+ console.log(chalk.dim(` Output: ${outputPath}`));
51
+ spinner.start('Processing...');
52
+ }
53
+ if (options.dryRun) {
54
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
55
+ console.log(chalk.green('✓ Would convert image to grayscale:'));
56
+ console.log(chalk.dim(` From: ${input}`));
57
+ console.log(chalk.dim(` To: ${outputPath}`));
58
+ return;
59
+ }
60
+ const metadata = await createSharpInstance(input).metadata();
61
+ const pipeline = createSharpInstance(input).grayscale();
62
+ const outputExt = path.extname(outputPath).toLowerCase();
63
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
64
+ pipeline.jpeg({ quality: options.quality || 90 });
65
+ }
66
+ else if (outputExt === '.png') {
67
+ pipeline.png({ quality: options.quality || 90 });
68
+ }
69
+ else if (outputExt === '.webp') {
70
+ pipeline.webp({ quality: options.quality || 90 });
71
+ }
72
+ await pipeline.toFile(outputPath);
73
+ const inputStats = fs.statSync(input);
74
+ const outputStats = fs.statSync(outputPath);
75
+ const sizeDiff = ((outputStats.size - inputStats.size) / inputStats.size * 100).toFixed(2);
76
+ spinner.succeed(chalk.green('✓ Converted to grayscale successfully!'));
77
+ console.log(chalk.dim(` Input: ${input}`));
78
+ console.log(chalk.dim(` Output: ${outputPath}`));
79
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
80
+ console.log(chalk.dim(` File size: ${(inputStats.size / 1024).toFixed(2)}KB → ${(outputStats.size / 1024).toFixed(2)}KB (${sizeDiff > '0' ? '+' : ''}${sizeDiff}%)`));
81
+ }
82
+ catch (error) {
83
+ spinner.fail(chalk.red('Failed to convert image'));
84
+ if (options.verbose) {
85
+ console.error(chalk.red('Error details:'), error);
86
+ }
87
+ else {
88
+ console.error(chalk.red(error.message));
89
+ }
90
+ process.exit(1);
91
+ }
92
+ });
93
+ }
94
+ //# sourceMappingURL=grayscale.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grayscale.js","sourceRoot":"","sources":["../../src/commands/grayscale.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function gridCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.d.ts","sourceRoot":"","sources":["../../src/commands/grid.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAqBzC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA2MnD"}
@@ -0,0 +1,193 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import fs from 'fs';
4
+ import { createSharpInstance } from '../utils/sharp.js';
5
+ import { createStandardHelp } from '../utils/helpFormatter.js';
6
+ export function gridCommand(imageCmd) {
7
+ imageCmd
8
+ .command('grid <images...>')
9
+ .description('Create image grid/collage from multiple images')
10
+ .option('-c, --columns <number>', 'Number of columns (default: auto-calculate)', parseInt)
11
+ .option('-r, --rows <number>', 'Number of rows (default: auto-calculate)', parseInt)
12
+ .option('-w, --width <pixels>', 'Cell width in pixels (default: 300)', parseInt, 300)
13
+ .option('-h, --height <pixels>', 'Cell height in pixels (default: 300)', parseInt, 300)
14
+ .option('-g, --gap <pixels>', 'Gap between images in pixels (default: 10)', parseInt, 10)
15
+ .option('-b, --background <color>', 'Background color (default: #FFFFFF)', '#FFFFFF')
16
+ .option('-o, --output <path>', 'Output file path (default: grid.jpg)')
17
+ .option('--dry-run', 'Show what would be done without executing')
18
+ .option('-v, --verbose', 'Verbose output')
19
+ .option('--help', 'Display help for grid command')
20
+ .action(async (images, options) => {
21
+ if (options.help) {
22
+ createStandardHelp({
23
+ commandName: 'grid',
24
+ emoji: '🎞️',
25
+ description: 'Create beautiful image grids and collages from multiple images. Perfect for social media posts, photo albums, and presentations.',
26
+ usage: ['grid image1.jpg image2.jpg image3.jpg', 'grid *.jpg -c 3 -w 400 -h 400', 'grid photo1.png photo2.png -g 20 -b "#000000"'],
27
+ options: [
28
+ { flag: '-c, --columns <number>', description: 'Number of columns (auto-calculated if not specified)' },
29
+ { flag: '-r, --rows <number>', description: 'Number of rows (auto-calculated if not specified)' },
30
+ { flag: '-w, --width <pixels>', description: 'Cell width in pixels (default: 300)' },
31
+ { flag: '-h, --height <pixels>', description: 'Cell height in pixels (default: 300)' },
32
+ { flag: '-g, --gap <pixels>', description: 'Gap between images (default: 10)' },
33
+ { flag: '-b, --background <color>', description: 'Background color - hex or name (default: #FFFFFF)' },
34
+ { flag: '-o, --output <path>', description: 'Output file path (default: grid.jpg)' },
35
+ { flag: '--dry-run', description: 'Preview changes without executing' },
36
+ { flag: '-v, --verbose', description: 'Show detailed output' }
37
+ ],
38
+ examples: [
39
+ { command: 'grid photo1.jpg photo2.jpg photo3.jpg photo4.jpg', description: 'Create 2x2 grid with default settings' },
40
+ { command: 'grid *.jpg -c 3 -w 400 -h 400', description: 'Create 3-column grid with 400x400 cells' },
41
+ { command: 'grid img1.png img2.png img3.png -g 20 -b black', description: 'Black background with 20px gaps' },
42
+ { command: 'grid photo*.jpg -c 5 -o collage.png', description: '5-column grid saved as collage.png' },
43
+ { command: 'grid *.jpg -r 2 -w 500 -g 0', description: 'Fixed 2 rows, no gaps' }
44
+ ],
45
+ additionalSections: [
46
+ {
47
+ title: 'Layout Options',
48
+ items: [
49
+ 'Auto layout - Only specify columns or rows, other is calculated',
50
+ 'Fixed grid - Specify both columns and rows',
51
+ 'Square cells - Use same width and height',
52
+ 'Custom aspect - Different width and height for cells'
53
+ ]
54
+ },
55
+ {
56
+ title: 'Use Cases',
57
+ items: [
58
+ 'Instagram multi-image posts',
59
+ 'Photo album layouts',
60
+ 'Before/after comparisons',
61
+ 'Product showcase grids',
62
+ 'Portfolio presentations',
63
+ 'Social media collages'
64
+ ]
65
+ },
66
+ {
67
+ title: 'Common Grid Sizes',
68
+ items: [
69
+ '2x2 - Four images, Instagram style',
70
+ '3x3 - Nine images, classic grid',
71
+ '4x4 - Sixteen images, large collage',
72
+ '1x3 - Three images horizontal',
73
+ '3x1 - Three images vertical'
74
+ ]
75
+ }
76
+ ],
77
+ tips: [
78
+ 'Images are automatically resized to fit cells',
79
+ 'Use --gap 0 for seamless grid',
80
+ 'Black/white backgrounds work great for galleries',
81
+ 'Square cells (same width/height) look most uniform'
82
+ ]
83
+ });
84
+ process.exit(0);
85
+ }
86
+ const spinner = ora('Creating grid...').start();
87
+ try {
88
+ // Validate inputs
89
+ if (images.length === 0) {
90
+ spinner.fail(chalk.red('No images provided'));
91
+ process.exit(1);
92
+ }
93
+ // Check all files exist
94
+ for (const img of images) {
95
+ if (!fs.existsSync(img)) {
96
+ spinner.fail(chalk.red(`Image not found: ${img}`));
97
+ process.exit(1);
98
+ }
99
+ }
100
+ const imageCount = images.length;
101
+ // Calculate grid dimensions
102
+ let columns = options.columns;
103
+ let rows = options.rows;
104
+ if (!columns && !rows) {
105
+ // Auto-calculate square-ish grid
106
+ columns = Math.ceil(Math.sqrt(imageCount));
107
+ rows = Math.ceil(imageCount / columns);
108
+ }
109
+ else if (columns && !rows) {
110
+ rows = Math.ceil(imageCount / columns);
111
+ }
112
+ else if (rows && !columns) {
113
+ columns = Math.ceil(imageCount / rows);
114
+ }
115
+ const cellWidth = options.width || 300;
116
+ const cellHeight = options.height || 300;
117
+ const gap = options.gap || 10;
118
+ const background = options.background || '#FFFFFF';
119
+ const gridWidth = columns * cellWidth + (columns - 1) * gap;
120
+ const gridHeight = rows * cellHeight + (rows - 1) * gap;
121
+ const outputPath = options.output || 'grid.jpg';
122
+ if (options.verbose) {
123
+ spinner.info(chalk.blue('Configuration:'));
124
+ console.log(chalk.dim(` Images: ${imageCount}`));
125
+ console.log(chalk.dim(` Grid: ${columns}x${rows}`));
126
+ console.log(chalk.dim(` Cell size: ${cellWidth}x${cellHeight}`));
127
+ console.log(chalk.dim(` Gap: ${gap}px`));
128
+ console.log(chalk.dim(` Canvas: ${gridWidth}x${gridHeight}`));
129
+ console.log(chalk.dim(` Output: ${outputPath}`));
130
+ spinner.start('Processing...');
131
+ }
132
+ if (options.dryRun) {
133
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
134
+ console.log(chalk.green('✓ Would create grid:'));
135
+ console.log(chalk.dim(` Images: ${imageCount}`));
136
+ console.log(chalk.dim(` Layout: ${columns}x${rows}`));
137
+ console.log(chalk.dim(` Output size: ${gridWidth}x${gridHeight}`));
138
+ return;
139
+ }
140
+ // Create base canvas
141
+ const canvas = await createSharpInstance({
142
+ create: {
143
+ width: gridWidth,
144
+ height: gridHeight,
145
+ channels: 4,
146
+ background: background
147
+ }
148
+ }).png().toBuffer();
149
+ // Process and position images
150
+ const composites = [];
151
+ for (let i = 0; i < Math.min(imageCount, columns * rows); i++) {
152
+ const row = Math.floor(i / columns);
153
+ const col = i % columns;
154
+ const x = col * (cellWidth + gap);
155
+ const y = row * (cellHeight + gap);
156
+ // Resize image to fit cell
157
+ const processedImage = await createSharpInstance(images[i])
158
+ .resize(cellWidth, cellHeight, {
159
+ fit: 'cover',
160
+ position: 'center'
161
+ })
162
+ .toBuffer();
163
+ composites.push({
164
+ input: processedImage,
165
+ left: x,
166
+ top: y
167
+ });
168
+ }
169
+ // Composite all images onto canvas
170
+ await createSharpInstance(canvas)
171
+ .composite(composites)
172
+ .toFile(outputPath);
173
+ const outputStats = fs.statSync(outputPath);
174
+ spinner.succeed(chalk.green('✓ Grid created successfully!'));
175
+ console.log(chalk.dim(` Images: ${imageCount} (${Math.min(imageCount, columns * rows)} used)`));
176
+ console.log(chalk.dim(` Layout: ${columns}x${rows}`));
177
+ console.log(chalk.dim(` Cell size: ${cellWidth}x${cellHeight}`));
178
+ console.log(chalk.dim(` Output: ${outputPath} (${gridWidth}x${gridHeight})`));
179
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
180
+ }
181
+ catch (error) {
182
+ spinner.fail(chalk.red('Failed to create grid'));
183
+ if (options.verbose) {
184
+ console.error(chalk.red('Error details:'), error);
185
+ }
186
+ else {
187
+ console.error(chalk.red(error.message));
188
+ }
189
+ process.exit(1);
190
+ }
191
+ });
192
+ }
193
+ //# sourceMappingURL=grid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"grid.js","sourceRoot":"","sources":["../../src/commands/grid.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function medianCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=median.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"median.d.ts","sourceRoot":"","sources":["../../src/commands/median.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAmIrD"}