修复 Jimp 中的图像方向

Par*_*mar 6 image-processing node.js jimp

我正在使用 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 旋转数据

请帮忙

r.d*_*lic 0

所以,长话短说:jimp 正确读取通过 exiforientation 属性旋转的图像,并重新排列像素,就好像 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)
        });
Run Code Online (Sandbox Code Playgroud)

如果您需要在后端执行此操作,那么您可能最好使用带缓冲区的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)
Run Code Online (Sandbox Code Playgroud)

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

EXIF 方向处理是一个贫民窟