这几年一直在it行业里摸爬滚打,一路走来,不少总结了一些python行业里的高频面试,看到大部分初入行的新鲜血液,还在为各样的面试题答案或收录有各种困难问题
于是乎,我自己开发了一款面试宝典,希望能帮到大家,也希望有更多的Python新人真正加入从事到这个行业里,让python火不只是停留在广告上。
微信小程序搜索:Python面试宝典
或可关注原创个人博客:https://lienze.tech
也可关注微信公众号,不定时发送各类有趣猎奇的技术文章:Python编程学习
在Web
开发过程中,经常需要保存用户头像等一系列静态图片资源,此时需要我们服务端对前台输入的数据进行严格判断,避免非图片类型文件上传到服务器
常见的存储的格式有如下一些
WebP
WebP
是Google
推出的影像技术,可以使让网页中的图片有效进行压缩,同时又不影响图片格式兼容与实际清晰度,进而让整体网页下载速度加快
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
能够提供长度比GIF
小30%
的无损压缩图像文件
较旧的浏览器和程序可能不支持PNG
文件
PNG
只需要下载1/64
的图像数据就可以展示低分辨率的预览图像
GIF
GIF
是1987
年开发的图像文件格式
GIF
文件的数据,是一种基于LZW
算法的连续色调的无损压缩格式
GIF
不属于任何应用程序。几乎所有相关软件都支持GIF
GIF
格式的另一个特点是其在一个GIF
文件中可以存多幅彩色图像
如果把存于一个文件中的多幅图像数据逐幅读出并显示到屏幕上,就可构成一种最简单的动画
是图像处理标准库;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