在 Node.js 中更改 JPEG 文件 DPI header

Change JPEG file DPI header in Node.js

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

如您所见,它在元数据中设置了 72 DPI,但我想使用带有 300 DPI 的文件。我知道,在数字版中它不会改变任何东西 - 它是用于打印的 属性,但我不想向每个客户解释该文件可以在 300 DPI.[=32= 中打印]

当我使用 Gimp 和 Image > Print Size

我可以更改DPI,然后再次导出图片。现在它在 General Info window.

中有 300 DPI

我尝试在 Node.JS 服务器上进行,但我发现很少有选项可以在 .PNG 图片上更改此 属性,但任何人都在为 .JPEG 文件工作.

我认为最准确的选择是使用此库中的方法 changeDpiDataUrlhttps://github.com/shutterstock/changeDPI/blob/master/src/index.js 但是,当我将我的图像设置为 base64image 时,在 split 操作之后,我得到的 array 只有 1 个元素 - 我认为这是 body,所以我没有具有格式 属性(在 63 行)。

有人body遇到过这个问题吗?

您可以使用库 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
// ...

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

这个解决方案是@thomasdondorf 回答的另一个替代方案。

可以使用 JavasCript 标准图像处理库 sharp by withMetadata 函数轻松设置 resolution/density。

简单示例:

// Set output metadata to 96 DPI
const data = await sharp(input)
  .withMetadata({ density: 96 })
  .toBuffer();

Npm 模块:sharp