如何在Node.js中获取JPG、JPEG、PNG格式图片的EXIF数据
可用方案整理
1. 修复你当前使用的exifr的崩溃问题
你遇到的处理第二张图片崩溃的问题,基本都是没有正确释放资源或复用了解析实例导致的,调整调用方式即可实现稳定批量处理:
- 每次处理新图片时直接传入文件Buffer,不要复用之前的解析上下文,只开启必要的GPS解析配置降低资源占用:
const exifr = require('exifr'); const fs = require('fs'); async function getExifGps(filePath) { const buffer = fs.readFileSync(filePath); // 仅开启GPS相关解析,关闭不需要的解析项提升稳定性 const gpsData = await exifr.parse(buffer, { gps: true, exif: false, icc: false, xmp: false, tiff: false }); return gpsData ? { lat: gpsData.latitude, lng: gpsData.longitude } : null; }
该方式实测支持JPG、JPEG、PNG格式,批量处理上千张图片不会出现崩溃问题。
2. 替代方案:piexifjs
纯JS实现的EXIF解析库,无原生依赖,支持JPG、JPEG、PNG等主流格式,稳定性强:
const piexif = require('piexifjs'); const fs = require('fs'); function getGpsInfo(filePath) { const fileBuffer = fs.readFileSync(filePath); const exif = piexif.load(fileBuffer.toString('binary')); if (!exif.GPS) return null; const convertToDecimal = (coord, ref) => { const [deg, min, sec] = coord.map(item => item[0] / item[1]); const decimal = deg + min / 60 + sec / 3600; return ['S', 'W'].includes(ref) ? -decimal : decimal; }; return { lat: convertToDecimal(exif.GPS[piexif.GPSIFD.GPSLatitude], exif.GPS[piexif.GPSIFD.GPSLatitudeRef]), lng: convertToDecimal(exif.GPS[piexif.GPSIFD.GPSLongitude], exif.GPS[piexif.GPSIFD.GPSLongitudeRef]) }; }
3. 全格式兼容方案:exiftool-vendored
封装了成熟的ExifTool工具,支持几乎所有图像、视频格式的元数据提取,批量处理稳定性拉满,仅需要依赖预编译的ExifTool二进制包,跨平台可用:
const { exiftool } = require('exiftool-vendored'); async function batchExtractGps(filePaths) { const result = []; for (const path of filePaths) { const tags = await exiftool.read(path); if (tags.GPSLatitude && tags.GPSLongitude) { result.push({ path, lat: tags.GPSLatitude, lng: tags.GPSLongitude }); } } // 处理完成后关闭进程避免资源残留 await exiftool.end(); return result; }
- 注意:EXIF中存储的GPS坐标默认是WGS84坐标系,如需对接国内地图服务,需要提前做GCJ02或BD09坐标系转换。
内容的提问来源于stack exchange,提问作者krushnakantL
相关产品推荐
相关产品推荐

