@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,175 @@
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 dominantColorCommand(imageCmd) {
7
+ imageCmd
8
+ .command('dominant-color <input>')
9
+ .description('Extract dominant colors from an image')
10
+ .option('-c, --count <number>', 'Number of dominant colors to extract (default: 5)', parseInt, 5)
11
+ .option('--export <path>', 'Export color palette to JSON file')
12
+ .option('-v, --verbose', 'Show detailed color information')
13
+ .option('--help', 'Display help for dominant-color command')
14
+ .action(async (input, options) => {
15
+ if (options.help) {
16
+ createStandardHelp({
17
+ commandName: 'dominant-color',
18
+ emoji: '🎨',
19
+ description: 'Quickly extract the most dominant colors from an image. Perfect for color palette generation, theme creation, and color analysis.',
20
+ usage: ['dominant-color <input>', 'dominant-color <input> --count 3', 'dominant-color photo.jpg --export colors.json'],
21
+ options: [
22
+ { flag: '-c, --count <number>', description: 'Number of dominant colors to extract (default: 5, max: 10)' },
23
+ { flag: '--export <path>', description: 'Export color palette to JSON file' },
24
+ { flag: '-v, --verbose', description: 'Show detailed RGB/HSL values' }
25
+ ],
26
+ examples: [
27
+ { command: 'dominant-color photo.jpg', description: 'Extract top 5 dominant colors' },
28
+ { command: 'dominant-color photo.jpg --count 3', description: 'Extract top 3 colors' },
29
+ { command: 'dominant-color photo.jpg --export palette.json', description: 'Export colors to JSON' },
30
+ { command: 'dominant-color logo.png -c 2 -v', description: 'Get 2 colors with details' }
31
+ ],
32
+ additionalSections: [
33
+ {
34
+ title: 'Use Cases',
35
+ items: [
36
+ 'Generate color palettes for design',
37
+ 'Brand color extraction from logos',
38
+ 'Theme generation for websites',
39
+ 'Color scheme for UI/UX design',
40
+ 'Quick color analysis',
41
+ 'Match colors across images'
42
+ ]
43
+ },
44
+ {
45
+ title: 'Output Format',
46
+ items: [
47
+ 'Hex color code (#RRGGBB)',
48
+ 'RGB values (r, g, b)',
49
+ 'Percentage of image coverage',
50
+ 'Optional HSL values with --verbose'
51
+ ]
52
+ }
53
+ ],
54
+ tips: [
55
+ 'Use --count to control number of colors',
56
+ 'Export to JSON for use in design tools',
57
+ 'Smaller images process faster',
58
+ 'Works best with high-contrast images'
59
+ ]
60
+ });
61
+ process.exit(0);
62
+ }
63
+ const spinner = ora('Analyzing colors...').start();
64
+ try {
65
+ if (!fs.existsSync(input)) {
66
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
67
+ process.exit(1);
68
+ }
69
+ const count = Math.min(Math.max(options.count || 5, 1), 10);
70
+ // Get image stats which includes dominant color
71
+ const sharpInstance = createSharpInstance(input);
72
+ const metadata = await sharpInstance.metadata();
73
+ // Resize for faster processing
74
+ const smallImage = await sharpInstance
75
+ .resize(100, 100, { fit: 'inside' })
76
+ .raw()
77
+ .toBuffer({ resolveWithObject: true });
78
+ const { data, info } = smallImage;
79
+ const pixels = info.width * info.height;
80
+ const channels = info.channels;
81
+ // Color histogram approach
82
+ const colorMap = new Map();
83
+ for (let i = 0; i < data.length; i += channels) {
84
+ const r = data[i];
85
+ const g = data[i + 1];
86
+ const b = data[i + 2];
87
+ // Bucket colors to reduce variations
88
+ const bucketSize = 16;
89
+ const bucketR = Math.floor(r / bucketSize) * bucketSize;
90
+ const bucketG = Math.floor(g / bucketSize) * bucketSize;
91
+ const bucketB = Math.floor(b / bucketSize) * bucketSize;
92
+ const key = `${bucketR},${bucketG},${bucketB}`;
93
+ colorMap.set(key, (colorMap.get(key) || 0) + 1);
94
+ }
95
+ // Sort by frequency
96
+ const sortedColors = Array.from(colorMap.entries())
97
+ .sort((a, b) => b[1] - a[1])
98
+ .slice(0, count);
99
+ const dominantColors = sortedColors.map(([rgb, count]) => {
100
+ const [r, g, b] = rgb.split(',').map(Number);
101
+ const hex = `#${r.toString(16).padStart(2, '0')}${g.toString(16).padStart(2, '0')}${b.toString(16).padStart(2, '0')}`;
102
+ const percentage = ((count / pixels) * 100).toFixed(2);
103
+ // Calculate HSL
104
+ const rNorm = r / 255;
105
+ const gNorm = g / 255;
106
+ const bNorm = b / 255;
107
+ const max = Math.max(rNorm, gNorm, bNorm);
108
+ const min = Math.min(rNorm, gNorm, bNorm);
109
+ const l = (max + min) / 2;
110
+ let s = 0;
111
+ let h = 0;
112
+ if (max !== min) {
113
+ const d = max - min;
114
+ s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
115
+ if (max === rNorm) {
116
+ h = ((gNorm - bNorm) / d + (gNorm < bNorm ? 6 : 0)) / 6;
117
+ }
118
+ else if (max === gNorm) {
119
+ h = ((bNorm - rNorm) / d + 2) / 6;
120
+ }
121
+ else {
122
+ h = ((rNorm - gNorm) / d + 4) / 6;
123
+ }
124
+ }
125
+ return {
126
+ hex,
127
+ rgb: { r, g, b },
128
+ hsl: {
129
+ h: Math.round(h * 360),
130
+ s: Math.round(s * 100),
131
+ l: Math.round(l * 100)
132
+ },
133
+ percentage: parseFloat(percentage)
134
+ };
135
+ });
136
+ spinner.succeed(chalk.green('✓ Color analysis complete!\n'));
137
+ console.log(chalk.bold.cyan(`🎨 Top ${dominantColors.length} Dominant Colors:\n`));
138
+ dominantColors.forEach((color, index) => {
139
+ const colorPreview = chalk.bgHex(color.hex)(' ');
140
+ console.log(colorPreview + ' ' + chalk.bold(color.hex) + chalk.dim(` (${color.percentage}%)`));
141
+ if (options.verbose) {
142
+ console.log(chalk.dim(` RGB: (${color.rgb.r}, ${color.rgb.g}, ${color.rgb.b})`));
143
+ console.log(chalk.dim(` HSL: (${color.hsl.h}°, ${color.hsl.s}%, ${color.hsl.l}%)`));
144
+ }
145
+ if (index < dominantColors.length - 1) {
146
+ console.log('');
147
+ }
148
+ });
149
+ // Export to JSON
150
+ if (options.export) {
151
+ const exportData = {
152
+ source: input,
153
+ imageSize: {
154
+ width: metadata.width,
155
+ height: metadata.height
156
+ },
157
+ colors: dominantColors
158
+ };
159
+ fs.writeFileSync(options.export, JSON.stringify(exportData, null, 2));
160
+ console.log(chalk.dim(`\n✓ Palette exported to: ${options.export}`));
161
+ }
162
+ }
163
+ catch (error) {
164
+ spinner.fail(chalk.red('Failed to analyze colors'));
165
+ if (options.verbose) {
166
+ console.error(chalk.red('Error details:'), error);
167
+ }
168
+ else {
169
+ console.error(chalk.red(error.message));
170
+ }
171
+ process.exit(1);
172
+ }
173
+ });
174
+ }
175
+ //# sourceMappingURL=dominant-color.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dominant-color.js","sourceRoot":"","sources":["../../src/commands/dominant-color.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,GAAG,MAAM,KAAK,CAAC;AACtB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAU/D,MAAM,UAAU,oBAAoB,CAAC,QAAiB;IACpD,QAAQ;SACL,OAAO,CAAC,wBAAwB,CAAC;SACjC,WAAW,CAAC,uCAAuC,CAAC;SACpD,MAAM,CAAC,sBAAsB,EAAE,mDAAmD,EAAE,QAAQ,EAAE,CAAC,CAAC;SAChG,MAAM,CAAC,iBAAiB,EAAE,mCAAmC,CAAC;SAC9D,MAAM,CAAC,eAAe,EAAE,iCAAiC,CAAC;SAC1D,MAAM,CAAC,QAAQ,EAAE,yCAAyC,CAAC;SAC3D,MAAM,CAAC,KAAK,EAAE,KAAa,EAAE,OAA6B,EAAE,EAAE;QAC7D,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;YACjB,kBAAkB,CAAC;gBACjB,WAAW,EAAE,gBAAgB;gBAC7B,KAAK,EAAE,IAAI;gBACX,WAAW,EAAE,mIAAmI;gBAChJ,KAAK,EAAE,CAAC,wBAAwB,EAAE,kCAAkC,EAAE,+CAA+C,CAAC;gBACtH,OAAO,EAAE;oBACP,EAAE,IAAI,EAAE,sBAAsB,EAAE,WAAW,EAAE,4DAA4D,EAAE;oBAC3G,EAAE,IAAI,EAAE,iBAAiB,EAAE,WAAW,EAAE,mCAAmC,EAAE;oBAC7E,EAAE,IAAI,EAAE,eAAe,EAAE,WAAW,EAAE,8BAA8B,EAAE;iBACvE;gBACD,QAAQ,EAAE;oBACR,EAAE,OAAO,EAAE,0BAA0B,EAAE,WAAW,EAAE,+BAA+B,EAAE;oBACrF,EAAE,OAAO,EAAE,oCAAoC,EAAE,WAAW,EAAE,sBAAsB,EAAE;oBACtF,EAAE,OAAO,EAAE,gDAAgD,EAAE,WAAW,EAAE,uBAAuB,EAAE;oBACnG,EAAE,OAAO,EAAE,iCAAiC,EAAE,WAAW,EAAE,2BAA2B,EAAE;iBACzF;gBACD,kBAAkB,EAAE;oBAClB;wBACE,KAAK,EAAE,WAAW;wBAClB,KAAK,EAAE;4BACL,oCAAoC;4BACpC,mCAAmC;4BACnC,+BAA+B;4BAC/B,+BAA+B;4BAC/B,sBAAsB;4BACtB,4BAA4B;yBAC7B;qBACF;oBACD;wBACE,KAAK,EAAE,eAAe;wBACtB,KAAK,EAAE;4BACL,0BAA0B;4BAC1B,sBAAsB;4BACtB,8BAA8B;4BAC9B,oCAAoC;yBACrC;qBACF;iBACF;gBACD,IAAI,EAAE;oBACJ,yCAAyC;oBACzC,wCAAwC;oBACxC,+BAA+B;oBAC/B,sCAAsC;iBACvC;aACF,CAAC,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;QAED,MAAM,OAAO,GAAG,GAAG,CAAC,qBAAqB,CAAC,CAAC,KAAK,EAAE,CAAC;QAEnD,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,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAE5D,gDAAgD;YAChD,MAAM,aAAa,GAAG,mBAAmB,CAAC,KAAK,CAAC,CAAC;YACjD,MAAM,QAAQ,GAAG,MAAM,aAAa,CAAC,QAAQ,EAAE,CAAC;YAEhD,+BAA+B;YAC/B,MAAM,UAAU,GAAG,MAAM,aAAa;iBACnC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC;iBACnC,GAAG,EAAE;iBACL,QAAQ,CAAC,EAAE,iBAAiB,EAAE,IAAI,EAAE,CAAC,CAAC;YAEzC,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,UAAU,CAAC;YAClC,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC;YACxC,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAE/B,2BAA2B;YAC3B,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;YAE3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,QAAQ,EAAE,CAAC;gBAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;gBAEtB,qCAAqC;gBACrC,MAAM,UAAU,GAAG,EAAE,CAAC;gBACtB,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;gBACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;gBACxD,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,UAAU,CAAC,GAAG,UAAU,CAAC;gBAExD,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,OAAO,IAAI,OAAO,EAAE,CAAC;gBAC/C,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAClD,CAAC;YAED,oBAAoB;YACpB,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,CAAC;iBAChD,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;iBAC3B,KAAK,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;YAEnB,MAAM,cAAc,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;gBACvD,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC7C,MAAM,GAAG,GAAG,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;gBACtH,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,GAAG,MAAM,CAAC,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;gBAEvD,gBAAgB;gBAChB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC;gBACtB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC;gBACtB,MAAM,KAAK,GAAG,CAAC,GAAG,GAAG,CAAC;gBACtB,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC1C,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;gBAC1C,MAAM,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC1B,IAAI,CAAC,GAAG,CAAC,CAAC;gBACV,IAAI,CAAC,GAAG,CAAC,CAAC;gBAEV,IAAI,GAAG,KAAK,GAAG,EAAE,CAAC;oBAChB,MAAM,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC;oBACpB,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC;oBAEpD,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;wBAClB,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;oBAC1D,CAAC;yBAAM,IAAI,GAAG,KAAK,KAAK,EAAE,CAAC;wBACzB,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACpC,CAAC;yBAAM,CAAC;wBACN,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;gBAED,OAAO;oBACL,GAAG;oBACH,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE;oBAChB,GAAG,EAAE;wBACH,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;wBACtB,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,CAAC;qBACvB;oBACD,UAAU,EAAE,UAAU,CAAC,UAAU,CAAC;iBACnC,CAAC;YACJ,CAAC,CAAC,CAAC;YAEH,OAAO,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,8BAA8B,CAAC,CAAC,CAAC;YAE7D,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,cAAc,CAAC,MAAM,qBAAqB,CAAC,CAAC,CAAC;YAEnF,cAAc,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;gBACtC,MAAM,YAAY,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC;gBACpD,OAAO,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,KAAK,KAAK,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC;gBAE/F,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;oBACpB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;oBACnF,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;gBACxF,CAAC;gBAED,IAAI,KAAK,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACtC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAClB,CAAC;YACH,CAAC,CAAC,CAAC;YAEH,iBAAiB;YACjB,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;gBACnB,MAAM,UAAU,GAAG;oBACjB,MAAM,EAAE,KAAK;oBACb,SAAS,EAAE;wBACT,KAAK,EAAE,QAAQ,CAAC,KAAK;wBACrB,MAAM,EAAE,QAAQ,CAAC,MAAM;qBACxB;oBACD,MAAM,EAAE,cAAc;iBACvB,CAAC;gBAEF,EAAE,CAAC,aAAa,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBACtE,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,4BAA4B,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvE,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC,CAAC;YACpD,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 extendCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=extend.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend.d.ts","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAkBzC,wBAAgB,aAAa,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAkJrD"}
@@ -0,0 +1,146 @@
1
+ import chalk from 'chalk';
2
+ import ora from 'ora';
3
+ import path from 'path';
4
+ import fs from 'fs';
5
+ import { createSharpInstance } from '../utils/sharp.js';
6
+ import { createStandardHelp } from '../utils/helpFormatter.js';
7
+ export function extendCommand(imageCmd) {
8
+ imageCmd
9
+ .command('extend <input>')
10
+ .description('Add padding/border around image')
11
+ .option('--top <pixels>', 'Top padding in pixels', parseInt, 0)
12
+ .option('--bottom <pixels>', 'Bottom padding in pixels', parseInt, 0)
13
+ .option('--left <pixels>', 'Left padding in pixels', parseInt, 0)
14
+ .option('--right <pixels>', 'Right padding in pixels', parseInt, 0)
15
+ .option('--all <pixels>', 'All sides padding in pixels', parseInt)
16
+ .option('--background <color>', 'Background color (default: white)', 'white')
17
+ .option('-o, --output <path>', 'Output file path')
18
+ .option('-q, --quality <quality>', 'Quality (1-100)', parseInt, 90)
19
+ .option('--dry-run', 'Show what would be done without executing')
20
+ .option('-v, --verbose', 'Verbose output')
21
+ .option('--help', 'Display help for extend command')
22
+ .action(async (input, options) => {
23
+ if (options.help) {
24
+ createStandardHelp({
25
+ commandName: 'extend',
26
+ emoji: '🖼️',
27
+ description: 'Add padding or borders around images. Perfect for creating frames, adding space, or preparing images for specific aspect ratios.',
28
+ usage: ['extend <input> --all <pixels>', 'extend <input> --top 50 --bottom 50', 'extend <input> --all 20 --background black'],
29
+ options: [
30
+ { flag: '--all <pixels>', description: 'Padding on all sides (shortcut)' },
31
+ { flag: '--top <pixels>', description: 'Top padding in pixels' },
32
+ { flag: '--bottom <pixels>', description: 'Bottom padding in pixels' },
33
+ { flag: '--left <pixels>', description: 'Left padding in pixels' },
34
+ { flag: '--right <pixels>', description: 'Right padding in pixels' },
35
+ { flag: '--background <color>', description: 'Background color (default: white, accepts hex/rgb/names)' },
36
+ { flag: '-o, --output <path>', description: 'Output file path (default: <input>-extended.<ext>)' },
37
+ { flag: '-q, --quality <quality>', description: 'Output quality 1-100 (default: 90)' },
38
+ { flag: '--dry-run', description: 'Preview changes without executing' },
39
+ { flag: '-v, --verbose', description: 'Show detailed output' }
40
+ ],
41
+ examples: [
42
+ { command: 'extend photo.jpg --all 50', description: 'Add 50px padding on all sides' },
43
+ { command: 'extend image.png --all 20 --background black', description: 'Add black border' },
44
+ { command: 'extend pic.jpg --top 100 --bottom 100', description: 'Add padding top/bottom only' },
45
+ { command: 'extend photo.jpg --all 30 --background "#ff0000"', description: 'Add red border' }
46
+ ],
47
+ additionalSections: [
48
+ {
49
+ title: 'Use Cases',
50
+ items: [
51
+ 'Adding borders/frames to images',
52
+ 'Creating letterbox/pillarbox effect',
53
+ 'Preparing images for specific dimensions',
54
+ 'Adding space for text overlay',
55
+ 'Social media post formatting'
56
+ ]
57
+ },
58
+ {
59
+ title: 'Color Options',
60
+ items: [
61
+ 'white - Default white background',
62
+ 'black - Black border',
63
+ 'transparent - Transparent padding (PNG)',
64
+ '#ff0000 - Hex colors',
65
+ 'rgb(255,0,0) - RGB colors'
66
+ ]
67
+ }
68
+ ],
69
+ tips: [
70
+ 'Use --all for uniform padding',
71
+ 'Combine with watermark for branded images',
72
+ 'Use transparent background for PNGs',
73
+ 'Match background to image for seamless look'
74
+ ]
75
+ });
76
+ process.exit(0);
77
+ }
78
+ const spinner = ora('Processing image...').start();
79
+ try {
80
+ if (!fs.existsSync(input)) {
81
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
82
+ process.exit(1);
83
+ }
84
+ const inputPath = path.parse(input);
85
+ const outputPath = options.output || path.join(process.cwd(), `${inputPath.name}-extended${inputPath.ext}`);
86
+ // Handle --all shortcut
87
+ const top = options.all !== undefined ? options.all : (options.top || 0);
88
+ const bottom = options.all !== undefined ? options.all : (options.bottom || 0);
89
+ const left = options.all !== undefined ? options.all : (options.left || 0);
90
+ const right = options.all !== undefined ? options.all : (options.right || 0);
91
+ if (options.verbose) {
92
+ spinner.info(chalk.blue('Configuration:'));
93
+ console.log(chalk.dim(` Input: ${input}`));
94
+ console.log(chalk.dim(` Output: ${outputPath}`));
95
+ console.log(chalk.dim(` Padding: top=${top}, bottom=${bottom}, left=${left}, right=${right}`));
96
+ console.log(chalk.dim(` Background: ${options.background || 'white'}`));
97
+ spinner.start('Processing...');
98
+ }
99
+ if (options.dryRun) {
100
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
101
+ console.log(chalk.green('✓ Would extend image:'));
102
+ console.log(chalk.dim(` From: ${input}`));
103
+ console.log(chalk.dim(` To: ${outputPath}`));
104
+ console.log(chalk.dim(` Padding: ${top}/${right}/${bottom}/${left} (top/right/bottom/left)`));
105
+ return;
106
+ }
107
+ const originalMetadata = await createSharpInstance(input).metadata();
108
+ const pipeline = createSharpInstance(input).extend({
109
+ top,
110
+ bottom,
111
+ left,
112
+ right,
113
+ background: options.background || 'white'
114
+ });
115
+ const outputExt = path.extname(outputPath).toLowerCase();
116
+ if (outputExt === '.jpg' || outputExt === '.jpeg') {
117
+ pipeline.jpeg({ quality: options.quality || 90 });
118
+ }
119
+ else if (outputExt === '.png') {
120
+ pipeline.png({ quality: options.quality || 90 });
121
+ }
122
+ else if (outputExt === '.webp') {
123
+ pipeline.webp({ quality: options.quality || 90 });
124
+ }
125
+ await pipeline.toFile(outputPath);
126
+ const outputMetadata = await createSharpInstance(outputPath).metadata();
127
+ const outputStats = fs.statSync(outputPath);
128
+ spinner.succeed(chalk.green('✓ Image extended successfully!'));
129
+ console.log(chalk.dim(` Input: ${input} (${originalMetadata.width}x${originalMetadata.height})`));
130
+ console.log(chalk.dim(` Output: ${outputPath} (${outputMetadata.width}x${outputMetadata.height})`));
131
+ console.log(chalk.dim(` Padding: top=${top}, bottom=${bottom}, left=${left}, right=${right}`));
132
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
133
+ }
134
+ catch (error) {
135
+ spinner.fail(chalk.red('Failed to extend image'));
136
+ if (options.verbose) {
137
+ console.error(chalk.red('Error details:'), error);
138
+ }
139
+ else {
140
+ console.error(chalk.red(error.message));
141
+ }
142
+ process.exit(1);
143
+ }
144
+ });
145
+ }
146
+ //# sourceMappingURL=extend.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extend.js","sourceRoot":"","sources":["../../src/commands/extend.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function extractCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAazC,wBAAgB,cAAc,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAyKtD"}
@@ -0,0 +1,169 @@
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 extractCommand(imageCmd) {
8
+ imageCmd
9
+ .command('extract <input>')
10
+ .description('Extract color channels or specific regions from image')
11
+ .option('-c, --channel <channel>', 'Extract channel: red, green, blue, alpha')
12
+ .option('--left <pixels>', 'X position for region extraction', parseInt)
13
+ .option('--top <pixels>', 'Y position for region extraction', parseInt)
14
+ .option('-w, --width <pixels>', 'Width for region extraction', parseInt)
15
+ .option('-h, --height <pixels>', 'Height for region extraction', parseInt)
16
+ .option('-o, --output <path>', 'Output file path')
17
+ .option('--dry-run', 'Show what would be done without executing')
18
+ .option('-v, --verbose', 'Verbose output')
19
+ .option('--help', 'Display help for extract command')
20
+ .action(async (input, options) => {
21
+ if (options.help) {
22
+ createStandardHelp({
23
+ commandName: 'extract',
24
+ emoji: '✂️',
25
+ description: 'Extract specific color channels (R, G, B, alpha) or rectangular regions from images. Useful for analysis, masking, and advanced editing.',
26
+ usage: ['extract <input> --channel red', 'extract <input> --left 100 --top 100 --width 500 --height 500', 'extract <input> --channel alpha'],
27
+ options: [
28
+ { flag: '-c, --channel <channel>', description: 'Extract color channel: red, green, blue, alpha' },
29
+ { flag: '--left <pixels>', description: 'X position for region extraction' },
30
+ { flag: '--top <pixels>', description: 'Y position for region extraction' },
31
+ { flag: '-w, --width <pixels>', description: 'Width for region extraction' },
32
+ { flag: '-h, --height <pixels>', description: 'Height for region extraction' },
33
+ { flag: '-o, --output <path>', description: 'Output file path' },
34
+ { flag: '--dry-run', description: 'Preview changes without executing' },
35
+ { flag: '-v, --verbose', description: 'Show detailed output' }
36
+ ],
37
+ examples: [
38
+ { command: 'extract photo.jpg --channel red', description: 'Extract red channel only' },
39
+ { command: 'extract image.png --channel alpha', description: 'Extract alpha/transparency channel' },
40
+ { command: 'extract photo.jpg --left 100 --top 100 --width 500 --height 500', description: 'Extract 500x500 region' },
41
+ { command: 'extract image.jpg --channel blue -o blue-channel.png', description: 'Save blue channel separately' }
42
+ ],
43
+ additionalSections: [
44
+ {
45
+ title: 'Channel Extraction',
46
+ items: [
47
+ 'red - Extract red color channel',
48
+ 'green - Extract green color channel',
49
+ 'blue - Extract blue color channel',
50
+ 'alpha - Extract transparency/alpha channel'
51
+ ]
52
+ },
53
+ {
54
+ title: 'Use Cases',
55
+ items: [
56
+ 'Analyze color distribution in images',
57
+ 'Create custom masks from channels',
58
+ 'Extract transparency for processing',
59
+ 'Crop specific regions precisely',
60
+ 'Prepare channels for compositing'
61
+ ]
62
+ }
63
+ ],
64
+ tips: [
65
+ 'Channel extraction produces grayscale images',
66
+ 'Use alpha extraction for transparency masks',
67
+ 'Region extraction preserves original colors',
68
+ 'Combine with other commands for advanced workflows'
69
+ ]
70
+ });
71
+ process.exit(0);
72
+ }
73
+ const spinner = ora('Extracting...').start();
74
+ try {
75
+ if (!fs.existsSync(input)) {
76
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
77
+ process.exit(1);
78
+ }
79
+ const inputPath = path.parse(input);
80
+ const suffix = options.channel ? `-${options.channel}` : '-extracted';
81
+ const outputPath = options.output || path.join(inputPath.dir, `${inputPath.name}${suffix}${inputPath.ext}`);
82
+ if (options.verbose) {
83
+ spinner.info(chalk.blue('Configuration:'));
84
+ console.log(chalk.dim(` Input: ${input}`));
85
+ console.log(chalk.dim(` Output: ${outputPath}`));
86
+ if (options.channel) {
87
+ console.log(chalk.dim(` Channel: ${options.channel}`));
88
+ }
89
+ else {
90
+ console.log(chalk.dim(` Region: ${options.left},${options.top} ${options.width}x${options.height}`));
91
+ }
92
+ spinner.start('Processing...');
93
+ }
94
+ if (options.dryRun) {
95
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
96
+ console.log(chalk.green('✓ Would extract from image:'));
97
+ console.log(chalk.dim(` Input: ${input}`));
98
+ if (options.channel) {
99
+ console.log(chalk.dim(` Channel: ${options.channel}`));
100
+ }
101
+ else {
102
+ console.log(chalk.dim(` Region: ${options.left},${options.top} ${options.width}x${options.height}`));
103
+ }
104
+ return;
105
+ }
106
+ const metadata = await createSharpInstance(input).metadata();
107
+ let pipeline = createSharpInstance(input);
108
+ if (options.channel) {
109
+ // Extract color channel
110
+ const channelMap = {
111
+ red: 0,
112
+ green: 1,
113
+ blue: 2,
114
+ alpha: 3
115
+ };
116
+ const channelIndex = channelMap[options.channel];
117
+ if (channelIndex === undefined) {
118
+ spinner.fail(chalk.red('Invalid channel. Use: red, green, blue, or alpha'));
119
+ process.exit(1);
120
+ }
121
+ // Extract specific channel
122
+ if (channelIndex === 3) {
123
+ // Alpha channel
124
+ pipeline = pipeline.ensureAlpha().extractChannel(channelIndex);
125
+ }
126
+ else {
127
+ pipeline = pipeline.extractChannel(channelIndex);
128
+ }
129
+ }
130
+ else {
131
+ // Extract region
132
+ if (!options.left || !options.top || !options.width || !options.height) {
133
+ spinner.fail(chalk.red('Region extraction requires --left, --top, --width, and --height'));
134
+ process.exit(1);
135
+ }
136
+ pipeline = pipeline.extract({
137
+ left: options.left,
138
+ top: options.top,
139
+ width: options.width,
140
+ height: options.height
141
+ });
142
+ }
143
+ await pipeline.toFile(outputPath);
144
+ const outputStats = fs.statSync(outputPath);
145
+ const outputMetadata = await createSharpInstance(outputPath).metadata();
146
+ spinner.succeed(chalk.green('✓ Extraction completed successfully!'));
147
+ console.log(chalk.dim(` Input: ${input} (${metadata.width}x${metadata.height})`));
148
+ console.log(chalk.dim(` Output: ${outputPath} (${outputMetadata.width}x${outputMetadata.height})`));
149
+ if (options.channel) {
150
+ console.log(chalk.dim(` Channel: ${options.channel}`));
151
+ }
152
+ else {
153
+ console.log(chalk.dim(` Region: ${options.left},${options.top} → ${options.width}x${options.height}`));
154
+ }
155
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
156
+ }
157
+ catch (error) {
158
+ spinner.fail(chalk.red('Failed to extract'));
159
+ if (options.verbose) {
160
+ console.error(chalk.red('Error details:'), error);
161
+ }
162
+ else {
163
+ console.error(chalk.red(error.message));
164
+ }
165
+ process.exit(1);
166
+ }
167
+ });
168
+ }
169
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/commands/extract.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function flipCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=flip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"flip.d.ts","sourceRoot":"","sources":["../../src/commands/flip.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAgBzC,wBAAgB,WAAW,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA8GnD"}