如何在Node.js中用piexifjs仅修改图片Exif的Orientation字段
解决piexifjs仅修改Orientation字段并保留其余Exif信息的问题
你的核心问题在于没有读取并复用原图片的Exif数据,而是直接创建了空的zeroth、exif、gps对象,这相当于清空了所有原有Exif信息,只保留了你设置的Orientation。正确的做法是先解析出图片原有的完整Exif数据,仅修改Orientation字段,再将修改后的Exif数据插回原图片中。
正确实现步骤
- 读取原图片的二进制数据
- 解析出图片原有的全部Exif对象
- 修改Exif对象中
0th(ImageIFD)里的Orientation字段 - 将修改后的Exif对象转成字节流
- 把新的Exif字节流插入回原图片数据,保存为新文件
完整代码示例
const fs = require('fs'); const piexif = require('piexifjs'); const filename1 = "test.jpg"; const filename2 = "out1.jpg"; try { // 1. 读取原图片二进制数据并转成binary格式 const jpeg = fs.readFileSync(filename1); const data = jpeg.toString("binary"); // 2. 解析原图片的全部Exif数据 const exifObj = piexif.load(data); // 3. 仅修改Orientation字段(值1-8对应不同方向,根据需求调整) exifObj["0th"][piexif.ImageIFD.Orientation] = 1; // 4. 将修改后的Exif对象转成字节流 const exifBytes = piexif.dump(exifObj); // 5. 插入新的Exif数据到原图片中 const newData = piexif.insert(exifBytes, data); const newJpeg = Buffer.from(newData, "binary"); // 6. 保存新图片 fs.writeFileSync(filename2, newJpeg); console.log("Orientation字段修改完成,其余Exif信息已保留"); } catch (error) { console.error("处理出错:", error); }
对你原尝试代码的错误分析
你原来的代码中:
var zeroth = {}; var exif = {}; var gps = {}; zeroth[piexif.ImageIFD.Orientation] = 1; var exifObj = {"0th":zeroth, "Exif":exif, "GPS":gps};
这段代码是创建了全新的空Exif对象,只包含你设置的Orientation,原图片的其他Exif信息(比如相机型号、拍摄时间等)都被丢弃了。而通过piexif.load(data)可以完整读取原图片的所有Exif数据,之后只修改需要的字段即可保留其余信息。
补充说明
- Orientation的取值范围是1到8,对应不同的图片旋转/翻转方向,你可以根据实际需求调整数值
- 如果原图片没有Exif信息,
piexif.load(data)会返回包含空0th、Exif、GPS对象的结构,此时设置Orientation也能正常生效
内容的提问来源于stack exchange,提问作者Wai Yan Hein
相关产品推荐
相关产品推荐

