2017-05-03 12 views
0
私はトリミングした画像は、私のFirebaseストレージにアップロードされます際に複数のサイズをリサイズするFirebaseのためのクラウド機能を使用し始めました

にサイズを変更します。私はFirebaseのサンプルコードを使って私を始めました。 ImageMagickコマンドの使用。しかし、私は作物を働かせていません。クラウド機能:クロップ画像>複数のサイズ

Wordpressと同じように機能を得ることが私の目標です。画像をアップロードするx。固定比率の作物を作ってください。 3サイズにリサイズ。

私が今持っているコードは、中規模および大規模な画像をリサイズして、私の記憶装置にそれらをアップロードします。作物の仕組みを理解するには誰もがアプローチしていますか?これは、これまでの私のコードです

'use strict'; 

const functions = require(`firebase-functions`); 
const mkdirp = require(`mkdirp-promise`); 
const gcs = require(`@google-cloud/storage`)(); 
const spawn = require(`child-process-promise`).spawn; 
const LOCAL_TMP_FOLDER = `/tmp/`; 

// Thumbnail prefix added to file names. 
const THUMB_PREFIX_LARGE = `large_`; 
const THUMB_PREFIX_MEDIUM = `medium_`; 

/** 
* When an image is uploaded in the Storage bucket We generate a thumbnail automatically using 
* ImageMagick. 
*/ 
exports.generateThumbnail = functions.storage.object().onChange(event => { 
    const filePath = event.data.name; 
    const filePathSplit = filePath.split(`/`); 
    const fileName = filePathSplit.pop(); 
    const fileDir = filePathSplit.join(`/`) + (filePathSplit.length > 0 ? `/` : ``); 

    const thumbFilePathLarge = `${fileDir}${THUMB_PREFIX_LARGE}${fileName}`; 
    const thumbFilePathMedium = `${fileDir}${THUMB_PREFIX_MEDIUM}${fileName}`; 

    const tempLocalDir = `${LOCAL_TMP_FOLDER}${fileDir}`; 
    const tempLocalFile = `${tempLocalDir}${fileName}`; 

    const tempLocalThumbFileLarge = `${LOCAL_TMP_FOLDER}${thumbFilePathLarge}`; 
    const tempLocalThumbFileMedium = `${LOCAL_TMP_FOLDER}${thumbFilePathMedium}`; 

    // Exit if this is triggered on a file that is not an image. 
    if (!event.data.contentType.startsWith(`image/`)) { 
    console.log(`This is not an image.`); 
    return; 
    } 

    // Exit if the image is already a thumbnail. 
    if (fileName.startsWith(THUMB_PREFIX_LARGE) || fileName.startsWith(THUMB_PREFIX_MEDIUM)) { 
    console.log(`Already a Thumbnail.`); 
    return; 
    } 

    // Exit if this is a move or deletion event. 
    if (event.data.resourceState === `not_exists`) { 
    console.log(`This is a deletion event.`); 
    return; 
    } 

    // Create the temp directory where the storage file will be downloaded. 
    return mkdirp(tempLocalDir).then(() => { 
    // Download file from bucket. 
    const bucket = gcs.bucket(event.data.bucket); 
    return bucket.file(filePath).download({ 
     destination: tempLocalFile 
    }).then(() => { 
     console.log(`The file has been downloaded to`, tempLocalFile); 
     // Generate a LARGE thumbnail using ImageMagick. 
     return spawn(`convert`, [tempLocalFile, `-thumbnail`, `1200x800`, tempLocalThumbFileLarge]).then(() => { 
     console.log(`Thumbnail created at`, tempLocalThumbFileLarge); 
     // Uploading the large Thumbnail. 
     return bucket.upload(tempLocalThumbFileLarge, { 
      destination: thumbFilePathLarge 
     }).then(() => { 
      console.log(`Thumbnail uploaded to Storage at`, thumbFilePathLarge); 
     }).then(() => { 
      console.log(`The file has been downloaded to`, tempLocalFile); 
      // Generate a MEDIUM thumbnail using ImageMagick. 
      return spawn(`convert`, [tempLocalFile, `-thumbnail`, `600x400`, tempLocalThumbFileMedium]).then(() => { 
      console.log(`Thumbnail created at`, tempLocalThumbFileMedium); 
      // Uploading the medium Thumbnail. 
      return bucket.upload(tempLocalThumbFileMedium, { 
       destination: thumbFilePathMedium 
      }).then(() => { 
       console.log(`Thumbnail uploaded to Storage at`, thumbFilePathMedium); 
      }); 
      }); 
     }); 
     }); 
    }); 
    }); 
}); 

答えて

2

現時点で-thumbnail使用しているのと同じ方法を-crop使用することができるはずですこの。

return mkdirp(tempLocalDir).then(() => { 
    const bucket = gcs.bucket(event.data.bucket); 
    return bucket.file(filePath).download({ 
     destination: tempLocalFile 
    }).then(() => { 
     return spawn(`convert`, [`-define`, `jpeg:size=1200x800`, tempLocalFile, `-thumbnail`, `1200x800^`, `-gravity`, `center`, `-extent`, `1200x800`, tempLocalThumbFileLarge]).then(() => { 
     return bucket.upload(tempLocalThumbFileLarge, { 
      destination: thumbFilePathLarge 
     }).then(() => { 
      return spawn(`convert`, [`-define`, `jpeg:size=600x400`, tempLocalFile, `-thumbnail`, `600x400^`, `-gravity`, `center`, `-extent`, `600x400`, tempLocalThumbFileMedium]).then(() => { 
      return bucket.upload(tempLocalThumbFileMedium, { 
       destination: thumbFilePathMedium 
      }); 
      }); 
     }); 
     }); 
    }); 
    });