PIL ile PNG görüntüsü dizgeye nasıl yazılır?


100

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:


195

BytesIODosya gibi davranan dizelerin etrafına bir sarmalayıcı almak için sınıfı kullanabilirsiniz . BytesIONesne 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ı formatparametre 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, iomodülün tanıtılmasından önce StringIObunun yerine modülü kullanırdınız.


1
Evet! Bu tam olarak aradığım şeydi. Python, string, okuyucu, yazar, tamponun her kombinasyonunu Google'da araştırdım ve hiçbir şey bulamadım. Teşekkürler!
rik.the.vik

2
Benim için çalışmıyor :( Bu KeyError'ı Imaging / PIL / Image.pyc satırında aldım 1423 -> KeyError (ext) # bilinmeyen uzantı yükselt
Radian

6
@Radian, save () yöntemindeki PIL dokümantasyonu şunu söylüyor: 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' ).
Su Zhang

1
Mevcut Python sürümünde, StringIO io paketindedir, şunu yazmalısınız:from io import StringIO
Spoutnik16

4
daha iyi kullanabilirsinimage.save(output, format=image.format)
reetesh11


24

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

14

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

Teşekkür ederim. StringIO - ihtiyacım olan şey bu.
maxp

Bir PNG, JPEG veya gerçek dosya formatı alma söz konusu olduğunda save () arayüzü tostring () arayüzünden çok daha temizdir.
Kekoa

13

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

2
image_data = faux_file.getvalue () işlevinin amacı nedir?
Ryan

@Ryan İyi yakaladım, hiçbir amaç yok. Testten çıkarıldı ve sonunda kaldırıldı.
mightypile

9

"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 imagenesneyi 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.


2
PNG formatını ham piksel verilerine düşürmek değil korumak istiyor gibi görünüyor.
Ben Blank
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.