使 FilePond Image Transform 插件忽略(动画)GIF
Make FilePond Image Transform plugin ignore (animated) GIFs
我将 FilePond 与图像编辑器一起使用,因此我还加载了图像转换插件。
但是,当用户上传 GIF 文件时,我希望输出的图像仍然是 GIF 文件。目前它已通过图像转换插件转换为 PNG。
有没有办法让 FilePond 在上传 GIF 文件时禁用图像转换插件,或者以某种方式更改输出 mime 类型?
请安装3.6.0
版本的图像转换插件,并使用以下功能过滤出动画GIF图像。
动画 GIF 过滤器代码片段来自
Is it possible to detect animated gif images client side?
FilePond.create({
imageTransformImageFilter: (file) => new Promise(resolve => {
// no gif mimetype, do transform
if (!/image\/gif/.test(file.type)) return resolve(true);
const reader = new FileReader();
reader.onload = () => {
var arr = new Uint8Array(reader.result),
i, len, length = arr.length, frames = 0;
// make sure it's a gif (GIF8)
if (arr[0] !== 0x47 || arr[1] !== 0x49 ||
arr[2] !== 0x46 || arr[3] !== 0x38) {
// it's not a gif, we can safely transform it
resolve(true);
return;
}
for (i=0, len = length - 9; i < len, frames < 2; ++i) {
if (arr[i] === 0x00 && arr[i+1] === 0x21 &&
arr[i+2] === 0xF9 && arr[i+3] === 0x04 &&
arr[i+8] === 0x00 &&
(arr[i+9] === 0x2C || arr[i+9] === 0x21)) {
frames++;
}
}
// if frame count > 1, it's animated, don't transform
if (frames > 1) {
return resolve(false);
}
// do transform
resolve(true);
}
reader.readAsArrayBuffer(file);
})
});
我将 FilePond 与图像编辑器一起使用,因此我还加载了图像转换插件。
但是,当用户上传 GIF 文件时,我希望输出的图像仍然是 GIF 文件。目前它已通过图像转换插件转换为 PNG。
有没有办法让 FilePond 在上传 GIF 文件时禁用图像转换插件,或者以某种方式更改输出 mime 类型?
请安装3.6.0
版本的图像转换插件,并使用以下功能过滤出动画GIF图像。
动画 GIF 过滤器代码片段来自 Is it possible to detect animated gif images client side?
FilePond.create({
imageTransformImageFilter: (file) => new Promise(resolve => {
// no gif mimetype, do transform
if (!/image\/gif/.test(file.type)) return resolve(true);
const reader = new FileReader();
reader.onload = () => {
var arr = new Uint8Array(reader.result),
i, len, length = arr.length, frames = 0;
// make sure it's a gif (GIF8)
if (arr[0] !== 0x47 || arr[1] !== 0x49 ||
arr[2] !== 0x46 || arr[3] !== 0x38) {
// it's not a gif, we can safely transform it
resolve(true);
return;
}
for (i=0, len = length - 9; i < len, frames < 2; ++i) {
if (arr[i] === 0x00 && arr[i+1] === 0x21 &&
arr[i+2] === 0xF9 && arr[i+3] === 0x04 &&
arr[i+8] === 0x00 &&
(arr[i+9] === 0x2C || arr[i+9] === 0x21)) {
frames++;
}
}
// if frame count > 1, it's animated, don't transform
if (frames > 1) {
return resolve(false);
}
// do transform
resolve(true);
}
reader.readAsArrayBuffer(file);
})
});