@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,177 @@
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 splitCommand(imageCmd) {
8
+ imageCmd
9
+ .command('split <input>')
10
+ .description('Split image into tiles/grid pieces')
11
+ .option('-t, --tiles <grid>', 'Grid pattern like "2x2", "3x3", "4x2"')
12
+ .option('-r, --rows <number>', 'Number of rows', parseInt)
13
+ .option('-c, --columns <number>', 'Number of columns', parseInt)
14
+ .option('-o, --output <directory>', 'Output directory (default: ./tiles)')
15
+ .option('--dry-run', 'Show what would be done without executing')
16
+ .option('-v, --verbose', 'Verbose output')
17
+ .option('--help', 'Display help for split command')
18
+ .action(async (input, options) => {
19
+ if (options.help) {
20
+ createStandardHelp({
21
+ commandName: 'split',
22
+ emoji: '✂️',
23
+ description: 'Split large images into smaller tiles or grid pieces. Perfect for Instagram carousels, large prints, or processing huge images in chunks.',
24
+ usage: ['split <input> --tiles 3x3', 'split <input> -r 2 -c 3', 'split <input> -t "4x4" -o ./output'],
25
+ options: [
26
+ { flag: '-t, --tiles <grid>', description: 'Grid pattern: "2x2", "3x3", "4x2", etc.' },
27
+ { flag: '-r, --rows <number>', description: 'Number of rows (alternative to --tiles)' },
28
+ { flag: '-c, --columns <number>', description: 'Number of columns (alternative to --tiles)' },
29
+ { flag: '-o, --output <directory>', description: 'Output directory (default: ./tiles)' },
30
+ { flag: '--dry-run', description: 'Preview changes without executing' },
31
+ { flag: '-v, --verbose', description: 'Show detailed output' }
32
+ ],
33
+ examples: [
34
+ { command: 'split photo.jpg --tiles 3x3', description: 'Split into 9 tiles (3x3 grid)' },
35
+ { command: 'split large.png -t "4x4"', description: 'Split into 16 tiles' },
36
+ { command: 'split panorama.jpg -r 1 -c 5', description: 'Split horizontally into 5 pieces' },
37
+ { command: 'split image.jpg -r 3 -c 1 -o ./vertical', description: 'Split vertically into 3 pieces' },
38
+ { command: 'split poster.jpg --tiles 2x3 -o ./parts', description: 'Split into 6 tiles' }
39
+ ],
40
+ additionalSections: [
41
+ {
42
+ title: 'Output Format',
43
+ items: [
44
+ 'Files named: tile_row_col.ext (e.g., tile_0_0.jpg)',
45
+ 'Row and column numbers start at 0',
46
+ 'Original format preserved',
47
+ 'Tiles saved in specified output directory'
48
+ ]
49
+ },
50
+ {
51
+ title: 'Use Cases',
52
+ items: [
53
+ 'Instagram carousel posts (1x10 split)',
54
+ 'Large format printing (split for smaller printers)',
55
+ 'Processing huge images in chunks',
56
+ 'Creating puzzle effects',
57
+ 'Panorama splitting',
58
+ 'Social media multi-post sequences'
59
+ ]
60
+ },
61
+ {
62
+ title: 'Common Split Patterns',
63
+ items: [
64
+ '2x2 - Four equal quadrants',
65
+ '3x3 - Nine tiles, standard grid',
66
+ '1x3 - Three horizontal slices',
67
+ '3x1 - Three vertical slices',
68
+ '1x10 - Instagram carousel (10 images)',
69
+ '4x4 - Sixteen tiles for detailed work'
70
+ ]
71
+ }
72
+ ],
73
+ tips: [
74
+ 'Instagram carousel: use 1x10 for full scrollable panorama',
75
+ 'Tiles maintain original quality',
76
+ 'Use for large images that won\'t fit in memory',
77
+ 'Perfect for creating grid posts on social media'
78
+ ]
79
+ });
80
+ process.exit(0);
81
+ }
82
+ const spinner = ora('Analyzing image...').start();
83
+ try {
84
+ if (!fs.existsSync(input)) {
85
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
86
+ process.exit(1);
87
+ }
88
+ // Parse grid dimensions
89
+ let rows;
90
+ let columns;
91
+ if (options.tiles) {
92
+ const match = options.tiles.match(/^(\d+)x(\d+)$/);
93
+ if (!match) {
94
+ spinner.fail(chalk.red('Invalid tiles format. Use format like "3x3" or "2x4"'));
95
+ process.exit(1);
96
+ }
97
+ rows = parseInt(match[1]);
98
+ columns = parseInt(match[2]);
99
+ }
100
+ else if (options.rows && options.columns) {
101
+ rows = options.rows;
102
+ columns = options.columns;
103
+ }
104
+ else {
105
+ spinner.fail(chalk.red('Please specify either --tiles or both --rows and --columns'));
106
+ process.exit(1);
107
+ }
108
+ const metadata = await createSharpInstance(input).metadata();
109
+ if (!metadata.width || !metadata.height) {
110
+ spinner.fail(chalk.red('Unable to read image dimensions'));
111
+ process.exit(1);
112
+ }
113
+ const tileWidth = Math.floor(metadata.width / columns);
114
+ const tileHeight = Math.floor(metadata.height / rows);
115
+ const totalTiles = rows * columns;
116
+ const inputPath = path.parse(input);
117
+ const outputDir = options.output || './tiles';
118
+ if (options.verbose) {
119
+ spinner.info(chalk.blue('Configuration:'));
120
+ console.log(chalk.dim(` Input: ${input} (${metadata.width}x${metadata.height})`));
121
+ console.log(chalk.dim(` Grid: ${rows}x${columns} (${totalTiles} tiles)`));
122
+ console.log(chalk.dim(` Tile size: ${tileWidth}x${tileHeight}`));
123
+ console.log(chalk.dim(` Output: ${outputDir}/`));
124
+ spinner.start('Processing...');
125
+ }
126
+ if (options.dryRun) {
127
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
128
+ console.log(chalk.green('✓ Would split image:'));
129
+ console.log(chalk.dim(` Into: ${rows}x${columns} grid (${totalTiles} tiles)`));
130
+ console.log(chalk.dim(` Each tile: ${tileWidth}x${tileHeight}`));
131
+ console.log(chalk.dim(` Output: ${outputDir}/tile_*_*.${inputPath.ext}`));
132
+ return;
133
+ }
134
+ // Create output directory
135
+ if (!fs.existsSync(outputDir)) {
136
+ fs.mkdirSync(outputDir, { recursive: true });
137
+ }
138
+ spinner.text = 'Splitting image into tiles...';
139
+ // Split image into tiles
140
+ const imageBuffer = await createSharpInstance(input).toBuffer();
141
+ for (let row = 0; row < rows; row++) {
142
+ for (let col = 0; col < columns; col++) {
143
+ const left = col * tileWidth;
144
+ const top = row * tileHeight;
145
+ const outputPath = path.join(outputDir, `tile_${row}_${col}${inputPath.ext}`);
146
+ await createSharpInstance(imageBuffer)
147
+ .extract({
148
+ left,
149
+ top,
150
+ width: tileWidth,
151
+ height: tileHeight
152
+ })
153
+ .toFile(outputPath);
154
+ spinner.text = `Creating tiles... ${((row * columns + col + 1) / totalTiles * 100).toFixed(0)}%`;
155
+ }
156
+ }
157
+ spinner.succeed(chalk.green('✓ Image split successfully!'));
158
+ console.log(chalk.dim(` Input: ${input} (${metadata.width}x${metadata.height})`));
159
+ console.log(chalk.dim(` Grid: ${rows}x${columns}`));
160
+ console.log(chalk.dim(` Total tiles: ${totalTiles}`));
161
+ console.log(chalk.dim(` Tile size: ${tileWidth}x${tileHeight}`));
162
+ console.log(chalk.dim(` Output: ${outputDir}/`));
163
+ console.log(chalk.dim(` Files: tile_0_0${inputPath.ext} ... tile_${rows - 1}_${columns - 1}${inputPath.ext}`));
164
+ }
165
+ catch (error) {
166
+ spinner.fail(chalk.red('Failed to split image'));
167
+ if (options.verbose) {
168
+ console.error(chalk.red('Error details:'), error);
169
+ }
170
+ else {
171
+ console.error(chalk.red(error.message));
172
+ }
173
+ process.exit(1);
174
+ }
175
+ });
176
+ }
177
+ //# sourceMappingURL=split.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"split.js","sourceRoot":"","sources":["../../src/commands/split.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function stackCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=stack.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.d.ts","sourceRoot":"","sources":["../../src/commands/stack.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAmBzC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAuNpD"}
@@ -0,0 +1,205 @@
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 stackCommand(imageCmd) {
7
+ imageCmd
8
+ .command('stack <images...>')
9
+ .description('Stack multiple images horizontally or vertically')
10
+ .option('-d, --direction <direction>', 'Stack direction: horizontal, vertical (default: horizontal)', 'horizontal')
11
+ .option('-a, --align <alignment>', 'Alignment: start, center, end (default: center)', 'center')
12
+ .option('-g, --gap <pixels>', 'Gap between images in pixels (default: 0)', parseInt, 0)
13
+ .option('-b, --background <color>', 'Background color for gaps (default: transparent)', 'rgba(0,0,0,0)')
14
+ .option('-o, --output <path>', 'Output file path (default: stacked.png)')
15
+ .option('--dry-run', 'Show what would be done without executing')
16
+ .option('-v, --verbose', 'Verbose output')
17
+ .option('--help', 'Display help for stack command')
18
+ .action(async (images, options) => {
19
+ if (options.help) {
20
+ createStandardHelp({
21
+ commandName: 'stack',
22
+ emoji: '📚',
23
+ description: 'Stack multiple images horizontally or vertically with customizable alignment and spacing. Perfect for before/after comparisons, image sequences, and panoramas.',
24
+ usage: ['stack image1.jpg image2.jpg', 'stack *.jpg --direction vertical', 'stack img1.png img2.png -d horizontal -a center -g 10'],
25
+ options: [
26
+ { flag: '-d, --direction <direction>', description: 'Stack direction: horizontal or vertical (default: horizontal)' },
27
+ { flag: '-a, --align <alignment>', description: 'Alignment: start (top/left), center, end (bottom/right) (default: center)' },
28
+ { flag: '-g, --gap <pixels>', description: 'Gap between images in pixels (default: 0)' },
29
+ { flag: '-b, --background <color>', description: 'Background color for gaps (default: transparent)' },
30
+ { flag: '-o, --output <path>', description: 'Output file path (default: stacked.png)' },
31
+ { flag: '--dry-run', description: 'Preview changes without executing' },
32
+ { flag: '-v, --verbose', description: 'Show detailed output' }
33
+ ],
34
+ examples: [
35
+ { command: 'stack before.jpg after.jpg', description: 'Horizontal before/after comparison' },
36
+ { command: 'stack img1.jpg img2.jpg img3.jpg --direction vertical', description: 'Stack 3 images vertically' },
37
+ { command: 'stack *.png -d horizontal -g 20 -b white', description: 'Horizontal with white gaps' },
38
+ { command: 'stack photo1.jpg photo2.jpg -a end -o result.png', description: 'Right-aligned horizontal stack' },
39
+ { command: 'stack panorama*.jpg -d horizontal -o panorama.jpg', description: 'Create panorama' }
40
+ ],
41
+ additionalSections: [
42
+ {
43
+ title: 'Direction & Alignment',
44
+ items: [
45
+ 'horizontal + start - Images aligned to top',
46
+ 'horizontal + center - Images centered vertically',
47
+ 'horizontal + end - Images aligned to bottom',
48
+ 'vertical + start - Images aligned to left',
49
+ 'vertical + center - Images centered horizontally',
50
+ 'vertical + end - Images aligned to right'
51
+ ]
52
+ },
53
+ {
54
+ title: 'Use Cases',
55
+ items: [
56
+ 'Before/after comparisons',
57
+ 'Image sequences and timelines',
58
+ 'Panorama stitching',
59
+ 'Portfolio layouts',
60
+ 'Tutorial step-by-step images',
61
+ 'Product variations display',
62
+ 'Comparison charts'
63
+ ]
64
+ }
65
+ ],
66
+ tips: [
67
+ 'Use gaps for visual separation',
68
+ 'Transparent background works best with PNGs',
69
+ 'Horizontal for wide comparisons, vertical for tall',
70
+ 'Center alignment usually looks best'
71
+ ]
72
+ });
73
+ process.exit(0);
74
+ }
75
+ const spinner = ora('Preparing images...').start();
76
+ try {
77
+ if (images.length < 2) {
78
+ spinner.fail(chalk.red('Need at least 2 images to stack'));
79
+ process.exit(1);
80
+ }
81
+ // Check all files exist
82
+ for (const img of images) {
83
+ if (!fs.existsSync(img)) {
84
+ spinner.fail(chalk.red(`Image not found: ${img}`));
85
+ process.exit(1);
86
+ }
87
+ }
88
+ const direction = options.direction === 'vertical' ? 'vertical' : 'horizontal';
89
+ const align = options.align || 'center';
90
+ const gap = options.gap || 0;
91
+ const background = options.background || 'rgba(0,0,0,0)';
92
+ const outputPath = options.output || 'stacked.png';
93
+ // Load all images and get dimensions
94
+ const imageDimensions = await Promise.all(images.map(async (img) => {
95
+ const meta = await createSharpInstance(img).metadata();
96
+ return {
97
+ path: img,
98
+ width: meta.width,
99
+ height: meta.height
100
+ };
101
+ }));
102
+ // Calculate canvas size
103
+ let canvasWidth;
104
+ let canvasHeight;
105
+ if (direction === 'horizontal') {
106
+ canvasWidth = imageDimensions.reduce((sum, img) => sum + img.width, 0) + gap * (images.length - 1);
107
+ canvasHeight = Math.max(...imageDimensions.map(img => img.height));
108
+ }
109
+ else {
110
+ canvasWidth = Math.max(...imageDimensions.map(img => img.width));
111
+ canvasHeight = imageDimensions.reduce((sum, img) => sum + img.height, 0) + gap * (images.length - 1);
112
+ }
113
+ if (options.verbose) {
114
+ spinner.info(chalk.blue('Configuration:'));
115
+ console.log(chalk.dim(` Images: ${images.length}`));
116
+ console.log(chalk.dim(` Direction: ${direction}`));
117
+ console.log(chalk.dim(` Alignment: ${align}`));
118
+ console.log(chalk.dim(` Gap: ${gap}px`));
119
+ console.log(chalk.dim(` Canvas: ${canvasWidth}x${canvasHeight}`));
120
+ console.log(chalk.dim(` Output: ${outputPath}`));
121
+ spinner.start('Processing...');
122
+ }
123
+ if (options.dryRun) {
124
+ spinner.info(chalk.yellow('Dry run mode - no changes will be made'));
125
+ console.log(chalk.green('✓ Would stack images:'));
126
+ console.log(chalk.dim(` Images: ${images.length}`));
127
+ console.log(chalk.dim(` Direction: ${direction}`));
128
+ console.log(chalk.dim(` Output size: ${canvasWidth}x${canvasHeight}`));
129
+ return;
130
+ }
131
+ // Create canvas
132
+ const canvas = await createSharpInstance({
133
+ create: {
134
+ width: canvasWidth,
135
+ height: canvasHeight,
136
+ channels: 4,
137
+ background: background
138
+ }
139
+ }).png().toBuffer();
140
+ // Position images
141
+ const composites = [];
142
+ let currentPos = 0;
143
+ for (let i = 0; i < images.length; i++) {
144
+ const img = imageDimensions[i];
145
+ let left, top;
146
+ if (direction === 'horizontal') {
147
+ left = currentPos;
148
+ // Vertical alignment
149
+ if (align === 'start') {
150
+ top = 0;
151
+ }
152
+ else if (align === 'end') {
153
+ top = canvasHeight - img.height;
154
+ }
155
+ else {
156
+ top = Math.floor((canvasHeight - img.height) / 2);
157
+ }
158
+ currentPos += img.width + gap;
159
+ }
160
+ else {
161
+ top = currentPos;
162
+ // Horizontal alignment
163
+ if (align === 'start') {
164
+ left = 0;
165
+ }
166
+ else if (align === 'end') {
167
+ left = canvasWidth - img.width;
168
+ }
169
+ else {
170
+ left = Math.floor((canvasWidth - img.width) / 2);
171
+ }
172
+ currentPos += img.height + gap;
173
+ }
174
+ const imageBuffer = await createSharpInstance(img.path).toBuffer();
175
+ composites.push({
176
+ input: imageBuffer,
177
+ left,
178
+ top
179
+ });
180
+ }
181
+ // Composite all images
182
+ await createSharpInstance(canvas)
183
+ .composite(composites)
184
+ .toFile(outputPath);
185
+ const outputStats = fs.statSync(outputPath);
186
+ spinner.succeed(chalk.green('✓ Images stacked successfully!'));
187
+ console.log(chalk.dim(` Images: ${images.length}`));
188
+ console.log(chalk.dim(` Direction: ${direction}`));
189
+ console.log(chalk.dim(` Alignment: ${align}`));
190
+ console.log(chalk.dim(` Output: ${outputPath} (${canvasWidth}x${canvasHeight})`));
191
+ console.log(chalk.dim(` File size: ${(outputStats.size / 1024).toFixed(2)}KB`));
192
+ }
193
+ catch (error) {
194
+ spinner.fail(chalk.red('Failed to stack images'));
195
+ if (options.verbose) {
196
+ console.error(chalk.red('Error details:'), error);
197
+ }
198
+ else {
199
+ console.error(chalk.red(error.message));
200
+ }
201
+ process.exit(1);
202
+ }
203
+ });
204
+ }
205
+ //# sourceMappingURL=stack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stack.js","sourceRoot":"","sources":["../../src/commands/stack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function statsCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=stats.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.d.ts","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAYzC,wBAAgB,YAAY,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CA4MpD"}
@@ -0,0 +1,187 @@
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 statsCommand(imageCmd) {
7
+ imageCmd
8
+ .command('stats <input>')
9
+ .description('Display detailed image information and statistics')
10
+ .option('-d, --detailed', 'Show detailed EXIF and metadata')
11
+ .option('--histogram', 'Calculate and display color histogram')
12
+ .option('-v, --verbose', 'Verbose output')
13
+ .option('--help', 'Display help for stats command')
14
+ .action(async (input, options) => {
15
+ if (options.help) {
16
+ createStandardHelp({
17
+ commandName: 'stats',
18
+ emoji: '📊',
19
+ description: 'Analyze and display comprehensive image information including dimensions, format, color space, EXIF data, and color statistics.',
20
+ usage: ['stats <input>', 'stats <input> --detailed', 'stats <input> --histogram'],
21
+ options: [
22
+ { flag: '-d, --detailed', description: 'Show detailed EXIF and metadata information' },
23
+ { flag: '--histogram', description: 'Calculate and display color channel statistics' },
24
+ { flag: '-v, --verbose', description: 'Show extra verbose output' }
25
+ ],
26
+ examples: [
27
+ { command: 'stats photo.jpg', description: 'Show basic image information' },
28
+ { command: 'stats image.png --detailed', description: 'Show comprehensive metadata' },
29
+ { command: 'stats photo.jpg --histogram', description: 'Show color distribution stats' },
30
+ { command: 'stats image.raw --detailed --histogram', description: 'Complete image analysis' }
31
+ ],
32
+ additionalSections: [
33
+ {
34
+ title: 'Information Displayed',
35
+ items: [
36
+ 'Dimensions (width x height)',
37
+ 'File format and size',
38
+ 'Color space (sRGB, CMYK, etc.)',
39
+ 'Channels and depth',
40
+ 'Density/DPI',
41
+ 'EXIF data (camera, settings, GPS)',
42
+ 'Color profiles (ICC)',
43
+ 'Orientation'
44
+ ]
45
+ },
46
+ {
47
+ title: 'Use Cases',
48
+ items: [
49
+ 'Verify image specifications',
50
+ 'Check file integrity',
51
+ 'Extract camera metadata',
52
+ 'Analyze color distribution',
53
+ 'Quality assessment',
54
+ 'Prepare for processing'
55
+ ]
56
+ }
57
+ ],
58
+ tips: [
59
+ 'Use --detailed for EXIF data from cameras',
60
+ '--histogram helps analyze color balance',
61
+ 'Check color space for print vs web',
62
+ 'Useful for debugging image issues'
63
+ ]
64
+ });
65
+ process.exit(0);
66
+ }
67
+ const spinner = ora('Analyzing image...').start();
68
+ try {
69
+ if (!fs.existsSync(input)) {
70
+ spinner.fail(chalk.red(`Input file not found: ${input}`));
71
+ process.exit(1);
72
+ }
73
+ const fileStats = fs.statSync(input);
74
+ const metadata = await createSharpInstance(input).metadata();
75
+ spinner.succeed(chalk.green('✓ Image analysis complete!\n'));
76
+ // Basic information
77
+ console.log(chalk.bold.cyan('📁 File Information:'));
78
+ console.log(chalk.dim(` Path: ${input}`));
79
+ console.log(chalk.dim(` Size: ${(fileStats.size / 1024).toFixed(2)} KB (${fileStats.size} bytes)`));
80
+ console.log(chalk.dim(` Modified: ${fileStats.mtime.toLocaleString()}`));
81
+ console.log('');
82
+ // Image properties
83
+ console.log(chalk.bold.cyan('🖼️ Image Properties:'));
84
+ console.log(chalk.dim(` Format: ${metadata.format?.toUpperCase() || 'Unknown'}`));
85
+ console.log(chalk.dim(` Dimensions: ${metadata.width} × ${metadata.height} pixels`));
86
+ console.log(chalk.dim(` Aspect Ratio: ${metadata.width && metadata.height ? (metadata.width / metadata.height).toFixed(2) : 'N/A'}`));
87
+ console.log(chalk.dim(` Channels: ${metadata.channels || 'Unknown'}`));
88
+ console.log(chalk.dim(` Color Space: ${metadata.space || 'Unknown'}`));
89
+ console.log(chalk.dim(` Bit Depth: ${metadata.depth || 'Unknown'}`));
90
+ if (metadata.density) {
91
+ console.log(chalk.dim(` Density: ${metadata.density} DPI`));
92
+ }
93
+ if (metadata.hasAlpha) {
94
+ console.log(chalk.dim(` Alpha Channel: Yes`));
95
+ }
96
+ console.log('');
97
+ // Detailed metadata
98
+ if (options.detailed) {
99
+ console.log(chalk.bold.cyan('📋 Detailed Metadata:'));
100
+ if (metadata.orientation) {
101
+ console.log(chalk.dim(` Orientation: ${metadata.orientation}`));
102
+ }
103
+ if (metadata.chromaSubsampling) {
104
+ console.log(chalk.dim(` Chroma Subsampling: ${metadata.chromaSubsampling}`));
105
+ }
106
+ if (metadata.isProgressive !== undefined) {
107
+ console.log(chalk.dim(` Progressive: ${metadata.isProgressive ? 'Yes' : 'No'}`));
108
+ }
109
+ if (metadata.pages) {
110
+ console.log(chalk.dim(` Pages: ${metadata.pages}`));
111
+ }
112
+ if (metadata.pageHeight) {
113
+ console.log(chalk.dim(` Page Height: ${metadata.pageHeight}`));
114
+ }
115
+ if (metadata.loop !== undefined) {
116
+ console.log(chalk.dim(` Loop: ${metadata.loop}`));
117
+ }
118
+ if (metadata.delay) {
119
+ console.log(chalk.dim(` Delay: ${metadata.delay}ms`));
120
+ }
121
+ // Palette bit depth info (if available in future Sharp versions)
122
+ // EXIF data
123
+ if (metadata.exif) {
124
+ console.log(chalk.dim('\n EXIF Data:'));
125
+ const exifBuffer = metadata.exif;
126
+ console.log(chalk.dim(` Size: ${exifBuffer.length} bytes`));
127
+ }
128
+ // ICC profile
129
+ if (metadata.icc) {
130
+ console.log(chalk.dim('\n ICC Profile:'));
131
+ console.log(chalk.dim(` Size: ${metadata.icc.length} bytes`));
132
+ }
133
+ // XMP data
134
+ if (metadata.xmp) {
135
+ console.log(chalk.dim('\n XMP Data:'));
136
+ const xmpBuffer = metadata.xmp;
137
+ console.log(chalk.dim(` Size: ${xmpBuffer.length} bytes`));
138
+ }
139
+ // IPTC data
140
+ if (metadata.iptc) {
141
+ console.log(chalk.dim('\n IPTC Data:'));
142
+ const iptcBuffer = metadata.iptc;
143
+ console.log(chalk.dim(` Size: ${iptcBuffer.length} bytes`));
144
+ }
145
+ console.log('');
146
+ }
147
+ // Histogram statistics
148
+ if (options.histogram) {
149
+ console.log(chalk.bold.cyan('📊 Color Statistics:'));
150
+ const stats = await createSharpInstance(input).stats();
151
+ if (stats.channels) {
152
+ stats.channels.forEach((channel, index) => {
153
+ const channelNames = ['Red', 'Green', 'Blue', 'Alpha'];
154
+ const channelName = channelNames[index] || `Channel ${index + 1}`;
155
+ console.log(chalk.dim(`\n ${channelName}:`));
156
+ console.log(chalk.dim(` Min: ${channel.min}`));
157
+ console.log(chalk.dim(` Max: ${channel.max}`));
158
+ console.log(chalk.dim(` Mean: ${channel.mean.toFixed(2)}`));
159
+ console.log(chalk.dim(` Std Dev: ${channel.stdev.toFixed(2)}`));
160
+ if (channel.minX !== undefined && channel.minY !== undefined) {
161
+ console.log(chalk.dim(` Min at: (${channel.minX}, ${channel.minY})`));
162
+ }
163
+ if (channel.maxX !== undefined && channel.maxY !== undefined) {
164
+ console.log(chalk.dim(` Max at: (${channel.maxX}, ${channel.maxY})`));
165
+ }
166
+ });
167
+ console.log('');
168
+ console.log(chalk.dim(' Overall:'));
169
+ console.log(chalk.dim(` Dominant Color: RGB(${stats.dominant?.r || 0}, ${stats.dominant?.g || 0}, ${stats.dominant?.b || 0})`));
170
+ console.log(chalk.dim(` Entropy: ${stats.entropy?.toFixed(2) || 'N/A'}`));
171
+ console.log(chalk.dim(` Sharpness: ${stats.sharpness?.toFixed(2) || 'N/A'}`));
172
+ }
173
+ }
174
+ }
175
+ catch (error) {
176
+ spinner.fail(chalk.red('Failed to analyze image'));
177
+ if (options.verbose) {
178
+ console.error(chalk.red('Error details:'), error);
179
+ }
180
+ else {
181
+ console.error(chalk.red(error.message));
182
+ }
183
+ process.exit(1);
184
+ }
185
+ });
186
+ }
187
+ //# sourceMappingURL=stats.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats.js","sourceRoot":"","sources":["../../src/commands/stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Command } from 'commander';
2
+ export declare function thumbnailCommand(imageCmd: Command): void;
3
+ //# sourceMappingURL=thumbnail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"thumbnail.d.ts","sourceRoot":"","sources":["../../src/commands/thumbnail.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAczC,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAkIxD"}