2017-05-26 13 views
3

2つの画像URLをパラメータとして受け取るフラスコアプリケーションを作成しています。伝統的に、私はこのイメージをサーバのローカルディスクにダウンロードし、私のイメージ処理操作を実行します。私は次のコードを使用してそれらをダウンロードしています。この後ディスクストレージを使用せずにpythonでイメージをロードするには?

urllib.request.urlretrieve(image1url, image_id + '.jpg') 

私が使用して画像を読み込む:

original_image = Image.open(image_id + '.jpg') 

をし、収穫し、いくつかのフィルタを適用するように私の画像処理操作を実行します。

original_crop = original_image.crop((x, y, x + width/3, y + height/3)) 

また、このイメージではImageFilter操作を使用します。これで、このコードはサーバーにデプロイされます。この方法を続けると、サーバーのディスクにイメージをダウンロードして保存し続けます。もちろん、画像処理操作を行った後に画像を削除することも可能です。しかし、1秒間に数百通のコールを受信すると、ある時点で多くのスペースを使用する可能性があります。アプリケーションは、呼び出しを使用してマルチスレッドです

app.run(threaded=true) 

魅力のように動作します。

サーバのディスクストレージを使用せずにイメージをロードする方法があるかどうかを知りたい。したがって、私のサービスのハードディスクスペースの必要性を減らすことができます。

+0

にそれを渡すことができ、一時ファイル内の画像を保存したくない場合は、単にそのファイルパスに基づいてファイルシステム上の画像を見つけることに反対していますあなたがそれを完了したらそれを削除しますか? – JacobIRR

答えて

2

あなたはstreamでURLのコンテンツをラップし、Image.open

import io 
import urllib.request 

from PIL import Image 

# your avatar URL as example 
url = ('https://www.gravatar.com/avatar/3341748e9b07c9854d50799e0e247fa3' 
     '?s=328&d=identicon&response=PG&f=1') 
content = urllib.request.urlopen(url).read() 
original_image = Image.open(io.BytesIO(content)) 
+0

これは美しく見えます!ばかげた質問ですが、いつものように 'original_image'の操作を実行できますか? – user2326079

+0

ofcできます。['Image.Image'](http://pillow.readthedocs.io/ja/3.4.x/reference/Image.html#PIL.Image.Image)オブジェクトがあるのでいつものように –

+0

@ user2326079:でも、自分で試してみて、何かが間違っていたら教えてください。 –

0

既知のリモートロケーションに移動し、必要に応じてそれらをフェッチすることができます。 Amazon S3やBrickFTPのようなホスティングFTPサービスを使用するのは簡単です。 S3は、あなたが使用しているものに対してのみ料金を支払うため、月額料金なしで特に安いです。 Brickは、他のアプリケーションやユーザーにはできるだけシンプルに画像にアクセスしたいが、最低限の月額料金がかかります。

+0

合意。しかし、Python自体に実行時にイメージをロードせずにイメージをロードする方法があるかどうかは疑問でした。たとえば、1つのイメージのバイト配列を取得するなど? – Harry

+0

'pickle'モジュールを使って、任意のPythonオブジェクトをディスクに格納することができます。そうすれば、コンバージョンの結果を保存して、イメージではなくリロードすることができます。 –

関連する問題