Saya telah membuat gambar menggunakan PIL . Bagaimana cara menyimpannya ke string di memori? The Image.save()
Metode membutuhkan sebuah file.
Saya ingin menyimpan beberapa gambar seperti itu di kamus.
Saya telah membuat gambar menggunakan PIL . Bagaimana cara menyimpannya ke string di memori? The Image.save()
Metode membutuhkan sebuah file.
Saya ingin menyimpan beberapa gambar seperti itu di kamus.
Anda bisa menggunakan BytesIO
kelas untuk mendapatkan pembungkus di sekitar string yang berperilaku seperti file. The BytesIO
objek menyediakan antarmuka yang sama sebagai file, tapi menghemat isi hanya dalam memori:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Anda harus secara eksplisit menentukan format keluaran dengan format
parameter, jika tidak PIL akan memunculkan kesalahan saat mencoba mendeteksinya secara otomatis.
Jika Anda memuat gambar dari sebuah file, ia memiliki format
parameter yang berisi format file asli, jadi dalam hal ini Anda dapat menggunakan format=image.format
.
Dalam versi Python 2 lama sebelum pengenalan io
modul, Anda akan menggunakan StringIO
modul sebagai gantinya.
You can use a file object instead of a filename. In this case, you must always specify the format.
Jadi jika argumen pertama adalah objek file, Anda harus meneruskan argumen kedua, yang merupakan formatnya (misalnya'PNG'
).from io import StringIO
image.save(output, format=image.format)
Untuk Python3, diperlukan penggunaan BytesIO:
Baca lebih lanjut: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
sumber
solusi sth tidak berhasil untuk saya
karena di ...
Itu mencoba mendeteksi format dari ekstensi di nama file, yang tidak ada dalam kasus StringIO
Anda dapat melewati deteksi format dengan mengatur format sendiri dalam parameter
sumber
save()
dapat mengambil objek seperti file serta jalur, sehingga Anda dapat menggunakan buffer dalam memori sepertiStringIO
:sumber
Dengan modern (mulai pertengahan 2017 Python 3.5 dan Pillow 4.0):
StringIO sepertinya tidak lagi berfungsi seperti dulu. Kelas BytesIO adalah cara yang tepat untuk menangani ini. Fungsi penyimpanan Pillow mengharapkan string sebagai argumen pertama, dan secara mengejutkan tidak melihat StringIO seperti itu. Berikut ini adalah serupa dengan solusi StringIO yang lebih lama, tetapi dengan BytesIO sebagai gantinya.
sumber
Saat Anda mengatakan "Saya ingin menyimpan sejumlah gambar seperti itu di kamus", tidak jelas apakah ini adalah struktur dalam memori atau bukan.
Anda tidak perlu melakukan semua ini untuk melemahkan gambar dalam memori. Simpan saja
image
objek tersebut di kamus Anda.Jika Anda akan menulis kamus Anda ke sebuah file, Anda mungkin ingin melihat
im.tostring()
metode danImage.fromstring()
fungsinyahttp://effbot.org/imagingbook/image.htm
"Format" (.jpeg, .png, dll.) Hanya penting pada disk saat Anda menukar file. Jika Anda tidak bertukar file, format tidak masalah.
sumber