3

我利用AWS Lambda example script來使用Node.js和ImageMagick/GraphicsMagick庫調整JPG圖像的大小。我想做一個簡單的修改,在調整大小後將圖像從JPG轉換爲WebP格式。 (GraphicsMagick不支持WebP,但ImageMagick支持,它在腳本中被分類)。根據緩衝區部分here(將JPG轉換爲PNG)中的示例,可以使用以下代碼塊。使用Node.js中的GraphicsMagick/ImageMagick包在AWS Lambda中將JPG轉換爲WebP

gm('img.jpg') 
.resize(100, 100) 
.toBuffer('PNG',function (err, buffer) { 
    if (err) return handle(err); 
    console.log('done!'); 
}) 

當我在我的本地Node.js安裝(用WebP替換PNG)中運行該代碼塊時,它可以工作。

當我修改變換AWS LAMBDA example script的函數(見下文),但是,並執行它在AWS,收到以下「流產生空緩衝器」錯誤:

Unable to resize mybucket/104A0378.jpg and upload to mybucket_resized/resized-104A0378.jpg due to an error: Error: Stream yields empty buffer 

改性變換()函數(參見與「WEBP」線):

function tranform(response, next) { 
      gm(response.Body).size(function(err, size) { 
       // Infer the scaling factor to avoid stretching the image unnaturally. 
       var scalingFactor = Math.min(
        MAX_WIDTH/size.width, 
        MAX_HEIGHT/size.height 
       ); 
       var width = scalingFactor * size.width; 
       var height = scalingFactor * size.height; 

       // Transform the image buffer in memory. 
       this.resize(width, height) 
        .toBuffer('webp', function(err, buffer) { 
         if (err) { 
          next(err); 
         } else { 
          next(null, response.ContentType, buffer); 
         } 
        }); 
      }); 
     } 

我意識到response.ContentType仍然等於圖像/ JPEG,但我不認爲這是在這裏發揮作用。另外,我意識到我應該在調整大小之前轉換爲WebP,但......嬰兒步驟!

任何想法?

回答

0

ImageMagick必須具體編譯與WebP支持。我的實驗似乎表明,AWS Lambda上的ImageMagick未使用WEBP編譯:(

2

在使用gm和AWS lambda的其他操作中,我遇到了同樣的錯誤「Stream yield empty buffer」。

原來,lambda容器內存不足。

我測試了這個假設,使用一個不斷拋出錯誤的大圖像。

當我增加了lambda函數的內存時,一切都很完美。

希望這可以幫助你,以及