@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,122 @@
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 blurCommand(imageCmd) {
8
+ imageCmd
9
+ .command('blur <input>')
10
+ .description('Apply blur effect to image')
11
+ .option('-s, --sigma <sigma>', 'Blur strength (0.3-1000, default: 10)', parseFloat, 10)
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 blur command')
17
+ .action(async (input, options) => {
18
+ // Show help if requested
19
+ if (options.help) {
20
+ createStandardHelp({
21
+ commandName: 'blur',
22
+ emoji: '🌫️',
23
+ description: 'Apply Gaussian blur effect to images. Control the blur intensity with sigma parameter for subtle to extreme blur effects.',
24
+ usage: [
25
+ 'blur <input>',
26
+ 'blur <input> -s <sigma>',
27
+ 'blur <input> -s <sigma> -o <output>'
28
+ ],
29
+ options: [
30
+ { flag: '-s, --sigma <sigma>', description: 'Blur strength (0.3-1000, default: 10)' },
31
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-blurred.<ext>)' },
32
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
33
+ { flag: '--dry-run', description: 'Preview changes without executing' },
34
+ { flag: '-v, --verbose', description: 'Show detailed output' }
35
+ ],
36
+ examples: [
37
+ { command: 'blur photo.jpg', description: 'Apply default blur (sigma: 10)' },
38
+ { command: 'blur image.png -s 5', description: 'Apply light blur' },
39
+ { command: 'blur pic.jpg -s 50', description: 'Apply heavy blur' },
40
+ { command: 'blur photo.jpg -s 20 -o blurred.jpg', description: 'Blur with custom output' },
41
+ { command: 'blur background.png -s 30 -q 95', description: 'Blur with high quality' }
42
+ ],
43
+ additionalSections: [
44
+ {
45
+ title: 'Blur Strength Guide',
46
+ items: [
47
+ 'Light blur: 1-5 (subtle effect)',
48
+ 'Medium blur: 5-15 (noticeable but detailed)',
49
+ 'Strong blur: 15-30 (background blur effect)',
50
+ 'Heavy blur: 30+ (privacy/anonymization)'
51
+ ]
52
+ }
53
+ ],
54
+ tips: [
55
+ 'Use sigma 3-5 for portrait background blur',
56
+ 'Use sigma 20+ for privacy/face obscuring',
57
+ 'Higher sigma values increase processing time'
58
+ ]
59
+ });
60
+ process.exit(0);
61
+ }
62
+ const spinner = ora('Processing image...').start();
63
+ try {
64
+ if (!fs.existsSync(input)) {
65
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
66
+ process.exit(1);
67
+ }
68
+ if (options.sigma && (options.sigma < 0.3 || options.sigma > 1000)) {
69
+ spinner.fail(chalk.red('Sigma must be between 0.3 and 1000'));
70
+ process.exit(1);
71
+ }
72
+ const inputPath = path.parse(input);
73
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-blurred${inputPath.ext}`);
74
+ if (options.verbose) {
75
+ spinner.info(chalk.blue('Configuration:'));
76
+ console.log(chalk.dim(` Input: ${input}`));
77
+ console.log(chalk.dim(` Output: ${outputPath}`));
78
+ console.log(chalk.dim(` Sigma: ${options.sigma || 10}`));
79
+ spinner.start('Processing...');
80
+ }
81
+ if (options.dryRun) {
82
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
83
+ console.log(chalk.green('✓ Would apply blur to image:'));
84
+ console.log(chalk.dim(` From: ${input}`));
85
+ console.log(chalk.dim(` To: ${outputPath}`));
86
+ console.log(chalk.dim(` Sigma: ${options.sigma || 10}`));
87
+ return;
88
+ }
89
+ const metadata = await createSharpInstance(input).metadata();
90
+ const pipeline = createSharpInstance(input).blur(options.sigma || 10);
91
+ const outputExt = path.extname(outputPath).toLowerCase();
92
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
93
+ pipeline.jpeg({ quality: options.quality || 90 });
94
+ }
95
+ else if (outputExt === '.png') {
96
+ pipeline.png({ quality: options.quality || 90 });
97
+ }
98
+ else if (outputExt === '.webp') {
99
+ pipeline.webp({ quality: options.quality || 90 });
100
+ }
101
+ await pipeline.toFile(outputPath);
102
+ const outputStats = fs.statSync(outputPath);
103
+ spinner.succeed(chalk.green('✓ Blur applied successfully!'));
104
+ console.log(chalk.dim(` Input: ${input}`));
105
+ console.log(chalk.dim(` Output: ${outputPath}`));
106
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
107
+ console.log(chalk.dim(` Sigma: ${options.sigma || 10}`));
108
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
109
+ }
110
+ catch (error) {
111
+ spinner.fail(chalk.red('Failed to blur image'));
112
+ if (options.verbose) {
113
+ console.error(chalk.red('Error details:'), error);
114
+ }
115
+ else {
116
+ console.error(chalk.red(error.message));
117
+ }
118
+ process.exit(1);
119
+ }
120
+ });
121
+ }
122
+ //# sourceMappingURL=blur.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"blur.js","sourceRoot":"","sources":["../../src/commands/blur.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function borderCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=border.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border.d.ts","sourceRoot":"","sources":["../../src/commands/border.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA0HrD"}
@@ -0,0 +1,122 @@
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 borderCommand(imageCmd) {
8
+ imageCmd
9
+ .command('border <input>')
10
+ .description('Add decorative border/frame around image')
11
+ .option('-w, --width <pixels>', 'Border width in pixels', parseInt, 10)
12
+ .option('--color <color>', 'Border color (hex, rgb, or name)', '#000000')
13
+ .option('-o, --output <path>', 'Output file path')
14
+ .option('--dry-run', 'Show what would be done without executing')
15
+ .option('-v, --verbose', 'Verbose output')
16
+ .option('--help', 'Display help for border command')
17
+ .action(async (input, options) => {
18
+ if (options.help) {
19
+ createStandardHelp({
20
+ commandName: 'border',
21
+ emoji: '🖼️',
22
+ description: 'Add solid color borders or decorative frames around images. Perfect for presentations, galleries, and social media posts.',
23
+ usage: ['border <input>', 'border <input> --width 20 --color white', 'border <input> -w 50 --color "#FF0000"'],
24
+ options: [
25
+ { flag: '-w, --width <pixels>', description: 'Border width in pixels (default: 10)' },
26
+ { flag: '--color <color>', description: 'Border color - hex (#FF0000), rgb (rgb(255,0,0)), or name (red) (default: #000000)' },
27
+ { flag: '-o, --output <path>', description: 'Output file path' },
28
+ { flag: '--dry-run', description: 'Preview changes without executing' },
29
+ { flag: '-v, --verbose', description: 'Show detailed output' }
30
+ ],
31
+ examples: [
32
+ { command: 'border photo.jpg', description: 'Add default 10px black border' },
33
+ { command: 'border image.png --width 20 --color white', description: 'Add 20px white border' },
34
+ { command: 'border pic.jpg -w 5 --color "#FF5733"', description: 'Add 5px orange border' },
35
+ { command: 'border photo.jpg --width 30 --color "rgb(100,100,100)"', description: 'Add 30px gray border' },
36
+ { command: 'border image.png --width 15 --color gold', description: 'Add 15px gold border' }
37
+ ],
38
+ additionalSections: [
39
+ {
40
+ title: 'Color Formats',
41
+ items: [
42
+ 'Hex: #FF0000 (red), #00FF00 (green), #0000FF (blue)',
43
+ 'RGB: rgb(255, 0, 0) or rgba(255, 0, 0, 0.5)',
44
+ 'Named: white, black, red, blue, gold, silver, etc.',
45
+ 'Transparent: rgba(0, 0, 0, 0) for transparent border'
46
+ ]
47
+ },
48
+ {
49
+ title: 'Use Cases',
50
+ items: [
51
+ 'Frame images for presentations',
52
+ 'Add white space around photos',
53
+ 'Create Instagram-style borders',
54
+ 'Separate images in galleries',
55
+ 'Professional photo finishing'
56
+ ]
57
+ }
58
+ ],
59
+ tips: [
60
+ 'Use white borders for clean, modern look',
61
+ 'Black borders work well for galleries',
62
+ 'Colored borders can match brand identity',
63
+ 'Larger borders create emphasis'
64
+ ]
65
+ });
66
+ process.exit(0);
67
+ }
68
+ const spinner = ora('Adding border...').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 inputPath = path.parse(input);
75
+ const outputPath = options.output || path.join(inputPath.dir, `${inputPath.name}-border${inputPath.ext}`);
76
+ if (options.verbose) {
77
+ spinner.info(chalk.blue('Configuration:'));
78
+ console.log(chalk.dim(` Input: ${input}`));
79
+ console.log(chalk.dim(` Output: ${outputPath}`));
80
+ console.log(chalk.dim(` Border width: ${options.width}px`));
81
+ console.log(chalk.dim(` Border color: ${options.color}`));
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 add border:'));
87
+ console.log(chalk.dim(` Input: ${input}`));
88
+ console.log(chalk.dim(` Width: ${options.width}px`));
89
+ console.log(chalk.dim(` Color: ${options.color}`));
90
+ return;
91
+ }
92
+ const metadata = await createSharpInstance(input).metadata();
93
+ await createSharpInstance(input)
94
+ .extend({
95
+ top: options.width || 10,
96
+ bottom: options.width || 10,
97
+ left: options.width || 10,
98
+ right: options.width || 10,
99
+ background: options.color || '#000000'
100
+ })
101
+ .toFile(outputPath);
102
+ const outputStats = fs.statSync(outputPath);
103
+ const outputMetadata = await createSharpInstance(outputPath).metadata();
104
+ spinner.succeed(chalk.green('✓ Border added successfully!'));
105
+ console.log(chalk.dim(` Input: ${input} (${metadata.width}x${metadata.height})`));
106
+ console.log(chalk.dim(` Output: ${outputPath} (${outputMetadata.width}x${outputMetadata.height})`));
107
+ console.log(chalk.dim(` Border: ${options.width}px ${options.color}`));
108
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
109
+ }
110
+ catch (error) {
111
+ spinner.fail(chalk.red('Failed to add border'));
112
+ if (options.verbose) {
113
+ console.error(chalk.red('Error details:'), error);
114
+ }
115
+ else {
116
+ console.error(chalk.red(error.message));
117
+ }
118
+ process.exit(1);
119
+ }
120
+ });
121
+ }
122
+ //# sourceMappingURL=border.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"border.js","sourceRoot":"","sources":["../../src/commands/border.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function claheCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=clahe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clahe.d.ts","sourceRoot":"","sources":["../../src/commands/clahe.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAyHpD"}
@@ -0,0 +1,121 @@
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 claheCommand(imageCmd) {
8
+ imageCmd
9
+ .command('clahe <input>')
10
+ .description('Apply CLAHE (Contrast Limited Adaptive Histogram Equalization)')
11
+ .option('-w, --width <size>', 'Tile width in pixels (default: 3)', parseInt, 3)
12
+ .option('-h, --height <size>', 'Tile height in pixels (default: 3)', parseInt, 3)
13
+ .option('--max-slope <value>', 'Maximum slope for contrast limiting (default: 3)', parseFloat, 3)
14
+ .option('-o, --output <path>', 'Output file path')
15
+ .option('--dry-run', 'Show what would be done without executing')
16
+ .option('-v, --verbose', 'Verbose output')
17
+ .option('--help', 'Display help for clahe command')
18
+ .action(async (input, options) => {
19
+ if (options.help) {
20
+ createStandardHelp({
21
+ commandName: 'clahe',
22
+ emoji: '✨',
23
+ description: 'Apply Contrast Limited Adaptive Histogram Equalization to enhance local contrast. Especially useful for medical imaging, underwater photos, and low-light conditions.',
24
+ usage: ['clahe <input>', 'clahe <input> --width 5 --height 5', 'clahe <input> --max-slope 2'],
25
+ options: [
26
+ { flag: '-w, --width <size>', description: 'Tile width in pixels (default: 3)' },
27
+ { flag: '-h, --height <size>', description: 'Tile height in pixels (default: 3)' },
28
+ { flag: '--max-slope <value>', description: 'Maximum slope for contrast limiting 1-5 (default: 3)' },
29
+ { flag: '-o, --output <path>', description: 'Output file path' },
30
+ { flag: '--dry-run', description: 'Preview changes without executing' },
31
+ { flag: '-v, --verbose', description: 'Show detailed output' }
32
+ ],
33
+ examples: [
34
+ { command: 'clahe photo.jpg', description: 'Apply default CLAHE enhancement' },
35
+ { command: 'clahe dark.jpg --max-slope 2', description: 'Subtle enhancement' },
36
+ { command: 'clahe medical.png --width 5 --height 5', description: 'Larger tiles for smoother result' },
37
+ { command: 'clahe underwater.jpg --max-slope 4', description: 'Strong enhancement' }
38
+ ],
39
+ additionalSections: [
40
+ {
41
+ title: 'Parameter Guide',
42
+ items: [
43
+ 'Width/Height: Smaller = more local, Larger = more global',
44
+ 'Max Slope: Lower = subtle, Higher = dramatic',
45
+ 'Typical range: 2-4 for most images',
46
+ 'Medical imaging: 3-5 for detail enhancement'
47
+ ]
48
+ },
49
+ {
50
+ title: 'Use Cases',
51
+ items: [
52
+ 'Enhance low-light photographs',
53
+ 'Medical and scientific imaging',
54
+ 'Underwater photography correction',
55
+ 'Improve visibility in shadows',
56
+ 'Historical photo restoration',
57
+ 'Satellite/aerial imagery'
58
+ ]
59
+ }
60
+ ],
61
+ tips: [
62
+ 'Start with default values and adjust',
63
+ 'Lower max-slope for natural results',
64
+ 'Great for revealing shadow details',
65
+ 'Works best on grayscale or low-contrast images'
66
+ ]
67
+ });
68
+ process.exit(0);
69
+ }
70
+ const spinner = ora('Applying CLAHE...').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(inputPath.dir, `${inputPath.name}-clahe${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(` Tile size: ${options.width}x${options.height}`));
83
+ console.log(chalk.dim(` Max slope: ${options.maxSlope}`));
84
+ spinner.start('Processing...');
85
+ }
86
+ if (options.dryRun) {
87
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
88
+ console.log(chalk.green('✓ Would apply CLAHE:'));
89
+ console.log(chalk.dim(` Input: ${input}`));
90
+ console.log(chalk.dim(` Tile: ${options.width}x${options.height}, Max slope: ${options.maxSlope}`));
91
+ return;
92
+ }
93
+ const metadata = await createSharpInstance(input).metadata();
94
+ await createSharpInstance(input)
95
+ .clahe({
96
+ width: options.width || 3,
97
+ height: options.height || 3,
98
+ maxSlope: options.maxSlope || 3
99
+ })
100
+ .toFile(outputPath);
101
+ const outputStats = fs.statSync(outputPath);
102
+ spinner.succeed(chalk.green('✓ CLAHE applied successfully!'));
103
+ console.log(chalk.dim(` Input: ${input}`));
104
+ console.log(chalk.dim(` Output: ${outputPath}`));
105
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
106
+ console.log(chalk.dim(` Tile: ${options.width}x${options.height}, Max slope: ${options.maxSlope}`));
107
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
108
+ }
109
+ catch (error) {
110
+ spinner.fail(chalk.red('Failed to apply CLAHE'));
111
+ if (options.verbose) {
112
+ console.error(chalk.red('Error details:'), error);
113
+ }
114
+ else {
115
+ console.error(chalk.red(error.message));
116
+ }
117
+ process.exit(1);
118
+ }
119
+ });
120
+ }
121
+ //# sourceMappingURL=clahe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"clahe.js","sourceRoot":"","sources":["../../src/commands/clahe.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAa/D,MAAM,UAAU,YAAY,CAAC,QAAiB;IAC5C,QAAQ;SACL,OAAO,CAAC,eAAe,CAAC;SACxB,WAAW,CAAC,gEAAgE,CAAC;SAC7E,MAAM,CAAC,oBAAoB,EAAE,mCAAmC,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC9E,MAAM,CAAC,qBAAqB,EAAE,oCAAoC,EAAE,QAAQ,EAAE,CAAC,CAAC;SAChF,MAAM,CAAC,qBAAqB,EAAE,kDAAkD,EAAE,UAAU,EAAE,CAAC,CAAC;SAChG,MAAM,CAAC,qBAAqB,EAAE,kBAAkB,CAAC;SACjD,MAAM,CAAC,WAAW,EAAE,2CAA2C,CAAC;SAChE,MAAM,CAAC,eAAe,EAAE,gBAAgB,CAAC;SACzC,MAAM,CAAC,QAAQ,EAAE,gCAAgC,CAAC;SAClD,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAAqB,EAAE,EAAE;QACrD,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,kBAAkB,CAAC;gBACjB,WAAW,EAAE,OAAO;gBACpB,KAAK,EAAE,GAAG;gBACV,WAAW,EAAE,uKAAuK;gBACpL,KAAK,EAAE,CAAC,eAAe,EAAE,oCAAoC,EAAE,6BAA6B,CAAC;gBAC7F,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,mCAAmC,EAAE;oBAChF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,oCAAoC,EAAE;oBAClF,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,sDAAsD,EAAE;oBACpG,EAAE,IAAI,EAAE,qBAAqB,EAAE,WAAW,EAAE,kBAAkB,EAAE;oBAChE,EAAE,IAAI,EAAE,WAAW,EAAE,WAAW,EAAE,mCAAmC,EAAE;oBACvE,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,sBAAsB,EAAE;iBAC/D;gBACD,QAAQ,EAAE;oBACR,EAAE,OAAO,EAAE,iBAAiB,EAAE,WAAW,EAAE,iCAAiC,EAAE;oBAC9E,EAAE,OAAO,EAAE,8BAA8B,EAAE,WAAW,EAAE,oBAAoB,EAAE;oBAC9E,EAAE,OAAO,EAAE,wCAAwC,EAAE,WAAW,EAAE,kCAAkC,EAAE;oBACtG,EAAE,OAAO,EAAE,oCAAoC,EAAE,WAAW,EAAE,oBAAoB,EAAE;iBACrF;gBACD,kBAAkB,EAAE;oBAClB;wBACE,KAAK,EAAE,iBAAiB;wBACxB,KAAK,EAAE;4BACL,0DAA0D;4BAC1D,8CAA8C;4BAC9C,oCAAoC;4BACpC,6CAA6C;yBAC9C;qBACF;oBACD;wBACE,KAAK,EAAE,WAAW;wBAClB,KAAK,EAAE;4BACL,+BAA+B;4BAC/B,gCAAgC;4BAChC,mCAAmC;4BACnC,+BAA+B;4BAC/B,8BAA8B;4BAC9B,0BAA0B;yBAC3B;qBACF;iBACF;gBACD,IAAI,EAAE;oBACJ,sCAAsC;oBACtC,qCAAqC;oBACrC,oCAAoC;oBACpC,gDAAgD;iBACjD;aACF,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,mBAAmB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEjD,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC1B,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,yBAAyB,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;YAED,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACpC,MAAM,UAAU,GAAG,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,IAAI,SAAS,SAAS,CAAC,GAAG,EAAE,CAAC,CAAC;YAEzG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;gBAC3C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC,CAAC;gBAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC1E,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBAC3D,OAAO,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;YACjC,CAAC;YAED,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,wCAAwC,CAAC,CAAC,CAAC;gBACrE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,sBAAsB,CAAC,CAAC,CAAC;gBACjD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC;gBAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;gBACrG,OAAO;YACT,CAAC;YAED,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,CAAC,QAAQ,EAAE,CAAC;YAE7D,MAAM,mBAAmB,CAAC,KAAK,CAAC;iBAC7B,KAAK,CAAC;gBACL,KAAK,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;gBACzB,MAAM,EAAE,OAAO,CAAC,MAAM,IAAI,CAAC;gBAC3B,QAAQ,EAAE,OAAO,CAAC,QAAQ,IAAI,CAAC;aAChC,CAAC;iBACD,MAAM,CAAC,UAAU,CAAC,CAAC;YAEtB,MAAM,WAAW,GAAG,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;YAE5C,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC,CAAC;YAC9D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC,CAAC;YAC5C,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,aAAa,UAAU,EAAE,CAAC,CAAC,CAAC;YAClD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,WAAW,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,gBAAgB,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;YACrG,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;QAEnF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC,CAAC;YACjD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,EAAE,KAAK,CAAC,CAAC;YACpD,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAE,KAAe,CAAC,OAAO,CAAC,CAAC,CAAC;YACrD,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function compositeCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=composite.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite.d.ts","sourceRoot":"","sources":["../../src/commands/composite.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA2KxD"}
@@ -0,0 +1,167 @@
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 compositeCommand(imageCmd) {
8
+ imageCmd
9
+ .command('composite <input>')
10
+ .description('Overlay/composite one image on top of another')
11
+ .requiredOption('--overlay <path>', 'Overlay image to composite')
12
+ .option('-o, --output <path>', 'Output file path')
13
+ .option('--gravity <position>', 'Position: center, north, south, east, west, northeast, northwest, southeast, southwest', 'center')
14
+ .option('--blend <mode>', 'Blend mode: over, multiply, screen, overlay, darken, lighten, add, saturate, etc.', 'over')
15
+ .option('--left <pixels>', 'X position in pixels (overrides gravity)', parseInt)
16
+ .option('--top <pixels>', 'Y position in pixels (overrides gravity)', parseInt)
17
+ .option('--opacity <value>', 'Opacity 0-1 (default: 1)', parseFloat, 1)
18
+ .option('--tile', 'Tile the overlay across the image')
19
+ .option('--dry-run', 'Show what would be done without executing')
20
+ .option('-v, --verbose', 'Verbose output')
21
+ .option('--help', 'Display help for composite command')
22
+ .action(async (input, options) => {
23
+ if (options.help) {
24
+ createStandardHelp({
25
+ commandName: 'composite',
26
+ emoji: '🎨',
27
+ description: 'Layer images on top of each other with precise positioning and blending modes. Perfect for watermarks, overlays, and creative compositions.',
28
+ usage: ['composite <input> --overlay <overlay>', 'composite <input> --overlay <overlay> --gravity center', 'composite <input> --overlay logo.png --blend multiply'],
29
+ options: [
30
+ { flag: '--overlay <path>', description: 'Overlay image file (required)' },
31
+ { flag: '-o, --output <path>', description: 'Output file path' },
32
+ { flag: '--gravity <position>', description: 'Position: center, north, south, east, west, etc. (default: center)' },
33
+ { flag: '--blend <mode>', description: 'Blend mode: over, multiply, screen, overlay, darken, lighten (default: over)' },
34
+ { flag: '--left <pixels>', description: 'X position in pixels (overrides gravity)' },
35
+ { flag: '--top <pixels>', description: 'Y position in pixels (overrides gravity)' },
36
+ { flag: '--opacity <value>', description: 'Opacity 0-1 (default: 1)' },
37
+ { flag: '--tile', description: 'Tile the overlay across the entire image' },
38
+ { flag: '--dry-run', description: 'Preview changes without executing' },
39
+ { flag: '-v, --verbose', description: 'Show detailed output' }
40
+ ],
41
+ examples: [
42
+ { command: 'composite photo.jpg --overlay watermark.png --gravity southeast', description: 'Add watermark to bottom-right' },
43
+ { command: 'composite image.jpg --overlay logo.png --opacity 0.5', description: 'Semi-transparent overlay' },
44
+ { command: 'composite bg.jpg --overlay texture.png --blend multiply', description: 'Multiply blend for texture effect' },
45
+ { command: 'composite photo.jpg --overlay pattern.png --tile', description: 'Tile pattern across image' },
46
+ { command: 'composite image.jpg --overlay badge.png --left 50 --top 50', description: 'Position at exact coordinates' }
47
+ ],
48
+ additionalSections: [
49
+ {
50
+ title: 'Blend Modes',
51
+ items: [
52
+ 'over - Default, overlay on top',
53
+ 'multiply - Darkens, good for shadows/textures',
54
+ 'screen - Lightens, good for glow effects',
55
+ 'overlay - Combination of multiply and screen',
56
+ 'darken - Keep darker of two colors',
57
+ 'lighten - Keep lighter of two colors',
58
+ 'add - Add pixel values together',
59
+ 'saturate - Increase color intensity'
60
+ ]
61
+ },
62
+ {
63
+ title: 'Gravity Positions',
64
+ items: [
65
+ 'center - Center of image',
66
+ 'north - Top center',
67
+ 'south - Bottom center',
68
+ 'east - Right center',
69
+ 'west - Left center',
70
+ 'northeast - Top right',
71
+ 'northwest - Top left',
72
+ 'southeast - Bottom right',
73
+ 'southwest - Bottom left'
74
+ ]
75
+ }
76
+ ],
77
+ tips: [
78
+ 'Use --opacity for subtle watermarks',
79
+ 'Multiply blend mode great for textures',
80
+ 'Use --tile for repeating patterns',
81
+ 'PNG overlays preserve transparency'
82
+ ]
83
+ });
84
+ process.exit(0);
85
+ }
86
+ const spinner = ora('Processing composite...').start();
87
+ try {
88
+ if (!fs.existsSync(input)) {
89
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
90
+ process.exit(1);
91
+ }
92
+ if (!fs.existsSync(options.overlay)) {
93
+ spinner.fail(chalk.red(`Overlay file not found: ${options.overlay}`));
94
+ process.exit(1);
95
+ }
96
+ const inputPath = path.parse(input);
97
+ const outputPath = options.output || path.join(inputPath.dir, `${inputPath.name}-composite${inputPath.ext}`);
98
+ if (options.verbose) {
99
+ spinner.info(chalk.blue('Configuration:'));
100
+ console.log(chalk.dim(` Base: ${input}`));
101
+ console.log(chalk.dim(` Overlay: ${options.overlay}`));
102
+ console.log(chalk.dim(` Output: ${outputPath}`));
103
+ console.log(chalk.dim(` Gravity: ${options.gravity}`));
104
+ console.log(chalk.dim(` Blend: ${options.blend}`));
105
+ if (options.opacity !== 1)
106
+ console.log(chalk.dim(` Opacity: ${options.opacity}`));
107
+ spinner.start('Processing...');
108
+ }
109
+ if (options.dryRun) {
110
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
111
+ console.log(chalk.green('✓ Would composite images:'));
112
+ console.log(chalk.dim(` Base: ${input}`));
113
+ console.log(chalk.dim(` Overlay: ${options.overlay}`));
114
+ console.log(chalk.dim(` Position: ${options.left !== undefined && options.top !== undefined ? `${options.left}x${options.top}` : options.gravity}`));
115
+ return;
116
+ }
117
+ const baseImage = createSharpInstance(input);
118
+ const metadata = await baseImage.metadata();
119
+ // Prepare overlay buffer
120
+ let overlayBuffer = await createSharpInstance(options.overlay).toBuffer();
121
+ // Apply opacity if needed
122
+ if (options.opacity !== undefined && options.opacity < 1) {
123
+ overlayBuffer = await createSharpInstance(overlayBuffer)
124
+ .ensureAlpha()
125
+ .modulate({ brightness: 1, saturation: 1 })
126
+ .linear(options.opacity, 0)
127
+ .toBuffer();
128
+ }
129
+ // Build composite options
130
+ const compositeOptions = {
131
+ input: overlayBuffer,
132
+ blend: options.blend || 'over',
133
+ };
134
+ // Position overlay
135
+ if (options.left !== undefined && options.top !== undefined) {
136
+ compositeOptions.left = options.left;
137
+ compositeOptions.top = options.top;
138
+ }
139
+ else if (options.gravity) {
140
+ compositeOptions.gravity = options.gravity;
141
+ }
142
+ if (options.tile) {
143
+ compositeOptions.tile = true;
144
+ }
145
+ await baseImage.composite([compositeOptions]).toFile(outputPath);
146
+ const outputStats = fs.statSync(outputPath);
147
+ spinner.succeed(chalk.green('✓ Image composited successfully!'));
148
+ console.log(chalk.dim(` Base: ${input}`));
149
+ console.log(chalk.dim(` Overlay: ${options.overlay}`));
150
+ console.log(chalk.dim(` Output: ${outputPath}`));
151
+ console.log(chalk.dim(` Size: ${metadata.width}x${metadata.height}`));
152
+ console.log(chalk.dim(` Position: ${options.left !== undefined && options.top !== undefined ? `${options.left},${options.top}` : options.gravity}`));
153
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
154
+ }
155
+ catch (error) {
156
+ spinner.fail(chalk.red('Failed to composite images'));
157
+ if (options.verbose) {
158
+ console.error(chalk.red('Error details:'), error);
159
+ }
160
+ else {
161
+ console.error(chalk.red(error.message));
162
+ }
163
+ process.exit(1);
164
+ }
165
+ });
166
+ }
167
+ //# sourceMappingURL=composite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"composite.js","sourceRoot":"","sources":["../../src/commands/composite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function convertCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=convert.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"convert.d.ts","sourceRoot":"","sources":["../../src/commands/convert.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAqItD"}