fix bmp support

This commit is contained in:
rubikscraft
2022-04-15 13:28:25 +02:00
parent 1c57e292d7
commit b778b86eae
3 changed files with 41 additions and 22 deletions

View File

@@ -1,4 +1,5 @@
import { Injectable } from '@nestjs/common';
import * as bmp from '@vingle/bmp-js';
import icoToPng from 'ico-to-png';
import { AsyncFailable, Fail } from 'picsur-shared/dist/types';
import sharp from 'sharp';
@@ -11,6 +12,11 @@ import {
@Injectable()
export class ImageProcessorService {
private readonly PngOptions = {
compressionLevel: 9,
effort: 10,
};
constructor(private readonly userPref: UsrPreferenceService) {}
public async process(
@@ -44,29 +50,18 @@ export class ImageProcessorService {
): AsyncFailable<Buffer> {
let processedImage = image;
switch (mime.mime) {
case ImageMime.ICO:
processedImage = await icoToPng(processedImage, 512);
mime.mime = ImageMime.PNG;
break;
case ImageMime.BMP:
case ImageMime.TIFF:
case ImageMime.WEBP:
case ImageMime.PNG:
case ImageMime.JPEG:
processedImage = await sharp(processedImage)
.png({
compressionLevel: 9,
effort: 10,
})
.toBuffer();
mime.mime = ImageMime.PNG;
break;
default:
return Fail('Unsupported mime type');
if (mime.mime === ImageMime.ICO) {
processedImage = await icoToPng(processedImage, 512);
} else if (mime.mime === ImageMime.BMP) {
processedImage = await this.bmpSharp(processedImage)
.png(this.PngOptions)
.toBuffer();
} else {
processedImage = await sharp(processedImage)
.png(this.PngOptions)
.toBuffer();
}
mime.mime = ImageMime.PNG;
return processedImage;
}
@@ -79,4 +74,15 @@ export class ImageProcessorService {
// Apng and gif are stored as is for now
return image;
}
private bmpSharp(image: Buffer) {
const bitmap = bmp.decode(image, true);
return sharp(bitmap.data, {
raw: {
width: bitmap.width,
height: bitmap.height,
channels: 4,
},
});
}
}