Skip to content

Commit 3124740

Browse files
committed
Add rescaling and interpolation option
1 parent f709f30 commit 3124740

File tree

7 files changed

+267
-166
lines changed

7 files changed

+267
-166
lines changed

@types/types.d.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,4 +5,6 @@ declare type Options = {
55
height?: number;
66
canvasWidth?: number;
77
canvasHeight?: number;
8+
scale: number;
9+
cubic: boolean;
810
};

README.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,10 @@ Command-line utility that slices input images into segments according to specifi
2525
-h, --height Height of each slice [number]
2626
-d, --canvasWidth Width of canvas for final output [number]
2727
-g, --canvasHeight Height of canvas for final output [number]
28+
-s, --scale Rescale the image up or down by this factor, after
29+
slicing, but before canvas resize [number] [default: 1]
30+
-c, --cubic Uses bicubic interpolation instead of nearest neighbour if
31+
rescaling [boolean] [default: false]
2832
```
2933

3034
- If `filename` does not include an extension, `.png`, `.gif`, `.jpg` and `.jpeg` will be guessed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "node-image-slice",
3-
"version": "2.1.0",
3+
"version": "2.2.0",
44
"description": "Slices an input image into segments according to specified width and height",
55
"repository": {
66
"type": "git",

slice.cjs

Lines changed: 106 additions & 80 deletions
Original file line numberDiff line numberDiff line change
@@ -5,85 +5,111 @@ const yargs = require('yargs');
55
const os = require('os');
66
const processImage_1 = require('./utils/processImage');
77
const processPath_1 = require('./utils/processPath');
8-
// Parse command line arguments
9-
const options = yargs
10-
.option('f', {
11-
alias: 'filename',
12-
describe: 'Input image filename',
13-
type: 'string',
14-
})
15-
.option('i', {
16-
alias: 'folderPath',
17-
describe: 'Input folder',
18-
type: 'string',
19-
})
20-
.option('w', {
21-
alias: 'width',
22-
describe: 'Width of each slice',
23-
type: 'number',
24-
demandOption: true,
25-
coerce: (value) => {
26-
if (value < 1) {
27-
throw new Error('width should not be lower than 1');
28-
}
29-
return Math.round(value);
30-
},
31-
})
32-
.option('h', {
33-
alias: 'height',
34-
describe: 'Height of each slice',
35-
type: 'number',
36-
coerce: (value) => {
37-
if (value !== undefined && value < 1) {
38-
throw new Error('height should not be lower than 1');
39-
}
40-
return Math.round(value);
41-
},
42-
})
43-
.option('d', {
44-
alias: 'canvasWidth',
45-
describe: 'Width of canvas for final output',
46-
type: 'number',
47-
coerce: (value) => {
48-
if (value !== undefined && value < 1) {
49-
throw new Error('canvasWidth should not be lower than 1');
50-
}
51-
return Math.round(value);
52-
},
53-
})
54-
.option('g', {
55-
alias: 'canvasHeight',
56-
describe: 'Height of canvas for final output',
57-
type: 'number',
58-
coerce: (value) => {
59-
if (value !== undefined && value < 1) {
60-
throw new Error('canvasHeight should not be lower than 1');
61-
}
62-
return Math.round(value);
63-
},
64-
}).argv;
65-
if (options.filename) {
66-
// Process a single image
67-
const { filename, width, height, canvasWidth, canvasHeight } = options;
68-
(0, processImage_1.sliceImage)(
69-
filename,
70-
width,
71-
height,
72-
canvasWidth,
73-
canvasHeight,
74-
);
75-
} else if (options.folderPath) {
76-
// Process all images in a folder, splitting the task into threads
77-
let numCores = 2;
78-
try {
79-
numCores = os.cpus().length;
80-
} catch (err) {
81-
console.error(err);
8+
function main() {
9+
// Parse command line arguments
10+
const options = yargs
11+
.option('f', {
12+
alias: 'filename',
13+
describe: 'Input image filename',
14+
type: 'string',
15+
})
16+
.option('i', {
17+
alias: 'folderPath',
18+
describe: 'Input folder',
19+
type: 'string',
20+
})
21+
.option('w', {
22+
alias: 'width',
23+
describe: 'Width of each slice',
24+
type: 'number',
25+
demandOption: true,
26+
coerce: (value) => {
27+
if (value < 1) {
28+
throw new Error('width should not be lower than 1');
29+
}
30+
return Math.round(value);
31+
},
32+
})
33+
.option('h', {
34+
alias: 'height',
35+
describe: 'Height of each slice',
36+
type: 'number',
37+
coerce: (value) => {
38+
if (value !== undefined && value < 1) {
39+
throw new Error('height should not be lower than 1');
40+
}
41+
return Math.round(value);
42+
},
43+
})
44+
.option('d', {
45+
alias: 'canvasWidth',
46+
describe: 'Width of canvas for final output',
47+
type: 'number',
48+
coerce: (value) => {
49+
if (value !== undefined && value < 1) {
50+
throw new Error('canvasWidth should not be lower than 1');
51+
}
52+
return Math.round(value);
53+
},
54+
})
55+
.option('g', {
56+
alias: 'canvasHeight',
57+
describe: 'Height of canvas for final output',
58+
type: 'number',
59+
coerce: (value) => {
60+
if (value !== undefined && value < 1) {
61+
throw new Error('canvasHeight should not be lower than 1');
62+
}
63+
return Math.round(value);
64+
},
65+
})
66+
.option('s', {
67+
alias: 'scale',
68+
describe:
69+
'Rescale the image up or down by this factor, after slicing, but before canvas resize',
70+
type: 'number',
71+
default: 1,
72+
coerce: (value) => {
73+
if (value <= 0) {
74+
throw new Error('scale should be > 0');
75+
}
76+
return value;
77+
},
78+
})
79+
.option('c', {
80+
alias: 'cubic',
81+
describe:
82+
'Uses bicubic interpolation instead of nearest neighbour if rescaling',
83+
type: 'boolean',
84+
default: false,
85+
}).argv;
86+
if (options.filename) {
87+
// Process a single image
88+
const { filename, width, height, canvasWidth, canvasHeight, scale, cubic } =
89+
options;
90+
(0, processImage_1.sliceImage)(
91+
filename,
92+
width,
93+
height,
94+
canvasWidth,
95+
canvasHeight,
96+
scale,
97+
cubic,
98+
);
99+
} else if (options.folderPath) {
100+
// Process all images in a folder, splitting the task into threads
101+
let numCores = 2;
102+
try {
103+
numCores = os.cpus().length;
104+
} catch (err) {
105+
console.error(err);
106+
}
107+
numCores = Math.max(numCores - 1, 1);
108+
(0, processPath_1.processPath)(options.folderPath, options, numCores);
109+
} else {
110+
console.log(
111+
'Requires either `filename` or `folderPath`. Run `slice --help` for help.',
112+
);
82113
}
83-
numCores = Math.max(numCores - 1, 1);
84-
(0, processPath_1.processPath)(options.folderPath, options, numCores);
85-
} else {
86-
console.log(
87-
'Requires either `filename` or `folderPath`. Run `slice --help` for help.',
88-
);
89114
}
115+
main();

0 commit comments

Comments
 (0)