所以,长话短说: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 定向处理是一个贫民窟