2016-01-13 62 views
0
from PIL import Image 

myImg = request.FILES['docfile'] 
myImg = Image.open(myImg) 
print(myImg.format, myImg.size, myImg.mode) 
myImg = myImg.resize((50, 50)) 
print(myImg.format, myImg.size, myImg.mode) 

以下是(django/python 3.5)代码的删节版本。目标是调整图像大小(我不想为此使用缩略图),但将其保存在内存中,而不是将其保存到磁盘(因为我必须将其传回到阵列中)。在使用PIL调整大小时丢失图像格式

无论如何,这里有2页打印的结果:

PNG (1300, 1300) RGBA 
None (50, 50) RGBA 

正如你所看到的,格式调整大小后丢失。我该如何保存它?

回答

2

作为DOC says

PIL.Image.format

源文件的文件格式。对于库本身创建的图像 (通过工厂功能或通过在现有图像上运行 方法),此属性设置为None

在调整图像大小后,它会变成“由库创建”,因此如果要保留该格式,则必须明确地执行此操作。

另请注意,格式是源文件的属性,而不是图像本身。图像本身只是以某种方式存储在内存中的一组抽象像素。因此,询问图片的格式是什么没有意义。询问包含图像的文件的格式是什么意思。因此,只有将图像写入文件(或为此编码为某种格式),图像才具有格式。

+0

如果您使用的是原来的Python成像模块,而不是枕头叉,链接到文档http://www.effbot.org/ imagebook/image.htm#tag-Image.Image.format – mpursuit

+0

好的谢谢你的回答。我如何将图像编码回PNG?强制格式为PNG的确显示了“PNG”,但图像仍然是样式而不是“imagename.png”。有没有办法在内存中做到这一点? –

+0

@RobertBrax呃,你必须在其上调用'.save(output,format ='PNG')'。如果你想保存到内存中,我想你应该尝试将''BytesIO'](https://docs.python.org/2/library/io.html#io.BytesIO)作为'output'而不是真正的文件。 – kirelagin

0

因为我记得FILES集合中的项目就像流,即一旦读取,您必须重新设置位置。例如,您可以将内容加载到StringIO对象,然后从中创建图像,然后调用seek(0)并再次从该对象创建缩略图。

0

为了保存格式,你可以这样做:

myImg = Image.open(myImg) 
myImg2 = myImg.resize((50, 50)) 
myImg2.format = myImg.format 
相关问题