fix bmp support

This commit is contained in:
rubikscraft 2022-04-15 13:28:25 +02:00
parent 1c57e292d7
commit b778b86eae
No known key found for this signature in database
GPG key ID: 1463EBE9200A5CD4
3 changed files with 41 additions and 22 deletions

View file

@ -28,6 +28,7 @@
"@nestjs/platform-fastify": "^8.4.4", "@nestjs/platform-fastify": "^8.4.4",
"@nestjs/serve-static": "^2.2.2", "@nestjs/serve-static": "^2.2.2",
"@nestjs/typeorm": "^8.0.3", "@nestjs/typeorm": "^8.0.3",
"@vingle/bmp-js": "^0.2.5",
"bcrypt": "^5.0.1", "bcrypt": "^5.0.1",
"cors": "^2.8.5", "cors": "^2.8.5",
"fastify-helmet": "^7.0.1", "fastify-helmet": "^7.0.1",

View file

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

View file

@ -1755,6 +1755,11 @@
resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.24.tgz#20ba1bf69c1b4ab405c7a01e950c4f446b05029f" resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.24.tgz#20ba1bf69c1b4ab405c7a01e950c4f446b05029f"
integrity sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g== integrity sha512-aveCYRQbgTH9Pssp1voEP7HiuWlD2jW2BO56w+bVrJn04i61yh6mRfoKO6hEYQD9vF+W8Chkwc6j1M36uPkx4g==
"@types/node@^8.10.29":
version "8.10.66"
resolved "https://registry.yarnpkg.com/@types/node/-/node-8.10.66.tgz#dd035d409df322acc83dff62a602f12a5783bbb3"
integrity sha512-tktOkFUA4kXx2hhhrB8bIFb5TbwzS4uOhKEmwiD+NoiL0qtP2OQ9mFldbgD4dV1djrlBYP6eBuQZiWjuHUpqFw==
"@types/parse-json@^4.0.0": "@types/parse-json@^4.0.0":
version "4.0.0" version "4.0.0"
resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0" resolved "https://registry.yarnpkg.com/@types/parse-json/-/parse-json-4.0.0.tgz#2f8bb441434d163b35fb8ffdccd7138927ffb8c0"
@ -1944,6 +1949,13 @@
"@typescript-eslint/types" "5.19.0" "@typescript-eslint/types" "5.19.0"
eslint-visitor-keys "^3.0.0" eslint-visitor-keys "^3.0.0"
"@vingle/bmp-js@^0.2.5":
version "0.2.5"
resolved "https://registry.yarnpkg.com/@vingle/bmp-js/-/bmp-js-0.2.5.tgz#a333166f42ff879b84443cc5fb1bbe93d234d294"
integrity sha512-tiY69wMrXgIVcdpkjQybXTyQw+P2rKzUfA6b+biM6BD1utr5QeeEj9fzs0fFHVf+3siTsYwzI6zltV9+i6ehEA==
dependencies:
"@types/node" "^8.10.29"
"@webassemblyjs/ast@1.11.1": "@webassemblyjs/ast@1.11.1":
version "1.11.1" version "1.11.1"
resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7" resolved "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.11.1.tgz#2bfd767eae1a6996f432ff7e8d7fc75679c0b6a7"