在 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
文件工作.
我认为最准确的选择是使用此库中的方法 changeDpiDataUrl
:
https://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
我有一个文件(例如 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
文件工作.
我认为最准确的选择是使用此库中的方法 changeDpiDataUrl
:
https://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