Jak poslat obrázek generovaný PIL do prohlížeče?

hlasů
40

Já používám baňku pro mé žádosti. Chtěl bych poslat obrázek (dynamicky generovaného PIL) ke klientovi bez uložení na disk.

Nějaký nápad, jak to udělat?

Položena 24/10/2011 v 15:35
zdroj uživatelem
V jiných jazycích...                            


5 odpovědí

hlasů
16

Za prvé, můžete uložit obraz do tempfile a odstranit místní soubor (pokud máte):

from tempfile import NamedTemporaryFile
from shutil import copyfileobj
from os import remove

tempFileObj = NamedTemporaryFile(mode='w+b',suffix='jpg')
pilImage = open('/tmp/myfile.jpg','rb')
copyfileobj(pilImage,tempFileObj)
pilImage.close()
remove('/tmp/myfile.jpg')
tempFileObj.seek(0,0)

Za druhé, nastavit dočasný soubor k odpovědi (podle tohoto StackOverflow otázka ):

from flask import send_file

@app.route('/path')
def view_method():
    response = send_file(tempFileObj, as_attachment=True, attachment_filename='myfile.jpg')
    return response
Odpovězeno 25/10/2011 v 06:39
zdroj uživatelem

hlasů
7

Také jsem byl zápasí ve stejné situaci. Nakonec jsem zjistil, že její řešení pomocí aplikace WSGI, což je přijatelné pro objekt „make_response“ jako argumentu.

from Flask import make_response

@app.route('/some/url/to/photo')
def local_photo():
    print('executing local_photo...')
    with open('test.jpg', 'rb') as image_file:
        def wsgi_app(environ, start_response):
            start_response('200 OK', [('Content-type', 'image/jpeg')])
            return image_file.read()
        return make_response(wsgi_app)

Prosím nahradit „otevření image“ operace s příslušnými operacemi PIL.

Odpovězeno 16/11/2011 v 01:07
zdroj uživatelem

hlasů
7

Ukazuje se, že nádoba poskytuje řešení (RTM pro sebe!):

from flask import abort, send_file
try:
    return send_file(image_file)
except:
    abort(404)
Odpovězeno 08/12/2011 v 19:50
zdroj uživatelem

hlasů
126

Zde je verze bez jakékoli soubory temp a podobně (viz zde ):

def serve_pil_image(pil_img):
    img_io = StringIO()
    pil_img.save(img_io, 'JPEG', quality=70)
    img_io.seek(0)
    return send_file(img_io, mimetype='image/jpeg')

Chcete-li použít v kódu prostě dělat

@app.route('some/route/')
def serve_img():
    img = Image.new('RGB', ...)
    return serve_pil_image(img)
Odpovězeno 16/04/2012 v 09:11
zdroj uživatelem

hlasů
0

Mr. Mr. přece opravdu vynikající práci. Musel jsem použít BytesIO () namísto StringIO ().

def serve_pil_image(pil_img):
    img_io = BytesIO()
    pil_img.save(img_io, 'JPEG', quality=70)
    img_io.seek(0)
    return send_file(img_io, mimetype='image/jpeg')
Odpovězeno 23/08/2018 v 13:16
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more