64 lines
1.5 KiB
JavaScript
64 lines
1.5 KiB
JavaScript
import BMP from 'bmp-js';
|
|
import { scan } from '@jimp/utils';
|
|
|
|
const MIME_TYPE = 'image/bmp';
|
|
const MIME_TYPE_SECOND = 'image/x-ms-bmp';
|
|
|
|
function toAGBR(image) {
|
|
return scan(image, 0, 0, image.bitmap.width, image.bitmap.height, function(
|
|
x,
|
|
y,
|
|
index
|
|
) {
|
|
const red = this.bitmap.data[index + 0];
|
|
const green = this.bitmap.data[index + 1];
|
|
const blue = this.bitmap.data[index + 2];
|
|
const alpha = this.bitmap.data[index + 3];
|
|
|
|
this.bitmap.data[index + 0] = alpha;
|
|
this.bitmap.data[index + 1] = blue;
|
|
this.bitmap.data[index + 2] = green;
|
|
this.bitmap.data[index + 3] = red;
|
|
}).bitmap;
|
|
}
|
|
|
|
function fromAGBR(bitmap) {
|
|
return scan({ bitmap }, 0, 0, bitmap.width, bitmap.height, function(
|
|
x,
|
|
y,
|
|
index
|
|
) {
|
|
const alpha = this.bitmap.data[index + 0];
|
|
const blue = this.bitmap.data[index + 1];
|
|
const green = this.bitmap.data[index + 2];
|
|
const red = this.bitmap.data[index + 3];
|
|
|
|
this.bitmap.data[index + 0] = red;
|
|
this.bitmap.data[index + 1] = green;
|
|
this.bitmap.data[index + 2] = blue;
|
|
this.bitmap.data[index + 3] = bitmap.is_with_alpha ? alpha : 0xff;
|
|
}).bitmap;
|
|
}
|
|
|
|
const decode = data => fromAGBR(BMP.decode(data));
|
|
const encode = image => BMP.encode(toAGBR(image)).data;
|
|
|
|
export default () => ({
|
|
mime: { [MIME_TYPE]: ['bmp'] },
|
|
|
|
constants: {
|
|
MIME_BMP: MIME_TYPE,
|
|
MIME_X_MS_BMP: MIME_TYPE_SECOND
|
|
},
|
|
|
|
decoders: {
|
|
[MIME_TYPE]: decode,
|
|
[MIME_TYPE_SECOND]: decode
|
|
},
|
|
|
|
encoders: {
|
|
[MIME_TYPE]: encode,
|
|
[MIME_TYPE_SECOND]: encode
|
|
}
|
|
});
|