python 图片压缩到指定大小(KB)
1、直接给网络图片地址:
import requests from PIL import Image from io import BytesIO
def compress_image(url, file_out, size=98): """ :param url: 网络图片地址 :param file_out: 文件保存地址 :param size: 保存的文件大小 :return: """ res = requests.get(url) tempIm = BytesIO(res.content) img = Image.open(tempIm) if img.mode == "P": img = img.convert('RGB') img.save(file_out, optimize=True, quality=size)
compress_image("input.jpg", "output.jpg", 98)
|
2、给bytes:
import requests from PIL import Image from io import BytesIO
def compress_image(bytes_, file_out, size=98): """ :param url: 网络图片地址 :param file_out: 文件保存地址 :param size: 保存的文件大小 :return: """ tempIm = BytesIO(bytes_) img = Image.open(tempIm) if img.mode == "P": img = img.convert('RGB') img.save(file_out, optimize=True, quality=size) url = "https://www.xxx.com" response = requests.get(url) compress_image(response.content, "output.jpg", 98)
|
3、本地图片转换:
from PIL import Image
def compress_image(file_in, file_out, size): img = Image.open(file_in) img.save(file_out, optimize=True, quality=size)
compress_image("input.jpg", "output.jpg", 100)
|
- 重点:使用PIL模块存储图像时的报错:cannot write mode P as JPEG

对于这个问题的原因,查了一下,因为我使用的是PIL模块,对于PIL模块来说,其模式包括以下几种:
# 参考链接:https://www.jianshu.com/p/e8d058767dfa 模式 1 1位像素,黑和白,存成8位的像素 L 8位像素,黑白 P 8位像素,使用调色板映射到任何其他模式 RGB 3×8位像素,真彩 RGBA 4×8位像素,真彩+透明通道 CMYK 4×8位像素,颜色隔离 YCbCr 3×8位像素,彩色视频格式 I 32位整型像素 F 32位浮点型像素
|
报错原因也很明显,因为有图片的模式是“P”,不是”RGB”,所以无法直接写入保存,找到这张图片,发现和普通的彩色图片并没有什么区别:
具体查看图片模式的方法为:
img = Image.open('./data/chengqiang/117.jpg') print(img.mode)
|
解决方法:添加一个判定,转一下 rgb
if img.mode == "P":
img = img.convert('RGB')