如何使用 Node.js 读取/写入图像?

Posted

技术标签:

【中文标题】如何使用 Node.js 读取/写入图像?【英文标题】:How can I Read/Write Images with Node.js? 【发布时间】:2021-03-29 14:20:27 【问题描述】:

我对 JS 很陌生,我正在开发一个 Discord 机器人,它使用 Discord.js,它使用 COCO-SSD JS 并要求我从我的电脑读取/写入文件。

我知道这可能不是最好的主意,但当我到达时我会越过那座桥。

现在,我需要一种方法来在我的电脑上读写图像。

注意:文件需要从 URL 写入我的计算机。但是,如果有任何方法可以避免在我的电脑上下载图像,我也将不胜感激。

我正在使用“fs”、“https”和“fetch”。

我的方法的问题是我从图像中接收到的像素是NULL,所以我不能用它们做很多事情。

这是我当前的代码:

抱歉,格式很糟糕,英语不是我的母语,现在是凌晨 2 点。

const fetchUrl = require("fetch").fetchUrl;
const https = require('https');

function saveImageToDisk(url,path)

    var fullUrl = url;
    var localPath = fs.createWriteStream(path);
    var request = https.get(fullUrl,function(response)  console.log(response)
         response.pipe(localPath)
        );
    


saveImageToDisk("https://post.greatist.com/wp-content/uploads/sites/3/2020/02/322868_1100-1100x628.jpg","./images/" + Date.now + ".png");

const img = fs.readFile("./images/" + Date.now + ".png", function(response)console.log(response));

【问题讨论】:

【参考方案1】:

我知道如何使用模块node-fetch 来实现这样的事情,所以我将在下面提供一个示例。我不知道你的 discord 机器人到底需要这个功能做什么,但下面的代码将能够正确地将图像 url 保存到指定路径。

const fetch = require("node-fetch");
const fs = require("fs");

function saveImageToDisk(url, path)

    fetch(url)
    .then(res => res.buffer())
    .then(buffer => fs.writeFileSync(path, buffer));
    

我已经测试了上面的示例代码,它运行良好。至于其余的代码,我确实有一些修复:

const filepath = "./images/" + Date.now() + ".png";
const imageurl = "https://post.greatist.com/wp-content/uploads/sites/3/2020/02/322868_1100-1100x628.jpg";

saveImageToDisk(imageurl, filepath);
const img = fs.readFile(filepath, (err, response) =>
    if (err) throw err;

    console.log(response);
);

具体来说,主要问题是:

Date.now 是一个函数(因此应该是 Date.now()) 您应该只创建一次文件路径字符串,而不是创建两次(为了准确和简单) fs.readFile 的回调实际上将其错误对象作为第一个参数(因此您实际上将错误或缺少错误记录到控制台而不是响应/文件本身)。

完全有可能仅仅是这些问题导致您的代码无法工作,而您原来的 saveImageToDisk() 工作正常。请注意,无论如何,这些问题肯定会导致您阅读文件的方式出现问题。

【讨论】:

以上是关于如何使用 Node.js 读取/写入图像?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js写入YAML文件

javascript [base64 string to image file]如何在node.js#Node.js中写入图像

Node.js - 如何将流转换为字符串

Node 读取 + 写入 + 路径问题

Node.js学习之路05——fs文件系统之文件的写入和读取

如何使用苹果 API 读取或写入 gif 图像的颜色图?