请教一个关于用 gm 库打开存在 memcached 里的图片的 Nodejs 问题

请教一个关于用 gm 库打开存在 memcached 里的图片的 Nodejs 问题

貌似 gm 只能通过路径打开图片,不能打开存在 memcached 里的图片啊!求救!

3 回复

当然可以。针对你提到的问题,gm 库确实默认是通过文件路径来读取图片的。但是,如果你希望从 memcached 中获取图片数据并使用 gm 进行处理,可以通过将图片数据写入临时文件或直接在内存中处理。

以下是一个示例代码,展示了如何从 memcached 获取图片数据,并使用 gm 进行处理:

  1. 安装必要的库

    npm install gm memcached
    
  2. 示例代码

    const gm = require('gm').subClass({imageMagick: true});
    const Memcached = require('memcached');
    const fs = require('fs');
    const path = require('path');
    
    // 创建 memcached 客户端
    const memcached = new Memcached('localhost:11211');
    
    // 从 memcached 获取图片数据
    async function getImageFromMemcached(key) {
      return new Promise((resolve, reject) => {
        memcached.get(key, (err, data) => {
          if (err) {
            reject(err);
          } else {
            resolve(data);
          }
        });
      });
    }
    
    // 使用 gm 处理图片
    async function processImageFromMemcached(key) {
      try {
        // 从 memcached 获取图片数据
        const imageData = await getImageFromMemcached(key);
    
        // 将图片数据写入临时文件(可选)
        const tempFilePath = path.join(__dirname, 'temp-image.jpg');
        fs.writeFileSync(tempFilePath, imageData);
    
        // 使用 gm 处理图片
        gm(tempFilePath)
          .resize(300, 300) // 调整图片大小
          .write('output.jpg', (err) => {
            if (err) {
              console.error('Error writing image:', err);
            } else {
              console.log('Image processed and saved to output.jpg');
            }
          });
    
        // 如果不需要临时文件,可以直接在内存中处理
        // 注意:这需要 ImageMagick 支持从 buffer 加载图片
        // gm(imageData, 'jpg')
        //   .resize(300, 300)
        //   .toBuffer('jpg', (err, buffer) => {
        //     if (err) {
        //       console.error('Error processing image:', err);
        //     } else {
        //       fs.writeFileSync('output.jpg', buffer);
        //       console.log('Image processed and saved to output.jpg');
        //     }
        //   });
    
      } catch (error) {
        console.error('Error processing image:', error);
      }
    }
    
    // 调用函数
    processImageFromMemcached('your-image-key');
    

在这个示例中,我们首先从 memcached 获取图片数据,然后将其保存到一个临时文件中,最后使用 gm 对该文件进行处理。你也可以选择不使用临时文件,而是直接在内存中处理图片数据,但这需要 gm 支持从 Buffer 加载图片(确保你的 ImageMagick 版本支持此功能)。


npm gm 支持 file path, stream and buffer

在 Node.js 中使用 gm 库打开存储在 Memcached 中的图片确实需要一些额外的工作,因为 gm 通常期望的是文件路径。但是,你可以通过将 Memcached 中的数据流化,并将其传递给 gm 处理。

首先确保你安装了所需的依赖包:

npm install gm memcached

然后可以使用以下示例代码来实现这一功能:

const gm = require('gm').subClass({ imageMagick: true });
const Memcached = require('memcached');
const memcached = new Memcached('localhost:11211');

function getImageFromMemcached(key) {
    return new Promise((resolve, reject) => {
        memcached.get(key, (err, data) => {
            if (err) return reject(err);
            resolve(data);
        });
    });
}

async function processImageFromMemcached(key) {
    try {
        const imageData = await getImageFromMemcached(key);

        // 将 Buffer 转换为 Stream
        const imageStream = require('stream').Readable.from([imageData]);

        // 使用 gm 打开数据流
        gm(imageStream, 'memcachedImage.png')
            .resize(200, 200)
            .write('output.png', (err) => {
                if (err) throw err;
                console.log('Image processed and saved successfully!');
            });
    } catch (error) {
        console.error('Error:', error.message);
    }
}

// 调用函数处理图片,假设 key 是 'my-image-key'
processImageFromMemcached('my-image-key');

解释

  • 首先,我们定义了一个 getImageFromMemcached 函数来从 Memcached 获取图片数据。
  • 然后,我们定义了 processImageFromMemcached 函数,它会获取 Memcached 中的图片数据,并将其转换为可读流。
  • 使用 gm 库以数据流形式打开图片,并进行相应的处理(本例中是调整大小),最后保存处理后的图片到磁盘。

通过这种方式,你可以利用 gm 库处理存储在 Memcached 中的图片数据。

回到顶部