python:使用PIL从PNG转换为JPG,而不将文件保存到磁盘

python:使用PIL从PNG转换为JPG,而不将文件保存到磁盘,python,python-imaging-library,Python,Python Imaging Library,在我的程序中,我需要将.png文件转换为.jpg文件,但我不想将文件保存到磁盘。 目前我使用 >>> from PIL import Imag >>> ima=Image.open("img.png") >>> ima.save("ima.jpg") 但这会将文件保存到磁盘。我不想将其保存到磁盘,但将其转换为.jpg对象。我该怎么做呢?您可以使用io中的BytesIO执行您正在尝试的操作: from io import BytesIO d

在我的程序中,我需要将
.png
文件转换为
.jpg
文件,但我不想将文件保存到磁盘。 目前我使用

>>> from PIL import Imag
>>> ima=Image.open("img.png")
>>> ima.save("ima.jpg")

但这会将文件保存到磁盘。我不想将其保存到磁盘,但将其转换为
.jpg
对象。我该怎么做呢?

您可以使用io中的BytesIO执行您正在尝试的操作:

from io import BytesIO

def convertToJpeg(im):
    with BytesIO() as f:
        im.save(f, format='JPEG')
        return f.getvalue()

Ivaylo改进了答案:

from PIL import Image
from io import BytesIO

ima=Image.open("img.png")

with BytesIO() as f:
   ima.save(f, format='JPEG')
   f.seek(0)
   ima_jpg = Image.open(f)

这样,ima_jpg就是一个图像对象。

要在
with
语句之外使用@tuxmanification方法中的
ima_jpg
对象,请使用
Image.load()


之后你想用它做什么?我推测,如果您想将其作为HTML响应的一部分返回,您可能希望将其保存到StringIO对象,但如果您更好地描述您的用例,您可能会得到更有用的答案。我只需要在Ore中使用
.jpg
对象,以便执行一些scipy操作。并且只需检查,“SciPy可以直接读取jpg和png图像,而无需使用PIL。使用SciPy,图像存储在numpy阵列中,我们可以直接访问数据以用于可视化以外的用途。“,因此,您不必使用PIL,只需执行image_data=imread('test.jpg').astype(np.float32)并使用它执行SciPy操作……除非您专门使用jpeg头?是的。我曾经这样使用过它(
.png
在SciPy中)但是一些
.png
文件往往会出现错误,一些罕见的错误。因此我喜欢将它们转换为
.jpg
我得到了错误
OSError:无法写入模式RGBA,因为JPEG
@kylefoley76 JPEG不支持RGBA(alpha通道)很好的行为!谢谢,伙计!非常聪明!
from PIL import Image
from io import BytesIO

ima=Image.open("img.png")

with BytesIO() as f:
   ima.save(f, format='JPEG')
   f.seek(0)
   ima_jpg = Image.open(f)
   ima_jpg.load()