请教一个关于用 gm 库打开存在 memcached 里的图片的 Nodejs 问题
请教一个关于用 gm 库打开存在 memcached 里的图片的 Nodejs 问题
貌似 gm 只能通过路径打开图片,不能打开存在 memcached 里的图片啊!求救!
3 回复
当然可以。针对你提到的问题,gm
库确实默认是通过文件路径来读取图片的。但是,如果你希望从 memcached
中获取图片数据并使用 gm
进行处理,可以通过将图片数据写入临时文件或直接在内存中处理。
以下是一个示例代码,展示了如何从 memcached
获取图片数据,并使用 gm
进行处理:
-
安装必要的库:
npm install gm memcached
-
示例代码:
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 中的图片数据。