15

ユーザーがイメージをアップロードし、PILを使用してサイズを変更すると、PIL Image objectが表示されます。PIL Imageオブジェクトをテンプレートに表示するにはどうすればよいですか?

PIL Imageファイルをテンプレートに保存してからデータベースに保存するにはどうすればよいですか?イメージとして渡されレンダリングされることもできますか?

+1

Djangoプロセスから直接画像を提供してもよろしいですか?それは貴重なメモリを消費するだけでなく、スレッドやプロセスを束ねることになります –

+1

(確かな証拠はありません)イメージを保存してフロントエンドのWebサーバーにバイトシャッフルをさせる方がはるかに良いと思います。 X-Sendfile(Apache)またはX-Accel-Redirect(Nginx)を見てください。 –

答えて

13

限られたブラウザセットでは、画像をbase64でエンコードしてインライン画像を使用できます。 Embedding Base64 Imagesを参照してください。

すべてのブラウザで機能する解決策は、view that returns the imageを参照する画像タグです。

[更新]

Iが望むすべては、元画像を送信するユーザのためのものであり、その後の左側にリサイズ画像と(画像のキャプション入力に別の形態によって促されキャプションフィールド)。次に、ユーザーが画像を「送信」し、キャプションがモデルインスタンスに保存されます。それが動作しない理由を<img src="foo">を使用する場合はまあ...、fooが常にGETによって取得され

は、おそらくそれは - request.FILESは、GET要求で使用できなくなります。 FirebugまたはChromeデバッグツールバーを開くと、ネットワークタブに、アップロードされた画像とそれに続いて画像を取得するGETリクエストが含まれたPOSTリクエストが表示されます。

両方のステップの間にイメージを保存する必要があります。

他にどのように保存できますか?一時的であることが大好きです。これを行うには本当に簡単な方法があると思いますか、それともそれらのオプションを調べるべきですか?

人気のある選択肢は、redismemcachedです。あなたはそれらを有効期限付きの巨大な共有python dictと考えることができます。アバターのように画像が小さい場合は、画像データをセッション変数に保存することもできます。

+0

イメージタグからビューを参照するにはどうすればよいですか? – sgarza62

+1

'the same url from urls.py, got it? ' –

+0

これまでのお役に立てていただきありがとうございます、遅れてお詫び申し上げます...私はこれを自分のコードで動作させようとしています。 'Image'を' HttpResponse'オブジェクトに保存することができました(ありがとう!)が、テンプレートのイメージタグから動作させるのに問題があります。たぶん私はURLに特定のパラメータを渡していない、わからない。 – sgarza62

6

base64でエンコードされた画像をタグに埋め込むことができます。したがって、PILイメージをbase64に変換して表示することができます。 example output

<img src="data:image/png;base64,' + contents + ' /> 

ルック:

from PIL import Image 
import StringIO 

x = Image.new('RGB',(400,400)) 
output = StringIO.StringIO() 
x.save(output, "PNG") 
contents = output.getvalue().encode("base64") 
output.close() 
contents = contents.split('\n')[0] 

は、その後に表示されます。

+0

私はこの行を削除した後、私のために働いた:contents = contents.split( '\ n')[0] – Yerke

14

はい、いいえ。

はい、生のBase64データとして画像を配置できます。これをテストするために使用できる小さなスクリプトがあります:

import Image 
import base64 
import StringIO 
output = StringIO.StringIO() 
im = Image.open("test.png") # Your image here! 
im.save(output, format='PNG') 
output.seek(0) 
output_s = output.read() 
b64 = base64.b64encode(output_s) 
open("test.html","w+").write('<img src="data:image/png;base64,{0}"/>'.format(b64)) 

しかし、これは本当に悪い考えです。複数のサムネイルを使用すると、1つのHTMLページが10MB以上になることがあります。

本当にすべきことは、別々のDjangoビューを使用して、PNGオブジェクトからPNGファイルとしてイメージを返し、ページのimghrefという属性のビューを参照することです。

関連する問題