@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,136 @@
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 convertCommand(imageCmd) {
8
+ imageCmd
9
+ .command('convert <input>')
10
+ .description('Convert image to different format')
11
+ .option('-f, --format <format>', 'Output format: jpg, png, webp, avif, tiff, gif', 'webp')
12
+ .option('-o, --output <path>', 'Output file path')
13
+ .option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
14
+ .option('--compression <level>', 'PNG compression level (0-9)', parseInt, 9)
15
+ .option('--progressive', 'Use progressive/interlaced format')
16
+ .option('--dry-run', 'Show what would be done without executing')
17
+ .option('-v, --verbose', 'Verbose output')
18
+ .option('--help', 'Display help for convert command')
19
+ .action(async (input, options) => {
20
+ if (options.help) {
21
+ createStandardHelp({
22
+ commandName: 'convert',
23
+ emoji: '🔄',
24
+ description: 'Convert images between different formats. Supports modern formats like WebP and AVIF for better compression and quality.',
25
+ usage: ['convert <input> -f <format>', 'convert <input> -f <format> -o <output>', 'convert <input> -f webp -q 85'],
26
+ options: [
27
+ { flag: '-f, --format <format>', description: 'Output format: jpg, png, webp, avif, tiff, gif (default: webp)' },
28
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>.<format>)' },
29
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
30
+ { flag: '--compression <level>', description: 'PNG compression level 0-9 (default: 9)' },
31
+ { flag: '--progressive', description: 'Use progressive/interlaced format' },
32
+ { flag: '--dry-run', description: 'Preview changes without executing' },
33
+ { flag: '-v, --verbose', description: 'Show detailed output' }
34
+ ],
35
+ examples: [
36
+ { command: 'convert photo.jpg -f webp', description: 'Convert JPG to WebP (modern, smaller)' },
37
+ { command: 'convert image.png -f avif -q 80', description: 'Convert to AVIF with quality 80' },
38
+ { command: 'convert pic.webp -f jpg', description: 'Convert WebP back to JPG' },
39
+ { command: 'convert photo.jpg -f png --compression 9', description: 'Convert to PNG with max compression' },
40
+ { command: 'convert image.png -f jpg --progressive', description: 'Convert to progressive JPG' }
41
+ ],
42
+ additionalSections: [
43
+ {
44
+ title: 'Format Guide',
45
+ items: [
46
+ 'WebP - Modern format, 25-35% smaller than JPG/PNG',
47
+ 'AVIF - Newest format, even smaller than WebP',
48
+ 'JPG - Best for photos, lossy compression',
49
+ 'PNG - Best for graphics/transparency, lossless',
50
+ 'TIFF - Professional/print, very large files',
51
+ 'GIF - Animations, limited colors'
52
+ ]
53
+ }
54
+ ],
55
+ tips: [
56
+ 'WebP and AVIF offer best compression for web',
57
+ 'Use PNG for images with transparency',
58
+ 'AVIF may not be supported in all browsers yet',
59
+ 'Progressive JPGs load gradually (better for web)'
60
+ ]
61
+ });
62
+ process.exit(0);
63
+ }
64
+ const spinner = ora('Processing image...').start();
65
+ try {
66
+ if (!fs.existsSync(input)) {
67
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
68
+ process.exit(1);
69
+ }
70
+ const validFormats = ['jpg', 'jpeg', 'png', 'webp', 'avif', 'tiff', 'gif'];
71
+ if (!validFormats.includes(options.format)) {
72
+ spinner.fail(chalk.red(`Invalid format. Supported: ${validFormats.join(', ')}`));
73
+ process.exit(1);
74
+ }
75
+ const inputPath = path.parse(input);
76
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}.${options.format}`);
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(` Format: ${options.format}`));
82
+ console.log(chalk.dim(` Quality: ${options.quality || 90}`));
83
+ spinner.start('Processing...');
84
+ }
85
+ if (options.dryRun) {
86
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
87
+ console.log(chalk.green('✓ Would convert image:'));
88
+ console.log(chalk.dim(` From: ${input}`));
89
+ console.log(chalk.dim(` To: ${outputPath}`));
90
+ console.log(chalk.dim(` Format: ${options.format}`));
91
+ return;
92
+ }
93
+ const metadata = await createSharpInstance(input).metadata();
94
+ let pipeline = createSharpInstance(input);
95
+ // Apply format-specific options
96
+ if (options.format === 'jpg' || options.format === 'jpeg') {
97
+ pipeline.jpeg({ quality: options.quality || 90, progressive: options.progressive || false });
98
+ }
99
+ else if (options.format === 'png') {
100
+ pipeline.png({ quality: options.quality || 90, compressionLevel: options.compression || 9, progressive: options.progressive || false });
101
+ }
102
+ else if (options.format === 'webp') {
103
+ pipeline.webp({ quality: options.quality || 90 });
104
+ }
105
+ else if (options.format === 'avif') {
106
+ pipeline.avif({ quality: options.quality || 90 });
107
+ }
108
+ else if (options.format === 'tiff') {
109
+ pipeline.tiff({ quality: options.quality || 90 });
110
+ }
111
+ else if (options.format === 'gif') {
112
+ pipeline.gif();
113
+ }
114
+ await pipeline.toFile(outputPath);
115
+ const inputStats = fs.statSync(input);
116
+ const outputStats = fs.statSync(outputPath);
117
+ const sizeDiff = ((outputStats.size - inputStats.size) / inputStats.size * 100).toFixed(2);
118
+ spinner.succeed(chalk.green('✓ Image converted successfully!'));
119
+ console.log(chalk.dim(` Input: ${input} (${metadata.format?.toUpperCase()})`));
120
+ console.log(chalk.dim(` Output: ${outputPath} (${options.format.toUpperCase()})`));
121
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
122
+ console.log(chalk.dim(` File size: ${(inputStats.size / 1024).toFixed(2)}KB → ${(outputStats.size / 1024).toFixed(2)}KB (${sizeDiff > '0' ? '+' : ''}${sizeDiff}%)`));
123
+ }
124
+ catch (error) {
125
+ spinner.fail(chalk.red('Failed to convert image'));
126
+ if (options.verbose) {
127
+ console.error(chalk.red('Error details:'), error);
128
+ }
129
+ else {
130
+ console.error(chalk.red(error.message));
131
+ }
132
+ process.exit(1);
133
+ }
134
+ });
135
+ }
136
+ //# sourceMappingURL=convert.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.js","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function convolveCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=convolve.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convolve.d.ts","sourceRoot":"","sources":["../../src/commands/convolve.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAyBzC,wBAAgB,eAAe,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA+JvD"}
@@ -0,0 +1,171 @@
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
+ // Predefined kernels
8
+ const KERNELS = {
9
+ sharpen: [[0, -1, 0], [-1, 5, -1], [0, -1, 0]],
10
+ emboss: [[-2, -1, 0], [-1, 1, 1], [0, 1, 2]],
11
+ 'edge-detect': [[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]],
12
+ 'box-blur': [[1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9], [1 / 9, 1 / 9, 1 / 9]],
13
+ 'gaussian-blur': [[1 / 16, 2 / 16, 1 / 16], [2 / 16, 4 / 16, 2 / 16], [1 / 16, 2 / 16, 1 / 16]],
14
+ laplacian: [[0, 1, 0], [1, -4, 1], [0, 1, 0]],
15
+ 'high-pass': [[-1, -1, -1], [-1, 8, -1], [-1, -1, -1]]
16
+ };
17
+ export function convolveCommand(imageCmd) {
18
+ imageCmd
19
+ .command('convolve <input>')
20
+ .description('Apply custom convolution kernel (advanced filtering)')
21
+ .option('-k, --kernel <preset>', `Predefined kernel: ${Object.keys(KERNELS).join(', ')}`)
22
+ .option('--custom <matrix>', 'Custom kernel as JSON array: "[[1,2,1],[2,4,2],[1,2,1]]"')
23
+ .option('--scale <value>', 'Kernel scale factor', parseFloat, 1)
24
+ .option('--offset <value>', 'Kernel offset', parseFloat, 0)
25
+ .option('-o, --output <path>', 'Output file path')
26
+ .option('--dry-run', 'Show what would be done without executing')
27
+ .option('-v, --verbose', 'Verbose output')
28
+ .option('--help', 'Display help for convolve command')
29
+ .action(async (input, options) => {
30
+ if (options.help) {
31
+ createStandardHelp({
32
+ commandName: 'convolve',
33
+ emoji: '🔬',
34
+ description: 'Apply custom convolution kernels for advanced image filtering. Create edge detection, embossing, custom blurs, and more.',
35
+ usage: ['convolve <input> --kernel sharpen', 'convolve <input> --kernel emboss', 'convolve <input> --custom "[[1,2,1],[2,4,2],[1,2,1]]"'],
36
+ options: [
37
+ { flag: '-k, --kernel <preset>', description: 'Predefined: sharpen, emboss, edge-detect, box-blur, gaussian-blur, laplacian, high-pass' },
38
+ { flag: '--custom <matrix>', description: 'Custom kernel as JSON array' },
39
+ { flag: '--scale <value>', description: 'Kernel scale factor (default: 1)' },
40
+ { flag: '--offset <value>', description: 'Kernel offset value (default: 0)' },
41
+ { flag: '-o, --output <path>', description: 'Output file path' },
42
+ { flag: '--dry-run', description: 'Preview changes without executing' },
43
+ { flag: '-v, --verbose', description: 'Show detailed output' }
44
+ ],
45
+ examples: [
46
+ { command: 'convolve image.jpg --kernel emboss', description: 'Apply emboss effect' },
47
+ { command: 'convolve photo.png --kernel edge-detect', description: 'Detect edges' },
48
+ { command: 'convolve pic.jpg --kernel gaussian-blur', description: 'Apply Gaussian blur' },
49
+ { command: 'convolve image.jpg --custom "[[0,-1,0],[-1,5,-1],[0,-1,0]]"', description: 'Custom sharpening kernel' },
50
+ { command: 'convolve photo.jpg --kernel laplacian --scale 2', description: 'Enhanced Laplacian with scale' }
51
+ ],
52
+ additionalSections: [
53
+ {
54
+ title: 'Predefined Kernels',
55
+ items: [
56
+ 'sharpen - Enhance edges and details',
57
+ 'emboss - Create 3D raised effect',
58
+ 'edge-detect - Highlight edges',
59
+ 'box-blur - Simple average blur',
60
+ 'gaussian-blur - Smooth weighted blur',
61
+ 'laplacian - Edge detection (2nd derivative)',
62
+ 'high-pass - Emphasize high frequencies'
63
+ ]
64
+ },
65
+ {
66
+ title: 'Custom Kernels',
67
+ items: [
68
+ 'Must be 3x3 or 5x5 matrix',
69
+ 'Format: JSON array of arrays',
70
+ 'Values typically sum to 1 (or use scale)',
71
+ 'Negative values create special effects',
72
+ 'Center value is key reference point'
73
+ ]
74
+ }
75
+ ],
76
+ tips: [
77
+ 'Start with predefined kernels',
78
+ 'Use scale to normalize custom kernels',
79
+ 'Emboss works great on textures',
80
+ 'Edge detection useful for analysis'
81
+ ]
82
+ });
83
+ process.exit(0);
84
+ }
85
+ const spinner = ora('Applying convolution...').start();
86
+ try {
87
+ if (!fs.existsSync(input)) {
88
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
89
+ process.exit(1);
90
+ }
91
+ let kernel;
92
+ let kernelName;
93
+ // Determine kernel to use
94
+ if (options.kernel) {
95
+ const kernelStr = String(options.kernel);
96
+ if (!(kernelStr in KERNELS)) {
97
+ spinner.fail(chalk.red(`Invalid kernel. Available: ${Object.keys(KERNELS).join(', ')}`));
98
+ process.exit(1);
99
+ }
100
+ kernel = KERNELS[kernelStr];
101
+ kernelName = kernelStr;
102
+ }
103
+ else if (options.custom) {
104
+ try {
105
+ kernel = JSON.parse(options.custom);
106
+ kernelName = 'custom';
107
+ }
108
+ catch (e) {
109
+ spinner.fail(chalk.red('Invalid custom kernel JSON format'));
110
+ process.exit(1);
111
+ }
112
+ }
113
+ else {
114
+ spinner.fail(chalk.red('Please specify --kernel or --custom'));
115
+ process.exit(1);
116
+ }
117
+ const inputPath = path.parse(input);
118
+ const outputPath = options.output || path.join(inputPath.dir, `${inputPath.name}-${kernelName}${inputPath.ext}`);
119
+ if (options.verbose) {
120
+ spinner.info(chalk.blue('Configuration:'));
121
+ console.log(chalk.dim(` Input: ${input}`));
122
+ console.log(chalk.dim(` Output: ${outputPath}`));
123
+ console.log(chalk.dim(` Kernel: ${kernelName}`));
124
+ console.log(chalk.dim(` Matrix: ${JSON.stringify(kernel)}`));
125
+ if (options.scale !== 1)
126
+ console.log(chalk.dim(` Scale: ${options.scale}`));
127
+ if (options.offset !== 0)
128
+ console.log(chalk.dim(` Offset: ${options.offset}`));
129
+ spinner.start('Processing...');
130
+ }
131
+ if (options.dryRun) {
132
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
133
+ console.log(chalk.green('✓ Would apply convolution:'));
134
+ console.log(chalk.dim(` Input: ${input}`));
135
+ console.log(chalk.dim(` Kernel: ${kernelName}`));
136
+ return;
137
+ }
138
+ const metadata = await createSharpInstance(input).metadata();
139
+ // Flatten kernel for Sharp (expects 1D array)
140
+ const flatKernel = kernel.flat();
141
+ const kernelSize = Math.sqrt(flatKernel.length);
142
+ await createSharpInstance(input)
143
+ .convolve({
144
+ width: kernelSize,
145
+ height: kernelSize,
146
+ kernel: flatKernel,
147
+ scale: options.scale,
148
+ offset: options.offset
149
+ })
150
+ .toFile(outputPath);
151
+ const outputStats = fs.statSync(outputPath);
152
+ spinner.succeed(chalk.green('✓ Convolution applied successfully!'));
153
+ console.log(chalk.dim(` Input: ${input}`));
154
+ console.log(chalk.dim(` Output: ${outputPath}`));
155
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
156
+ console.log(chalk.dim(` Kernel: ${kernelName} (${kernelSize}x${kernelSize})`));
157
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
158
+ }
159
+ catch (error) {
160
+ spinner.fail(chalk.red('Failed to apply convolution'));
161
+ if (options.verbose) {
162
+ console.error(chalk.red('Error details:'), error);
163
+ }
164
+ else {
165
+ console.error(chalk.red(error.message));
166
+ }
167
+ process.exit(1);
168
+ }
169
+ });
170
+ }
171
+ //# sourceMappingURL=convolve.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convolve.js","sourceRoot":"","sources":["../../src/commands/convolve.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function cropCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=crop.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop.d.ts","sourceRoot":"","sources":["../../src/commands/crop.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAyHnD"}
@@ -0,0 +1,120 @@
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 cropCommand(imageCmd) {
8
+ imageCmd
9
+ .command('crop <input>')
10
+ .description('Crop image to specified dimensions and position')
11
+ .option('-x, --x <x>', 'X position (left offset in pixels)', parseInt, 0)
12
+ .option('-y, --y <y>', 'Y position (top offset in pixels)', parseInt, 0)
13
+ .option('-w, --width <width>', 'Crop width in pixels', parseInt)
14
+ .option('-h, --height <height>', 'Crop height in pixels', parseInt)
15
+ .option('-o, --output <path>', 'Output file path')
16
+ .option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
17
+ .option('--dry-run', 'Show what would be done without executing')
18
+ .option('-v, --verbose', 'Verbose output')
19
+ .option('--help', 'Display help for crop command')
20
+ .action(async (input, options) => {
21
+ if (options.help) {
22
+ createStandardHelp({
23
+ commandName: 'crop',
24
+ emoji: '✂️',
25
+ description: 'Crop images to specific dimensions and position. Extract a rectangular region from your image with pixel-perfect precision.',
26
+ usage: ['crop <input> -w <width> -h <height>', 'crop <input> -x <x> -y <y> -w <width> -h <height>'],
27
+ options: [
28
+ { flag: '-x, --x <x>', description: 'X position - left offset in pixels (default: 0)' },
29
+ { flag: '-y, --y <y>', description: 'Y position - top offset in pixels (default: 0)' },
30
+ { flag: '-w, --width <width>', description: 'Crop width in pixels (required)' },
31
+ { flag: '-h, --height <height>', description: 'Crop height in pixels (required)' },
32
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-cropped.<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: 'crop photo.jpg -w 800 -h 600', description: 'Crop 800x600 from top-left corner' },
39
+ { command: 'crop image.png -x 100 -y 100 -w 500 -h 500', description: 'Crop square from specific position' },
40
+ { command: 'crop pic.jpg -w 1920 -h 1080 -o thumbnail.jpg', description: 'Crop to Full HD dimensions' }
41
+ ],
42
+ tips: ['Use --dry-run to verify crop dimensions', 'Crop dimensions must fit within source image']
43
+ });
44
+ process.exit(0);
45
+ }
46
+ const spinner = ora('Processing image...').start();
47
+ try {
48
+ if (!fs.existsSync(input)) {
49
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
50
+ process.exit(1);
51
+ }
52
+ if (!options.width || !options.height) {
53
+ spinner.fail(chalk.red('Both width and height are required for cropping'));
54
+ process.exit(1);
55
+ }
56
+ const inputPath = path.parse(input);
57
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-cropped${inputPath.ext}`);
58
+ if (options.verbose) {
59
+ spinner.info(chalk.blue('Configuration:'));
60
+ console.log(chalk.dim(` Input: ${input}`));
61
+ console.log(chalk.dim(` Output: ${outputPath}`));
62
+ console.log(chalk.dim(` Position: (${options.x || 0}, ${options.y || 0})`));
63
+ console.log(chalk.dim(` Size: ${options.width}x${options.height}`));
64
+ spinner.start('Processing...');
65
+ }
66
+ const metadata = await createSharpInstance(input).metadata();
67
+ if ((options.x || 0) + options.width > (metadata.width || 0)) {
68
+ spinner.fail(chalk.red(`Crop width exceeds image bounds`));
69
+ process.exit(1);
70
+ }
71
+ if ((options.y || 0) + options.height > (metadata.height || 0)) {
72
+ spinner.fail(chalk.red(`Crop height exceeds image bounds`));
73
+ process.exit(1);
74
+ }
75
+ if (options.dryRun) {
76
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
77
+ console.log(chalk.green('✓ Would crop image:'));
78
+ console.log(chalk.dim(` From: ${input}`));
79
+ console.log(chalk.dim(` To: ${outputPath}`));
80
+ console.log(chalk.dim(` Position: (${options.x || 0}, ${options.y || 0})`));
81
+ console.log(chalk.dim(` Size: ${options.width}x${options.height}`));
82
+ return;
83
+ }
84
+ const pipeline = createSharpInstance(input).extract({
85
+ left: options.x || 0,
86
+ top: options.y || 0,
87
+ width: options.width,
88
+ height: options.height
89
+ });
90
+ const outputExt = path.extname(outputPath).toLowerCase();
91
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
92
+ pipeline.jpeg({ quality: options.quality || 90 });
93
+ }
94
+ else if (outputExt === '.png') {
95
+ pipeline.png({ quality: options.quality || 90 });
96
+ }
97
+ else if (outputExt === '.webp') {
98
+ pipeline.webp({ quality: options.quality || 90 });
99
+ }
100
+ await pipeline.toFile(outputPath);
101
+ spinner.succeed(chalk.green('✓ Image cropped successfully!'));
102
+ console.log(chalk.dim(` Input: ${input}`));
103
+ console.log(chalk.dim(` Output: ${outputPath}`));
104
+ console.log(chalk.dim(` Original size: ${metadata.width}x${metadata.height}`));
105
+ console.log(chalk.dim(` Cropped size: ${options.width}x${options.height}`));
106
+ console.log(chalk.dim(` Position: (${options.x || 0}, ${options.y || 0})`));
107
+ }
108
+ catch (error) {
109
+ spinner.fail(chalk.red('Failed to crop image'));
110
+ if (options.verbose) {
111
+ console.error(chalk.red('Error details:'), error);
112
+ }
113
+ else {
114
+ console.error(chalk.red(error.message));
115
+ }
116
+ process.exit(1);
117
+ }
118
+ });
119
+ }
120
+ //# sourceMappingURL=crop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"crop.js","sourceRoot":"","sources":["../../src/commands/crop.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function dominantColorCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=dominant-color.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dominant-color.d.ts","sourceRoot":"","sources":["../../src/commands/dominant-color.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAezC,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA4L5D"}