在 Node.js 中更改 JPEG 文件 DPI 标头

kri*_*_IV 2 jpeg node.js phantomjs puppeteer

我有一个文件(例如 JPEG 大小 1588 × 2244px)。它由puppeteer(但phantomjs也生成72 DPI屏幕截图)生成。当我将此图像保存到带有.jpeg扩展名的文件中并使用 macOS 常规信息时,我看到:

在此处输入图片说明

如您所见,它已72 DPI在元数据中设置,但我想将文件与300 DPI. 我知道,在数字中它不会改变任何东西——它是打印的属性,但我不想向每个客户解释这个文件可以用300 DPI.

当我使用 Gimp 和 Image > Print Size

在此处输入图片说明

我可以更改 DPI,然后再次导出图片。现在它300 DPIGeneral Info窗口中。

在此处输入图片说明

我尝试在 Node.JS 服务器中执行此操作,但我发现很少有选项可以更改.PNG图片上的此属性,但任何人都在处理.JPEG文件。

我认为最准确的选择是使用changeDpiDataUrl这个库中的方法:https : //github.com/shutterstock/changeDPI/blob/master/src/index.js 但是当我把我的图像作为base64imagesplit操作后我有array只有 1 个元素 - 我认为这是正文,所以我没有格式属性(在 63 行)。

有人遇到过这个问题吗?

Tho*_*orf 6

您可以使用该库piexifjs来更改图像的 EXIF 数据。该库仅更改元数据(称为 EXIF),而不更改图像本身。

代码示例

以下代码使用API读取图像的 EXIF 数据,对其进行更改并根据更改后的数据创建新缓冲区。

const piexif = require("piexifjs");

// get the image buffer from puppeteer or from disk
const imageBuffer = /* ... */

// convert buffer to string and load it
const imageString = imageBuffer.toString('binary');
const exif = piexif.load(imageString);

// change resolution
exif['0th'][piexif.ImageIFD.XResolution] = [300,1];
exif['0th'][piexif.ImageIFD.YResolution] = [300,1];

// generate new EXIF data
const newExifDump = piexif.dump(exif);

// generate new image
const newData = piexif.insert(newExifDump, imageString);
const jpgBuffer = new Buffer(newData, "binary");

// write to file or use buffer
// ...
Run Code Online (Sandbox Code Playgroud)

请注意,我自己没有使用过这个库,也没有测试过代码。