使用PIL调整大小时丢失图像格式

时间:2016-01-13 14:59:29

标签: python django python-3.x python-imaging-library

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)代码的删节版本。目标是调整图像的大小(我不想为此使用缩略图),但要将其保存在内存中,而不是将其保存到磁盘(因为我必须将其传回数组)。

无论如何,这是2张照片的结果:

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

如您所见,调整大小后格式会丢失。我该如何保存它?

3 个答案:

答案 0 :(得分:4)

作为文档says

  

<强> (?:...)

     

源文件的文件格式。对于图像   由图书馆本身创建(通过工厂功能,或通过运行   现有图像上的方法),此属性设置为PIL.Image.format

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

要保留格式,您可以执行以下操作:

Dim PrevSheet, CurSheet As String

PrevSheet = "PrevSheet"
CurSheet = "CurSheet"

CurEnd = Sheets(CurSheet).Cells(Rows.Count, 1).End(xlUp).Row
PrevEnd = Sheets(PrevSheet).Cells(Rows.Count, 1).End(xlUp).Row

For sRow = 2 To CurEnd
Sheets(CurSheet).Range("H" & sRow).value = WorksheetFunction.Index(Sheets(PrevSheet).Range("H2:H" & PrevEnd), WorksheetFunction.Match(Sheets(CurSheet).Range("A" & sRow), Sheets(PrevSheet).Range("A2:A" & PrevEnd), 0))
Sheets(CurSheet).Range("I" & sRow).value = WorksheetFunction.Index(Sheets(PrevSheet).Range("I2:I" & PrevEnd), WorksheetFunction.Match(Sheets(CurSheet).Range("A" & sRow), Sheets(PrevSheet).Range("A2:A" & PrevEnd), 0))
Sheets(CurSheet).Range("J" & sRow).value = WorksheetFunction.Index(Sheets(PrevSheet).Range("J2:J" & PrevEnd), WorksheetFunction.Match(Sheets(CurSheet).Range("A" & sRow), Sheets(PrevSheet).Range("A2:A" & PrevEnd), 0))
Sheets(CurSheet).Range("K" & sRow).value = WorksheetFunction.Index(Sheets(PrevSheet).Range("K2:K" & PrevEnd), WorksheetFunction.Match(Sheets(CurSheet).Range("A" & sRow), Sheets(PrevSheet).Range("A2:A" & PrevEnd), 0))
Sheets(CurSheet).Range("L" & sRow).value = WorksheetFunction.Index(Sheets(PrevSheet).Range("L2:L" & PrevEnd), WorksheetFunction.Match(Sheets(CurSheet).Range("A" & sRow), Sheets(PrevSheet).Range("A2:A" & PrevEnd), 0))
Sheets(CurSheet).Range("M" & sRow).value = WorksheetFunction.Index(Sheets(PrevSheet).Range("M2:M" & PrevEnd), WorksheetFunction.Match(Sheets(CurSheet).Range("A" & sRow), Sheets(PrevSheet).Range("A2:A" & PrevEnd), 0))
Sheets(CurSheet).Range("N" & sRow).value = WorksheetFunction.Index(Sheets(PrevSheet).Range("N2:N" & PrevEnd), WorksheetFunction.Match(Sheets(CurSheet).Range("A" & sRow), Sheets(PrevSheet).Range("A2:A" & PrevEnd), 0))
Next sRow
相关问题