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 旋转数据
请帮忙
所以,长话短说: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 方向问题的更多信息: