You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Node.js中用piexifjs仅修改图片Exif的Orientation字段

解决piexifjs仅修改Orientation字段并保留其余Exif信息的问题

你的核心问题在于没有读取并复用原图片的Exif数据,而是直接创建了空的zeroth、exif、gps对象,这相当于清空了所有原有Exif信息,只保留了你设置的Orientation。正确的做法是先解析出图片原有的完整Exif数据,仅修改Orientation字段,再将修改后的Exif数据插回原图片中。

正确实现步骤

  1. 读取原图片的二进制数据
  2. 解析出图片原有的全部Exif对象
  3. 修改Exif对象中0th(ImageIFD)里的Orientation字段
  4. 将修改后的Exif对象转成字节流
  5. 把新的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 04:00:09