1

我刚开始使用 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()
4

2 回答 2

2

StringIO是一个可以用作类文件对象的类。您可以像使用常规文件一样使用它,除了不是将数据写入磁盘,而是将其写入内存中的缓冲区(字符串缓冲区)。

在此脚本中,看起来图像首先保存到 StringIO 内存缓冲区,然后检索字符串的值并将其传递给 ContentFile 的构造函数以创建 ContentFile 的新实例,然后将其传递给字段 save功能。

我认为脚本使用 StringIO 的原因是 ContentFile 的构造函数接受一个字符串,写入然后读取 StringIO 文件是获取表示为字符串的图像内容的最简单方法。

作为旁注,我想建议你看一下Django 的 ImageFile字段类型,它对于我的图像相关需求已经绰绰有余,并且比通过 StringIO 和 ContentFiles 更清晰。

于 2011-12-13T22:06:23.547 回答
0

StringIO 提供了读取和写入字符串的能力,就像写入文件一样。这可以使编码更方便,更容易,或两者兼而有之。

它还允许您编辑字符串,这与常规的 Python 字符串不同。

于 2011-12-13T21:57:17.070 回答