摘要timop
和2:
backgroud
JPG
not support alpha = transparency
RGBA
, P
has alpha = transparency
RGBA
= Red Green Blue Alpha
result
cannot write mode RGBA as JPEG
cannot write mode P as JPEG
solution
- before save to JPG, discard
alpha = transparency
- such as: convert
Image
to RGB
- then save to
JPG
your code
if im.mode == "JPEG":
im.save(output, format='JPEG', quality=95)
elif im.mode in ["RGBA", "P"]:
im = im.convert("RGB")
im.save(output, format='JPEG', quality=95)
More for you:
关于 调整大小并降低图像质量
,我已经实现了一个函数供您(和其他人)参考:
from PIL import Image, ImageDraw
cfgDefaultImageResample = Image.BICUBIC
def resizeImage(inputImage,
newSize,
resample=cfgDefaultImageResample,
outputFormat=None,
outputImageFile=None
):
"""
resize input image
resize normally means become smaller, reduce size
:param inputImage: image file object(fp) / filename / binary bytes
:param newSize: (width, height)
:param resample: PIL.Image.NEAREST, PIL.Image.BILINEAR, PIL.Image.BICUBIC, or PIL.Image.LANCZOS
https://pillow.readthedocs.io/en/stable/reference/Image.html#PIL.Image.Image.thumbnail
:param outputFormat: PNG/JPEG/BMP/GIF/TIFF/WebP/..., more refer:
https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html
if input image is filename with suffix, can omit this -> will infer from filename suffix
:param outputImageFile: output image file filename
:return:
input image file filename: output resized image to outputImageFile
input image binary bytes: resized image binary bytes
"""
openableImage = None
if isinstance(inputImage, str):
openableImage = inputImage
elif CommonUtils.isFileObject(inputImage):
openableImage = inputImage
elif isinstance(inputImage, bytes):
inputImageLen = len(inputImage)
openableImage = io.BytesIO(inputImage)
if openableImage:
imageFile = Image.open(openableImage)
elif isinstance(inputImage, Image.Image):
imageFile = inputImage
imageFile.thumbnail(newSize, resample)
if outputImageFile:
imageFile.save(outputImageFile)
imageFile.close()
else:
imageOutput = io.BytesIO()
outputImageFormat = None
if outputFormat:
outputImageFormat = outputFormat
elif imageFile.format:
outputImageFormat = imageFile.format
imageFile.save(imageOutput, outputImageFormat)
imageFile.close()
compressedImageBytes = imageOutput.getvalue()
compressedImageLen = len(compressedImageBytes)
compressRatio = float(compressedImageLen)/float(inputImageLen)
print("%s -> %s, resize ratio: %d%%" % (inputImageLen, compressedImageLen, int(compressRatio * 100)))
return compressedImageBytes
最新的代码可以在这里找到:
https://github.com/crifan/crifanLibPython/blob/master/crifanLib/crifanMultimedia.py
jpg
图像时,它都可以正常工作,但如果我上传其他类型的图像,则会引发错误。我们如何将图像类型更改为jpg
,以便它可以正常工作。我是新来的,所以我不小心添加了JavaScript
和PHP
,我已经将它们删除 :) - user9203538png
图像时出现了这个错误。 - user9203538