用于Firebase的云功能,用于上传图像和调整大小以适应新宽度

时间:2017-05-29 21:12:08

标签: firebase imagemagick firebase-storage google-cloud-functions

我想利用Cloud Functions for Firebase在上传时调整图片大小并覆盖原始图片,因此每次上传只有一个图片。

此外,我不想创建具有指定宽度和高度的图像,而是希望ImageMagick根据给定的宽度调整大小,例如800px。

我已经查看了Firebase ImageMagick示例,以便在上传时创建缩略图作为开始,但我看不到如何修改它以满足此需求。我真的很感激如何实现这一目标。

编辑:以下是我在Firebase示例中使用的代码(https://github.com/firebase/functions-samples/blob/master/quickstarts/thumbnails/functions/index.js

// Download file from bucket.
const bucket = gcs.bucket(fileBucket);
const tempFilePath = `/tmp/${fileName}`;
return bucket.file(filePath).download({
  destination: tempFilePath
}).then(() => {
  console.log('Image downloaded locally to', tempFilePath);
  // Generate a thumbnail using ImageMagick.
  return spawn('convert', [tempFilePath, '-thumbnail', '200x200>', tempFilePath]).then(() => {
    console.log('Thumbnail created at', tempFilePath);
    // We add a 'thumb_' prefix to thumbnails file name. That's where we'll upload the thumbnail.
    const thumbFilePath = filePath.replace(/(\/)?([^\/]*)$/, '$1thumb_$2');
    // Uploading the thumbnail.
    return bucket.upload(tempFilePath, {
      destination: thumbFilePath
    });
  });
});

2 个答案:

答案 0 :(得分:2)

当您使用缩略图覆盖原始文件路径时,可以使用自定义元数据而不是“thumb_”前缀来避免函数循环:

const filePath = event.data.name
const metadata = event.data.metadata

if (metadata.isThumb) {
    console.log('Exiting: Already a thumbnail')
    return
}

您只需在spawn完成大小调整后设置它:

    return spawn(/* ... */)
}).then(_ => {
    metadata.isThumb = true               // We add custom metadata
    const options = {
        destination: filePath,            // Destination is the same as original
        metadata: { metadata: metadata }
    }
    // Overwrite the original path
    return bucket.upload(/* localThumb */, options)
})

答案 1 :(得分:0)

在imagemagick中,你可以通过

完成
convert inputimage -resize 800x outputimage

没有指定高度且只有宽度800和“x”,它会将宽度转换为800并使高度达到预设的宽高比。

抱歉,我不知道Firebase。