PIL kullanarak bir görüntü oluşturdum . Bunu bellekteki bir dizeye nasıl kaydedebilirim? Image.save()
Yöntem dosyası gerektirir.
Sözlüğe kaydedilmiş bu tür birkaç görüntünün olmasını istiyorum.
Yanıtlar:
BytesIO
Dosya gibi davranan dizelerin etrafına bir sarmalayıcı almak için sınıfı kullanabilirsiniz . BytesIO
Nesne dosya ile aynı arayüz sağlar, ama sadece bellekte içeriğini kaydeder:
import io
with io.BytesIO() as output:
image.save(output, format="GIF")
contents = output.getvalue()
Çıktı formatını format
parametre ile açıkça belirtmelisiniz , aksi takdirde PIL onu otomatik olarak algılamaya çalışırken bir hata verecektir.
Görüntüyü bir dosyadan yüklediyseniz format
, orijinal dosya biçimini içeren bir parametresi vardır, bu durumda kullanabilirsiniz format=image.format
.
Eski Python 2 sürümlerinde, io
modülün tanıtılmasından önce StringIO
bunun yerine modülü kullanırdınız.
You can use a file object instead of a filename. In this case, you must always specify the format.
Yani, eğer ilk argüman bir dosya nesnesiyse, ikinci argümanı, format olan (ör.'PNG'
).
from io import StringIO
image.save(output, format=image.format)
Python3 için BytesIO kullanmanız gerekir:
from io import BytesIO
from PIL import Image, ImageDraw
image = Image.new("RGB", (300, 50))
draw = ImageDraw.Draw(image)
draw.text((0, 0), "This text is drawn on image")
byte_io = BytesIO()
image.save(byte_io, 'PNG')
Daha fazlasını okuyun: http://fadeit.dk/blog/post/python3-flask-pil-in-memory-image
sth'nin çözümü benim için işe yaramadı
çünkü ...
Imaging / PIL / Image.pyc line 1423 -> KeyError (dahili) # bilinmeyen uzantı yükselt
StringIO durumunda bulunmayan dosya adındaki uzantıdan biçimi tespit etmeye çalışıyordu
Biçimi bir parametrede kendiniz ayarlayarak biçim algılamasını atlayabilirsiniz.
import StringIO
output = StringIO.StringIO()
format = 'PNG' # or 'JPEG' or whatever you want
image.save(output, format)
contents = output.getvalue()
output.close()
save()
dosya benzeri bir nesnenin yanı sıra bir yol alabilir, böylece a gibi bir bellek içi arabelleği kullanabilirsiniz StringIO
:
buf = StringIO.StringIO()
im.save(buf, format='JPEG')
jpeg = buf.getvalue()
Modern ile (2017 ortası Python 3.5 ve Pillow 4.0):
StringIO artık eskisi gibi çalışmıyor. BytesIO sınıfı bunun üstesinden gelmenin uygun yoludur. Pillow'un kaydetme işlevi, ilk argüman olarak bir dizge bekliyor ve şaşırtıcı bir şekilde StringIO'yu böyle görmüyor. Aşağıdakiler eski StringIO çözümlerine benzer, ancak yerine BytesIO vardır.
from io import BytesIO
from PIL import Image
image = Image.open("a_file.png")
faux_file = BytesIO()
image.save(faux_file, 'png')
"Sözlüğe bu tür resimlerin kaydedilmesini istiyorum" dediğinizde, bunun bir bellek içi yapı olup olmadığı net değil.
Hafızadaki bir görüntüyü uyandırmak için bunların hiçbirini yapmanıza gerek yok. Sadece image
nesneyi sözlüğünüzde tutun .
Sözlüğünüzü bir dosyaya yazacaksanız, im.tostring()
yönteme ve Image.fromstring()
işleve bakmak isteyebilirsiniz.
http://effbot.org/imagingbook/image.htm
im.tostring () => dize
Standart "ham" kodlayıcıyı kullanarak piksel verilerini içeren bir dize döndürür.
Image.fromstring (mod, boyut, veri) => resim
Standart "ham" kod çözücüyü kullanarak bir dizedeki piksel verilerinden bir görüntü belleği oluşturur.
"Biçim" (.jpeg, .png, vb.), Yalnızca dosyaları değiştirirken diskte önemlidir. Dosyaları değiş tokuş etmiyorsanız, formatın önemi yoktur.