Python图片操作之pillow

前言

这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题

于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。

微信小程序搜索:Python面试宝典

或可关注原创个人博客:https://lienze.tech

也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习

PIL

Web开发过程中,经常需要保存用户头像等一系列静态图片资源,此时需要我们服务端对前台输入的数据进行严格判断,避免非图片类型文件上传到服务器

图片分类

常见的存储的格式有如下一些

WebP

WebPGoogle推出的影像技术,可以使让网页中的图片有效进行压缩,同时又不影响图片格式兼容与实际清晰度,进而让整体网页下载速度加快

WebP改善了JPEG格式的图片压缩技术

WebP使用了一种基于VP8(能以更少的数据提供更高质量的视频,而且只需较小的处理能力即可播放视频)编码,这种技术已在2010五月开源

利用预测编码技术,同时还采用了一种基于RIFF的非常轻量级的容器。这种容器只会给每张图片增加20字节,但能让图片作者保存他们想要存储的元数据(文件描述信息)

这种格式的主要优势在于高效率,在质量相同的情况下,WebP格式图像的体积要比JPEG格式图像小40%

微信公众号使用的就是这种类型

# 使用PIL将图片处理为webp格式
def jpeg2webp(filename):
	if filename:
		im = PIL.Image.open(filename)
		im.save(filename.split('.')[0] + '.webp')

JPEG

Joint Photographic Expert Group

头部字段常见为:ffd8 ffe0

JPEG格式文件后辍名为.jpg.jpeg,是最常用的图像文件

JPEG格式是一种有损图片压缩格式,能够将图片压缩在很小的存储空间

但是JPEG格式所使用的是有损压缩格式,虽然图片存储量会减少,但是对应质量也会有丢失

PNG

Graphics Interchange Format

头部字段常见为:8950 4e47

PNG是网上接受的最新图像文件格式。PNG能够提供长度比GIF30%无损压缩图像文件

较旧的浏览器和程序可能不支持PNG文件

PNG只需要下载1/64的图像数据就可以展示低分辨率的预览图像

GIF

GIF1987年开发的图像文件格式

GIF文件的数据,是一种基于LZW算法的连续色调的无损压缩格式

GIF不属于任何应用程序。几乎所有相关软件都支持GIF

GIF格式的另一个特点是其在一个GIF文件中可以存多幅彩色图像

如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画

PIL模块

是图像处理标准库;PIL功能非常强大,并且API的使用也非常简单

安装同样也非常简单

pip3 install pillow

导入和所安装的包名可能有些不同

import PIL

图片文件识别

文件是否为一张图片识别方式有如下几种

  • 使用标准库imghdr
import imghdr
def is_image(filename):
	if filename:
		type_ = imghdr.what(filename)
		if not type_:
			raise TypeError('Is Not a Image')
       	return type_
  • 使用PIL模块输出文件格式进行判断

文件对象的format属性可以得出当前图片文件格式,当文件无法处理为图片时,PIL打开图片对象时候将会抛出异常OSError

def is_image(filename):
	if filename:
		try:
			im = PIL.Image.open(filename)
		except OSError as e:
			pass
		else:
			return im.format

图片格式转换

PIL模块对于图片格式的转换非常只能,只需要将转换后的文件名后缀确定即可

PIL模块会自动根据后缀对图像文件内容进行处理

def image2webp(filename):
    # 图片转webp格式
	if filename:
		im = PIL.Image.open(filename)
		im.save(filename.split('.')[0] + '.webp')

def image2png(filename):
    # 图片转png格式
	if filename:
		im = PIL.Image.open(filename)
		im.save(filename.split('.')[0] + '.png')

通过打开的文件对象所支持的save函数,传递新文件名作为参数即可

创建缩略图

图片缩略图的创建可以通过PIL模块中的thumbnail方法来进行创建

该方法需要一个元组作为参数,元组代表像素大小

thumbnail方法会通过所传递元组的值,来将图片像素设置为最大不超过元组内数据的图片

def image2thumb(filename):
	im = PIL.Image.open(filename)
	size_ = (150,150)
	im.thumbnail(size_)
	im.save('thumb-' + filename)

注意,这并不会真的创建一个像素为绝对150x150的图片,只是图片的像素不会超过150而已

缩略图的创建也可以使图片文件所占存储空间大大降低

修改图片尺寸

修改图片尺寸使用resize函数,该函数与thumbnail接收类似参数

def image2resize(filename):
	im = PIL.Image.open(filename)
	size_ = (150,150)
	out_ = im.resize(size_)
	out_.save('resize-' + filename)

需要注意的是,直接修改图片尺寸可能会导致图片变成畸形的展示效果

另外这里的resize并不是直接影响打开图片的尺寸,而是返回一个新的修改过后的图片对象

大小的修改也可以使图片文件所占存储空间大大降低

图片压缩

图片压缩也可以时图片所占存储空间大大降低

这里比较科学的办法可以使用cv2模块下的imwrite函数对图片的原始质量进行修改

  • 安装支持模块opencv-python
pip3 install opencv-python  -i https://pypi.tuna.tsinghua.edu.cn/simple

这里对于图片的压缩非常简单,只需要使用cv2模块下的imwrite函数重新保存图片即可

import cv2
def jpeg2cv(filename):
    # 压缩JPEG
    im = cv2.imread(filename)
    cv2.imwrite('cv2-'+filename,im,[cv2.IMWRITE_JPEG_QUALITY,20])

def png2cv2(filename):
    # 压缩PNG
    im = cv2.imread(filename)
    cv2.imwrite('cv2-'+filename,im,[cv2.IMWRITE_PNG_COMPRESSION,9])

imwrite函数的参数部分,最后一个参数有如下意义:

对于JPEG格式的图片,这个参数表示从0-100的图片质量

IMWRITE_JPEG_QUALITY

  • 默认值是95

  • 对于PNG格式的图片,这个参数表示压缩级别

    • IMWRITE_PNG_COMPRESSION
    • 0-9,较高的值意味着更小的尺寸和更长的压缩时间而默认值是3

你可能感兴趣的:(Python学习,python,开发语言,后端,pillow,图像处理)