imagemagick-async
Version:
An API for Image Magick commands.
204 lines (174 loc) • 4.16 kB
JavaScript
let Path = require('path');
let PathParts = __dirname.split(Path.sep);
let index = PathParts.indexOf('imagemagick-async');
let RootDir = PathParts.slice(0, index + 1).join(Path.sep);
let Err = require(Path.join(RootDir, 'error.js'));
let Filepath = require(Path.join(RootDir, 'filepath.js')).Filepath;
let FxBaseClass = require(Path.join(Filepath.FxDir(), 'fxbaseclass.js')).FxBaseClass;
//---------------------------------
class Pixelate extends FxBaseClass {
constructor(builder) {
super(builder);
}
/**
* @override
*/
static get Builder() {
class Builder {
constructor() {
this.name = 'Pixelate';
this.args = {};
}
/**
* @param {string} str The path of the image file you are modifying.
*/
source(str) {
this.args.source = str;
return this;
}
/**
* @param {number} n
*/
aggressiveness(n) {
this.args.aggressiveness = n;
return this;
}
/**
* @param {number} n
*/
width(n) {
this.args.width = n;
return this;
}
/**
* @param {number} n
*/
height(n) {
this.args.height = n;
return this;
}
build() {
return new Pixelate(this);
}
}
return new Builder();
}
/**
* @override
*/
Args() {
let params = Pixelate.Parameters();
let args = ['-sample'];
let sampleValue = null;
if (this.args.aggressiveness > params.aggressiveness.max)
sampleValue = 1;
else if (this.args.aggressiveness < params.aggressiveness.min)
sampleValue = params.aggressiveness.max;
else
sampleValue = (params.aggressiveness.max - this.args.aggressiveness) + 1;
args.push(`${sampleValue}%`);
args.push('-scale', `${this.args.width}x${this.args.height}`);
return args;
}
/**
* @override
*/
Errors() {
let params = Pixelate.Parameters();
let errors = [];
let prefix = 'PIXELATE_FX_ERROR';
let sourceErr = Err.ErrorMessage.Builder
.prefix(prefix)
.varName('Source')
.condition(
new Err.StringCondition.Builder(this.args.source)
.isEmpty(false)
.isWhitespace(false)
.build()
)
.build()
.String();
if (sourceErr)
errors.push(sourceErr);
let widthErr = Err.ErrorMessage.Builder
.prefix(prefix)
.varName('Width')
.condition(
new Err.NumberCondition.Builder(this.args.width)
.isInteger(true)
.min(params.width.min)
.build()
)
.build()
.String();
if (widthErr)
errors.push(widthErr);
let heightErr = Err.ErrorMessage.Builder
.prefix(prefix)
.varName('Height')
.condition(
new Err.NumberCondition.Builder(this.args.height)
.isInteger(true)
.min(params.height.min)
.build()
)
.build()
.String();
if (heightErr)
errors.push(heightErr);
let aggressivenessErr = Err.ErrorMessage.Builder
.prefix(prefix)
.varName('Aggressiveness')
.condition(
new Err.NumberCondition.Builder(this.args.aggressiveness)
.isInteger(true)
.min(params.aggressiveness.min)
.max(params.aggressiveness.max)
.build()
)
.build()
.String();
if (aggressivenessErr)
errors.push(aggressivenessErr);
return errors;
}
/**
* @override
*/
IsConsolidatable() {
return false;
}
/**
* @override
*/
static Parameters() {
return {
source: {
type: 'string',
required: true
},
aggressiveness: {
type: 'number',
subtype: 'integer',
min: 1,
max: 100,
required: true
},
width: {
type: 'number',
subtype: 'integer',
min: 1,
required: true
},
height: {
type: 'number',
subtype: 'integer',
min: 1,
required: true
}
};
}
}
//----------------------------
// EXPORTS
exports.Pixelate = Pixelate;