2013-01-15 16 views
15

Se un utente carica un'immagine e la ridimensiono utilizzando il PIL, ottengo uno PIL Image object.Come visualizzare un oggetto Immagine PIL in un modello?

Come visualizzare un file PIL Image in un modello, prima che sia stato salvato nel database? Può anche essere passato come un'immagine e reso?

+1

Sei sicuro di voler servire l'immagine direttamente dal tuo processo Django?Non solo consumerà memoria preziosa, ma vincolerà anche un thread o processo –

+1

(Senza alcuna prova concreta) Penso che tu stia molto meglio salvando l'immagine e lasciando che il server Web front-end faccia lo shuffling byte per te. Dai un'occhiata a X-Sendfile (Apache) o X-Accel-Redirect (Nginx). –

risposta

13

Per un numero limitato di browser, è possibile codificare in base64 l'immagine e utilizzare le immagini in linea. Vedi Embedding Base64 Images.

Una soluzione che funziona per tutti i browser è un tag immagine che fa riferimento a view that returns the image.

[update]

Tutto quello che voglio è per l'utente di presentare l'immagine originale, e quindi viene richiesto da un altro modulo per inserire una didascalia per l'immagine (con l'immagine ridimensionata alla sinistra del campo didascalia). Quindi, quando l'utente fa clic su "invia" l'immagine e la didascalia viene salvata in un'istanza del modello.

Beh ... Quando si utilizza <img src="foo">, foo è sempre recuperato da un GET, forse è per questo che non funziona - request.FILES non saranno disponibili in una richiesta GET. Se apri firebug o la barra degli strumenti di debug di Chrome, nella scheda di rete, vedrai la richiesta POST con l'immagine caricata e poi una richiesta GET per recuperare l'immagine.

È necessario salvare l'immagine da qualche parte tra i due gradini.

in quale altro modo è possibile salvarlo? Mi piacerebbe che fosse temporaneo. Pensi che ci sia un modo davvero semplice per fare questo, o dovrei dare un'occhiata a queste opzioni?

Le scelte più frequenti sono redis e memcached. Puoi pensare a loro come un gigantesco pitone condiviso dettato con una data di scadenza. Se le immagini sono piccole, come un avatar, puoi anche salvare i dati dell'immagine in una variabile di sessione.

+0

Come faccio a fare riferimento a una vista da un tag immagine? – sgarza62

+1

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

+0

Grazie per il tuo aiuto finora, mi scuso per il ritardo ... Ho cercato di farlo funzionare con il mio codice. Sono stato in grado di salvare l'immagine nell'oggetto 'HttpResponse' (grazie!), Ma ho difficoltà a farlo funzionare dal tag immagine nel modello. Forse non sto passando un determinato parametro nell'URL, non ne sono sicuro. – sgarza62

6

È possibile incorporare le immagini codificate in base 64 in un tag. Quindi è possibile convertire l'immagine PIL in base64 e quindi visualizzarla.

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] 

mostrano Poi, con:

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

sguardo a un example output.

+0

Questo ha funzionato per me dopo aver rimosso questa riga: contents = contents.split ('\ n') [0] – Yerke

14

Sì e no.

Sì, è possibile inserire le immagini come dati Base64 grezzi. Ecco un piccolo script che puoi usare per testare questo:

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)) 

Tuttavia, questa è una pessima idea. Con più miniature, la tua singola pagina HTML potrebbe essere di 10 MB +.

Quello che dovresti fare è usare una vista Django separata per restituire le immagini dagli oggetti PIL come file PNG e quindi fare riferimento a quella vista negli attributi imghref sulla tua pagina.

Problemi correlati