在Python中,如何将PIL或Imagemagick图像作为文件打开

2 投票
2 回答
2612 浏览
提问于 2025-04-16 17:15

我正在处理上传的文件,并且可以使用SimpleS3将它们保存到S3上:

from simples3.bucket import S3Bucket
upload = request.POST['image']
s = S3Bucket("cdn", s3.access_key, s3.secret_key)
s.put(upload.filename, upload.file.read())

在将文件保存为图像并上传之间,我会使用PIL或Imagemagick来保存这个图像的缩略图,具体取决于上传的是什么类型的图像文件。这个过程就是把文件转换成图像。我的问题是,如何将这个图像作为文件打开?我想像上面那样将缩略图上传到亚马逊的S3。下面的代码是我尝试的思路:

thumb = self._im.copy() #where _im is the Image
s = S3Bucket("cdn", s3.access_key, s3.secret_key)
s.put(self.filename+ext, thumb)

我尝试过但没有成功:

f = open(thumb, "rb")
s.put(self.filename+ext, f.read()

有效的方法是使用Image.save函数将文件写入硬盘,然后再将其作为文件打开,但这个方法效率非常低:

thumb.save(self.filename+ext)
f = open(self.filename+ext, 'r')
s.put(self.filename+ext, f.read())

2 个回答

0

对于ImageMagick的情况,如果你在使用PythonMagick的话,可以使用它下面的Blob类。

>>> from PythonMagick import Image, Blob
>>> image = Image("images/test_image.miff")
>>> image.magick("PNG")
>>> blob = Blob()
>>> image.write(blob)
>>> len(blob.data)
28282
>>> blob.data[0:20]
'\x89PNG\r\n\x1a\n\x00\x00\x00\rIHDR\x00\x00\x00\x94'
4

我搞明白了:

from StringIO import StringIO
f = StringIO() 
thumb.save(f, ext) 
s.put(self.filename+ext, f.getvalue())

撰写回答