我刚刚开始使用Django和Python,我正在尝试构建一个照片应用程序。这个脚本正在生成缩略图,我想自己做。不幸的是,我不明白StringIO()
正在做什么。在这种情况下,Python文档对我没有多大帮助。
有人可以向我解释StringIO()
在这种特殊情况下的作用吗?
来自http://djangosnippets.org/snippets/1172/:
def save(self):
from PIL import Image
#Original photo
imgFile = Image.open(self.image.path)
#Convert to RGB
if imgFile.mode not in ('L', 'RGB'):
imgFile = imgFile.convert('RGB')
#Save a thumbnail for each of the given dimensions
#The IMAGE_SIZES looks like:
#IMAGE_SIZES = { 'image_web' : (300, 348),
# 'image_large' : (600, 450),
# 'image_thumb' : (200, 200) }
#each of which corresponds to an ImageField of the same name
for field_name, size in self.IMAGE_SIZES.iteritems():
field = getattr(self, field_name)
working = imgFile.copy()
working.thumbnail(size, Image.ANTIALIAS)
fp = StringIO()
working.save(fp, "JPEG", quality=95)
cf = ContentFile(fp.getvalue())
field.save(name=self.image.name, content=cf, save=False);
#Save instance of Photo
super(Photo, self).save()
答案 0 :(得分:2)
StringIO是一个可以用作文件类对象的类。您可以像使用常规文件一样使用它,除了将数据写入磁盘,它将被写入内存中的缓冲区(字符串缓冲区)。
在此脚本中,看起来图像首先保存到StringIO内存缓冲区,然后检索字符串的值并将其传递给ContentFile的构造函数以创建ContentFile的新实例,然后将其传递给字段保存功能。
我认为脚本使用StringIO的原因是ContentFile的构造函数接受一个字符串,然后写入然后读取StringIO文件是将图像内容表示为字符串的最简单方法。
作为旁注,我建议您查看Django's ImageFile字段类型,它已经足以满足我的图像相关需求,并且比通过StringIO和ContentFiles更清晰。
答案 1 :(得分:0)
StringIO提供了读取和写入字符串的能力,就像写入文件一样。这可以使编码更方便,更容易,或两者兼而有之。
它还允许您编辑字符串,这与常规python字符串不同。