0%

python 图片压缩到指定大小(KB)

python 图片压缩到指定大小(KB)




1、直接给网络图片地址:

import requests
from PIL import Image
from io import BytesIO # 使用PIL 打开网络图片库

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)
# compress_image(<"网络地址">, <"存储路径">, <"保存的图片大小">)



2、给bytes:

import requests
from PIL import Image
from io import BytesIO # 使用PIL 打开网络图片库

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)
# compress_image(<"网络地址">, <"存储路径">, <"保存的图片大小">)



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)

# compress_image(<"本地图片地址">, <"存储路径">, <"保存的图片大小">)



  • 重点:使用PIL模块存储图像时的报错:cannot write mode P as JPEG

image-20230530234345283

对于这个问题的原因,查了一下,因为我使用的是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')