ユーザーが画像をアップロードし、PIL を使用してサイズを変更すると、PIL Image objectが取得されます。
PIL Image
データベースに保存する前に、テンプレートでファイルを表示するにはどうすればよいですか? 画像として渡してレンダリングすることさえできますか?
ユーザーが画像をアップロードし、PIL を使用してサイズを変更すると、PIL Image objectが取得されます。
PIL Image
データベースに保存する前に、テンプレートでファイルを表示するにはどうすればよいですか? 画像として渡してレンダリングすることさえできますか?
はいといいえ。
はい、画像を生の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ビューを使用してPILオブジェクトからの画像をPNGファイルとして返しimg
href
、ページの属性でそのビューを参照することです。
限られたブラウザーのセットでは、画像を base64 エンコードしてインライン画像を使用できます。Base64 イメージの埋め込みを参照してください。
すべてのブラウザーで機能するソリューションは、イメージを返すビューを参照するイメージ タグです。
[アップデート]
私が望むのは、ユーザーが元の画像を送信し、別のフォームから画像のキャプションを入力するように求められることだけです (サイズ変更された画像はキャプション フィールドの左側にあります)。次に、ユーザーが「送信」を押すと、画像とキャプションがモデル インスタンスに保存されます。
ええと... を使用する<img src="foo">
と、 foo は常に GET によって取得されます。おそらくそれが機能しない理由です - request.FILES は GET リクエストでは利用できません。firebug または chrome デバッグ ツールバーを開くと、[ネットワーク] タブに、アップロードされた画像を含む POST リクエストが表示され、その後、画像を取得するための GET リクエストが表示されます。
両方のステップの間のどこかに画像を保存する必要があります。
他にどのように保存できますか?一時的であってほしいです。これを行うための本当に簡単な方法があると思いますか、それともそれらのオプションを調べる必要がありますか?
一般的な選択肢はredisとmemcachedです。それらは、有効期限のある巨大な共有 python dict と考えることができます。アバターのように画像が小さい場合は、画像データをセッション変数に保存することもできます。
base64でエンコードされた画像をタグに埋め込むことができます。したがって、PILイメージをbase64に変換してから表示することができます。
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]
次に、次のように表示します。
<img src="data:image/png;base64,' + contents + ' />
出力例を見てください。