Wygenerowałem obraz za pomocą PIL . Jak mogę zapisać go do ciągu w pamięci? Image.save()
Metoda wymaga pliku.
Chciałbym mieć kilka takich obrazków zapisanych w słowniku.
Wygenerowałem obraz za pomocą PIL . Jak mogę zapisać go do ciągu w pamięci? Image.save()
Metoda wymaga pliku.
Chciałbym mieć kilka takich obrazków zapisanych w słowniku.
Możesz użyć BytesIO
klasy, aby uzyskać opakowanie wokół łańcuchów, które zachowuje się jak plik. BytesIO
Obiekt zapewnia ten sam interfejs jako plik, ale zapisuje zawartość tylko w pamięci:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Musisz wyraźnie określić format wyjściowy za pomocą format
parametru, w przeciwnym razie PIL zgłosi błąd podczas próby automatycznego wykrycia go.
Jeśli wczytałeś obraz z pliku, ma on format
parametr zawierający oryginalny format pliku, więc w tym przypadku możesz użyć format=image.format
.
W starszych wersjach Pythona 2 przed wprowadzeniem modułu zamiast io
tego używałbyś StringIO
modułu.
You can use a file object instead of a filename. In this case, you must always specify the format.
Więc jeśli pierwszym argumentem jest obiekt plikowy, musisz przekazać drugi argument, którym jest format (np'PNG'
.).from io import StringIO
image.save(output, format=image.format)
W przypadku Python3 wymagane jest użycie BytesIO:
Czytaj więcej: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
źródło
rozwiązanie czegoś nie zadziałało,
ponieważ w ...
Próbował wykryć format z rozszerzenia w nazwie pliku, które nie istnieje w przypadku StringIO
Możesz ominąć wykrywanie formatu, ustawiając format samodzielnie w parametrze
źródło
save()
może wziąć obiekt podobny do pliku, jak również ścieżkę, więc możesz użyć bufora w pamięci, takiego jakStringIO
:źródło
Z nowoczesnym (od połowy 2017 Python 3.5 i Pillow 4.0):
Wygląda na to, że StringIO nie działa już tak, jak kiedyś. Klasa BytesIO jest właściwym sposobem radzenia sobie z tym. Funkcja save Pillow oczekuje łańcucha jako pierwszego argumentu i, co zaskakujące, nie widzi StringIO jako takiego. Poniższe jest podobne do starszych rozwiązań StringIO, ale z BytesIO na swoim miejscu.
źródło
Kiedy mówisz „Chciałbym mieć pewną liczbę takich obrazów przechowywanych w słowniku”, nie jest jasne, czy jest to struktura w pamięci, czy nie.
Nie musisz tego robić, aby potulny obraz w pamięci. Po prostu zachowaj
image
obiekt w swoim słowniku.Jeśli masz zamiar zapisywać słownik do pliku, możesz przyjrzeć się
im.tostring()
metodzie iImage.fromstring()
funkcjihttp://effbot.org/imagingbook/image.htm
„Format” (.jpeg, .png itp.) Ma znaczenie tylko na dysku podczas wymiany plików. Jeśli nie wymieniasz plików, format nie ma znaczenia.
źródło