npm package: @georgedrpg/bulk-process-images
Description: bulk process images with sharp
Author: George Campbell
Latest version: 1.3.3

> **⚠ WARNING: this script writes files on your hard drive, make sure it won't overwrite important files. Make sure outputPath is different to inputPath.

# Bulk process images

> There are 2 options, install as npm module, and use as a CLI program.

## Install as npm module

`npm i @georgedrpg/bulk-process-images`

### Import into your project

`import processImages from '@georgedrpg/bulk-process-images'`

Or if no ESM support use:

`const processImages = require('@georgedrpg/bulk-process-images').default`

### Call with these arguments (or use defaults)

inputPath (default: 'inputs') <br>
outputPath (default: 'outputs') <br>
allowedExts: [".png"] <br>
pipeline:
```json
[
  {
    action: 'flip'
  },
  {
    action: 'blur',
    args: [
      10
    ]
  },
]
```
 <br>
suffix: (default: '-processed')
newExtension: (default: undefined) // override original extension with new extension, for example if changing a file's format
transformFilenameFn (default: (fileName, suffix, ext) => filename+suffix+'.'+ext) <br>
logLevel (default: 'verbose') // 'verbose' or 'none' - console log level
dryRun (default: false) // doesn't process images, useful for confirming arguments are correct with 'verbose' logLevel.

For pipeline options see [sharp API](https://sharp.pixelplumbing.com/). Use format: { action: string, args: any[] }

For example:

```javascript
const width = 64;
processImages({
  inputPath: 'large_images',
  outputPath: 'build/images',
  allowedExts: ['.png', '.jpeg', '.jpg'],
  pipeline: [{action:'resize', args:[width]}]
  suffix: '_'+width+'w' })
processImages({
  inputPath: 'png_images',
  outputPath: 'build/images',
  allowedExts: ['.png'],
  pipeline: [{action:'toFormat', args:['jpg']}],
  suffix: '',
  newExtension: 'jpg'
})
```
## Use as a CLI program

`npm i @georgedrpg/bulk-process-images -g`

`bulk-process-images <option>=<value>`

### Options:
#### i - input folder
#### o - output folder
#### pipeline - commands to process the images with, see [sharp API](https://sharp.pixelplumbing.com/) in format [...["action", [...args]]]
> action would be the name of the sharp operation e.g. `sharp().resize(300)` can be described with `pipeline='[["resize", [300]]]'`
#### exts - Allowed extensions e.g. [".png", ".jpg", ".jpeg"]
#### suffix - string added to end of output filenames (before the extension)
#### newExtension - if specified, filename extension will be set to this (doesn't alter image format, use in combination with pipeline 'toFormat' action instead.)
#### dry - dry run, don't actually process the images
#### logLevel - "verbose" | "none" (default: "verbose") - console log level

For example:

`bulk-process-images i=./inputs o=./outputs pipeline='[["resize", [32]],["blur", [1]]]' exts='[".png"]'`

The `pipeline` and `exts` arguments take stringified JSON as input, so you might want to run JSON.stringify(value) on your value first.
If adding it to an npm package.json script, you will need to ensure inner double quotes are escaped with backslash '\'.

# Notes

This program is not designed to handle overwriting images, and can end up corrupting images without outputting anything useful if the output folder+filename is the same as the input folder+filename. Make sure to use a different output and input folder, and handle overwriting your input folder yourself if needed.

## TODO:

- Needs automated tests

- Need to make sure paths resolve correctly and odd input/output paths don't break

- Separate CLI and importable NPM module into separate modules