簡體   English   中英

如何在由 python matplotlib 生成的 AWS Lambda 函數中保存圖像?

[英]How to save image in AWS Lambda function which is generated by python matplotlib?

我有下面的python代碼。 它通過郵遞員將.wav文件作為輸入。 它在這里作為 base64 字符串接收,然后從 base64 解碼回來。 該代碼進一步處理.wav文件並生成.png圖像。 我必須將其保存在 AWS S3 中。 我在將其保存到 AWS S3 時遇到問題,因為保存在那里的文件沒有打開。 它說photo viewer doesn't support this file format 知道如何做到這一點嗎?

import json
import base64
import boto3
#import scipy.io.wavfile as wav
#import scipy.signal as signal
import numpy as np
from matplotlib import pyplot as plt
from scipy import signal
import shutil
import wavio
import wave
import matplotlib.pylab as plt
from scipy.signal import butter, lfilter
from scipy.io import wavfile
import scipy.signal as sps
from io import BytesIO    

def lambda_handler(event, context):
   s3 = boto3.client("s3")
   
   # retrieving data from event. Which is the wave audio file
   get_file_content_from_postman = event["content"]
   
   # decoding data. Here the wava file is converted back to binary form
   decoded_file_name = base64.b64decode(get_file_content_from_postman)
   
   new_rate = 2000
   
   # Read file
   sample_rate, clip = wavfile.read(BytesIO(decoded_file_name))
   
   # Resample data
   number_of_samples = round(len(clip) * float(new_rate) / sample_rate)
   clip = sps.resample(clip, number_of_samples)
   
   #butter_bandpass_filter is another fuction
   a = butter_bandpass_filter(clip, 20, 400, 2000, order=4)
   
   filtered = 2*((a-min(a))/(max(a)-min(a)))-1
   
   fig = plt.figure(figsize=[1,1])
   ax = fig.add_subplot(212)
   ax.axes.get_xaxis().set_visible(False)
   ax.axes.get_yaxis().set_visible(False)
   ax.set_frame_on(False)
   powerSpectrum, freqenciesFound, time, imageAxis = plt.specgram(filtered, Fs=2000)
   
   #filename is referring to the AWS Lambda /tmp directory
   filename  = '/tmp/' + 'image.png'
   
   plt.savefig(filename, dpi=400, bbox_inches='tight',pad_inches=0)
   
   s3_upload = s3.put_object( Bucket="aaa", Key="filename.png", Body=filename)
   return {
   'statusCode': 200,
   'body': json.dumps("Executed successfully")
   }

您正在使用put_object這意味着 Body不是文件名

  • 正文(字節或可查找的類文件對象)——對象數據。

如果你想繼續使用put_object ,那么它應該是:

with open(filename, 'rb') as file_obj:
   s3_upload = s3.put_object( Bucket="aaa", Key="filename.png", Body=file_obj)

或者使用更直觀的upload_file

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM