概述:1 和 2:
- 背景
JPG
不支持 alpha = transparency
RGBA
、P
具有透明度 alpha = transparency
- 结果
无法将 RGBA 写入 JPEG
无法将 P 写入 JPEG
- 解决方案
- 在保存为 JPG 前,丢弃
alpha = transparency
- 然后保存为
JPG
- 你的代码
if im.mode == "JPEG":
im.save("xxx.jpg")
elif rgba_or_p_im.mode in ["RGBA", "P"]:
rgb_im = rgba_or_p_im.convert("RGB")
rgb_im.save("xxx.jpg")
关于调整图像文件大小,我已经实现了一个函数,供您参考:
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/python3/crifanLib/thirdParty/crifanPillow.py
P
。 - Maksym Ganenko