最近卒業設計のテーマを選ぶ際、以前のプロジェクトと画像処理に関連するものを選びました。サーバーレスは最近数年間で人気が出始めたサービスの一つですので、このテーマを選びました。ゼロからサーバーレスを研究することにしました。(後書き:出題した先生は後で私のテーマのボリュームが小さすぎると考えたので、テーマを拡大しました。今は身分証明書の認識と処理などを研究することになりました QwQ)
参考記事:【AWS 征文】使用 AWS Serverless 架构动态调整图片大小
開発環境#
Python 3.6(腾讯云では現在 Python 3 のみサポートされています)、腾讯云 SCF
手順#
環境の設定#
腾讯云の「Serverless Framework」で新しい Flask フレームワークを作成し、名前と地域を適当に入力します。以下の画像を参照してください:
デプロイが完了したら、「开发部署」で「更新代码」をクリックします:
その後、ローカル開発でプロジェクトをダウンロードします:
(実際には、「云函数 - 函数服务 - 选择新建的那个函数 - 函数代码」でコードを変更または新しいファイルを追加することができますが、上記の方法はローカルでのデバッグと変更が容易です。それぞれの方法には利点と欠点があります)
これで、基本的なフレームワークが完成しました。
機能の開発#
現在、関数は私のクラウドストレージに保存された画像を処理して返すことができます。これは呼び出しとパラメータの予約のためです。Flask アプリの固有の形式を利用し、screen_width(画面の幅)と pic_url(画像のパス)の 2 つのパラメータを予約しました。
呼び出し時に、幅を指定すると対応する幅に等しい比率で縮小された画像が返されます:
指定しない場合は元の画像が返されます:
Flask のコードの一部は以下の通りです:
@app.route("/pic/<pic_url>")
def source_picture(pic_url):
img_src = "存储空间地址" + pic_url
# 画像を読み込んで再度出力することで、画像のサイズが少し小さくなります
response = make_response(picture.image_output(picture.image_input(img_src)))
# responseのheadersオブジェクトを設定する
response.headers['Content-Type'] = 'image/jpeg'
return response
@app.route("/pic/<screen_width>/<pic_url>")
def picture_url_get(screen_width, pic_url):
# データ型のエラーを回避するため
width = int(screen_width)
img_src = "存储空间地址" + pic_url
# responseオブジェクトを作成する
response = make_response(picture.image_output(picture.image_resize(width, img_src)))
# responseのheadersオブジェクトを設定する
response.headers['Content-Type'] = 'image/jpeg'
return response
make_response を使用して response オブジェクトを作成し、画像をラップしてブラウザに返すことで、画像を保存してからアクセスする手間を省きます。
画像処理部分について:
image_input 関数は、URL から画像を取得し、response オブジェクトにパッケージ化し、その後、PIL の Image ライブラリを使用して開きます。response オブジェクトは BytesIO で処理する必要があります:
def image_input(img_src):
response = requests.get(img_src, headers=headers)
image = Image.open(BytesIO(response.content))
return image
image_output 関数は、BytesIO を使用して画像をバイトストリームに変換し、保存して返します:
def image_output(image):
img_byte = BytesIO()
image.save(img_byte, format="JPEG")
img_byte = img_byte.getvalue()
return img_byte
image_resize 関数は、Image の resize メソッドを使用して画像を等比で縮小します。Image.ANTIALIAS は高解像度のパラメータです:
def image_resize(width, img_src):
image = image_input(img_src)
resize = image.resize((width, int(image.size[1] * width / image.size[0])), Image.ANTIALIAS)
return resize
問題と解決策#
npm のインストール中に rollbackFailedOptional: verb npm-session の問題が発生する#
npm install -g cnpm --registry=https://registry.npm.taobao.org
コマンドを使用して、公式のソースを淘宝のソースに置き換え、cnpm を使用してインストールします。
関連するサードパーティライブラリのインストールエラー#
阿里のミラーを使用することができます:https://mirrors.aliyun.com/pypi/simple/ 同時に、serverless.yml
ファイルの pip の関連コードをhook: pip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt -t ./
に変更します。
Pillow の import エラー#
原因は、ローカル環境とクラウド環境が異なるためであり、Python 3.6.0 のバージョンであっても、Windows と Linux のサードパーティライブラリには微妙な違いがあります。解決策は、コードをアップロードしてから、クラウド環境でpip install -i https://mirrors.aliyun.com/pypi/simple/ -r requirements.txt -t ./
を実行して依存関係をダウンロードすることです。
まとめ#
このプロセス全体で、サーバーレスサービスのデプロイ手順を大まかに把握し、開発とデプロイが同じオペレーティングシステムでない場合、コードをアップロードしてからクラウド環境でデプロイすることをお勧めします。これにより、実行時のエラーが発生しないようになります。
画像サイズの変更は、その一例にすぎません。理論的には、多くのアプリケーションがサーバーレス環境で実行され、結果が得られるでしょう。例えば、ショートリンク、画像認識、テキスト認識などです。将来的には、サーバーレスの応用はますます広がるでしょう。