@ngageoint/mage.image.service
Version:
Orient images attached to MAGE observations according to EXIF meta-data and generate configurable size thumbnails.
71 lines • 2.34 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SharpImageService = void 0;
const sharp_1 = __importDefault(require("sharp"));
function ImageDescriptor(info) {
return {
sizeInBytes: info.size,
mediaType: `image/${info.format}`,
dimensions: {
width: info.width,
height: info.height
}
};
}
class ImageOperation {
static apply(transform) {
const state = {
resolve: ((x) => void (0)),
finished: false,
desc: undefined
};
transform = transform
.on('info', x => {
const desc = ImageDescriptor(x);
if (state.finished) {
return void (state.resolve(desc));
}
state.desc = desc;
})
.on('finish', () => {
if (state.desc) {
return void (state.resolve(state.desc));
}
state.finished = true;
})
.on('error', x => {
state.resolve(x instanceof Error ? x : new Error(String(x)));
});
const RunOp = class extends Promise {
to(input, output) {
input.pipe(transform).pipe(output);
return this;
}
};
return new RunOp(resolve => {
state.resolve = resolve;
});
}
}
const defaultOptions = {
failOn: 'error'
};
function SharpImageService() {
return {
autoOrient(source, dest) {
const orient = (0, sharp_1.default)(defaultOptions).rotate();
return ImageOperation.apply(orient).to(source.bytes, dest);
},
scaleToDimension(minDimension, source, dest) {
const { width, height } = source.dimensions || { width: 0, height: 0 };
const targetDimensions = width < height ? { width: minDimension } : { height: minDimension };
const scale = (0, sharp_1.default)(defaultOptions).resize(targetDimensions);
return ImageOperation.apply(scale).to(source.bytes, dest);
}
};
}
exports.SharpImageService = SharpImageService;
//# sourceMappingURL=adapters.images.sharp.js.map