Python图像压缩
本教程将讨论使用Python中的PIL
库来压缩图像。
在使用PIL
库之前,请使用pip
或python
安装它。
pip install Pillow
使用PIL
库的Python图像压缩
图像压缩是用来减少图像的大小。我们知道,图像由包含颜色或强度值的像素组成。
主要有两种方法来减少图像的大小或压缩图像。一种方法是调整图像的大小以减少存在的像素数。
例如,如果图像是500×500像素,我们可以通过将像素的数量从500×500减少到100×100像素来压缩它或减少其文件大小。结果图像将被压缩,但它将变得很小,文件大小也将减少。
我们越是降低像素数,文件大小就会减少得越多,但图像也会变小。我们可能要把调整后的图像放大才能看清楚。
我们可以使用PIL
库中Image
模块的resize()
函数来调整图像的大小。resize()
函数的基本语法如下。
MyImage.resize(size, resample, box, reducing_gap)
在上面的代码中,MyImage
是包含输入图像的Image
模块对象。size
参数包含输出图像的大小,它应该是一个两值元组,就像(width, height)
。
resample
参数是可选的,默认设置为None
,它用于设置重采样滤波器,它将应用于图像,使其平滑,就像PIL.Image.Resampling.NEAREST
滤波器一样,使用其最近的像素平滑每个像素。
box
参数也是可选的,默认值设置为None
,用于设置图像的感兴趣区域,它应该是一个包含方框位置的4值元组,如(0,0,width,height)
。
reducing_gap
也是一个可选的参数,它用于对图像进行优化,这将进一步减少图像的大小,默认情况下,其值被设置为无。
reducing_gap
的值应该是一个整数,值越小意味着调整速度越快,值越大意味着调整速度越慢但效果越好。
例如,让我们使用resize()
函数来压缩一张图片。请看下面的代码。
from PIL import Image
input_img = Image.open('test.jpg')
print('input image size:', input_img.size)
output_img = input_img.resize((300,300))
print('output image size:', output_img.size)
output_img.save('testNew.jpg')
输出:
input image size: (600, 600)
output image size: (300, 300)
在上面的代码中,我们使用了PIL
库中Image
模块的open()
和save()
函数来打开和保存图像。
我们在open()
函数中只提供了图像的名称和扩展名,因为图像和Python代码文件在同一个目录中,但如果它们不在同一个目录中,我们必须提供图像文件的完整路径以及它的名称和扩展名才能读取它。
我们还在save()
函数中使用了图像名称和扩展名,这将把图像保存在Python代码文件的当前目录中,但我们也可以通过提供图像名称和扩展名的完整路径将图像保存在另一个目录中。
在上图中,左边的图像是原始图像;其大小为21.6kb,右边的图像是调整后的图像,其大小为6.88kb。
右侧图片被放大到200%,这样我们就可以很容易地与原始图片进行比较,并看到两张图片的质量差异很小。
在上面的例子中,我们没有使用任何可选参数,但我们可以使用它们来提高输出图像的质量。
另一种压缩图像的方法是降低图像的质量。在这种方法中,图像的像素数将保持不变,但图像的质量将随着图像的文件大小而降低。
我们可以在save()
函数中使用optimize
和quality
参数来减少图像的文件大小。
optimize
参数将被设置为true
,以对图像进行优化,这将在不损失太多质量的情况下减少尺寸,而quality
参数可以被设置为1到100的任何百分比。
如果我们把质量设置为50%,图像文件的大小将变成一半。例如,让我们在上面的例子中只使用save()
函数来减少文件的大小。
请看下面的代码。
from PIL import Image
input_img = Image.open('test.jpg')
output_img = input_img.save('testNew.jpg', optimize=True, quality=50)
input_img_2 = Image.open('testNew.jpg')
print('Input image size:',input_img.size)
print('Output Image Size:',input_img_2.size)
输出结果:
Input image size: (600, 600)
Output Image Size: (600, 600)
在上面的输出中,我们可以看到,输入和输出图像的像素数是一样的,而输出图像的质量却下降了。左边的图像是原始图像,右边的是输出的图像。
如果我们比较这两个例子,两个输出图像的质量几乎相同,但第一个例子中的输出图像的像素大小小于第二个例子中的输出图像的像素大小。我们也可以把resize()
和save()
函数结合起来,得到所需的结果。