5

我正在使用 Jimp ( https://www.npmjs.com/package/jimp ) 库来裁剪图像。

裁剪工作正常,但我只有图像方向的问题。

有时,用户上传旋转的图像,其结果是旋转裁剪的图像。

我浏览了https://www.npmjs.com/package/jimp文档,但找不到与此相关的任何内容。

这是我通过但没有帮助的几个链接:

https://justmarkup.com/articles/2019-10-21-image-orientation/

在客户端的 JavaScript 中访问 JPEG EXIF 旋转数据

请帮忙

4

1 回答 1

0

所以,长话短说:jimp 正确读取通过 exif 方向属性旋转的图像并重新排列像素,就好像 exif/orientation 属性不存在一样,但随后也存储旧的 exif 属性而不是将其重置为 1,因为它应该为它在每个设备上正确显示。

我能够实现的最简单的解决方案是使用exif-auto-rotate旋转图像像素并在将(base64 编码的)图像上传到后端之前重置前端的 exif 属性:

    import Rotator from 'exif-auto-rotate';
    
    // ...
    
    const [file] = e.target.files;
    
    const image = await Rotator.createRotatedImageAsync(file, "base64")
        .catch(err => {
            if (err === "Image is NOT have a exif code" || err === "Image is NOT JPEG") {
                // just return base64 encoded image if image is not jpeg or contains no exif orientation property
                return toBase64(file)
            }
            // reject if other error
            return Promise.reject(err)
        });

如果您需要在后端执行此操作,那么您最好按照此处的建议将jpeg-autorotate与缓冲区一起使用:

const fileIn = fs.readFileSync('input.jpg')
const jo = require('jpeg-autorotate')
const {buffer} = await jo.rotate(fileIn, {quality: 30})
const image = await Jimp.read(buffer)

有关基于浏览器的 exif 方向问题的更多信息:

EXIF 定向处理是一个贫民窟

于 2022-02-10T21:11:20.543 回答