在开始学习图像处理的时候,我们一般都需要从网络上找到合适的学习图片范例,但是网络图片下载后往往不一定是我们需要的图片格式。可以使用格式工厂对图片进行格式转化。我推荐使用编程技术来实现格式转化,用起来要比工具方便(不用安装)。
图片存储
计算机中存储的图片大致分为两种:位图和矢量图;
位图
又名点阵图像和栅格图像,是由称作像素(图片元素)的单个点组成的。这类图像放大后会变模糊,甚至出现格子(栅格)矩阵。日常手机、单反等摄影设备产出的都是这类图像。
矢量图
也称为面向对象的图像或绘图图像,在数学上定义为一系列由点连接的线。矢量文件中的图形元素称为对象。每个对象都是一个自成一体的实体,它具有颜色、形状、轮廓、大小和屏幕位置等属性。
位图格式
位图是当下图像处理的重点,相比矢量图缺少对象识别、对象位置标定、对象类型判定与还原等。我们图像分析就是为了从位图中识别感兴趣的对象信息。
BPM
没有压缩像素格式。支持四种颜色模式。
单色: 一个像素只占一位,要么是0,要么是1,所以只能存储黑白信息
16色位图: 一个像素4位,有16种颜色可选
256色位图: 一个像素8位,有256种颜色可选
24位位图: 就是图(1)所示的位图,颜色可有2^24种可选,对于人眼来说完全足够了。
JPEG
jpeg是有损压缩格式, 将像素信息用jpeg保存成文件再读取出来,其中某些像素值会有少许变化。在保存时有个质量参数可在[0,100]之间选择,参数越大图片就越保真,但图片的体积也就越大。一般情况下选择70或80就足够了。
jpeg没有透明信息。
jpeg比较适合用来存储相机拍出来的照片,这类图像用jpeg压缩后的体积比较小。其使用的具体算法核心是离散余弦变换、Huffman编码、算术编码等技术.
jpeg格式支持不完全读取整张图片,即可以选择读取原图、1/2、1/4、1/8大小的图片
PNG
png是一种无损压缩格式, 压缩大概是用行程编码算法。
png可以有透明效果。
png比较适合适量图,几何图。 比如本文中出现的这些图都是用png保存,比用joeg保存体积要小。
再强调一下: jpeg比较适合存储色彩“杂乱”的拍摄图片,png比较适合存储几何特征强的图形类图片。
有24位图和32位图之分。32位图就是带有alpha通道的图片。
将图片a绘制到另一幅图片b上,如果图片a没有alpha通道,那么就会完全将b图片的像素给替换掉。而如果有alpha通道,那么最后覆盖的结果值将是c = aalpha + b(1-alpha)
再对LBitmap添加png的支持。
GIF
动图格式,上面提到的bmp,jpeg,png图片都只有一帧,而gif可以保存多帧图像。
webp
google开发的一种有损、透明图片格式,相当于jpeg和png的合体,google声称其可以把图片大小减少40%。
格式转换-python
依赖库-PIL
pip install pillow
webp转JPEG
def getJPGFromWebbp(url, filePath):
res = requests.get(url)
byte_stream = io.BytesIO(res.content)
# Image打开二进制流Byte字节流数据
roiImg = Image.open(byte_stream)
# 转成jpeg
roiImg = roiImg.convert('RGB')
roiImg.save(filePath, quality=95)
webp转png
def getPngFromWebdp(url, filePath):
res = requests.get(url)
# 把请求到的数据转换为Bytes字节流
byte_stream = io.BytesIO(res.content)
# Image打开二进制流Byte字节流数据
roiImg = Image.open(byte_stream)
imgByteArr = io.BytesIO()
roiImg.save(imgByteArr, format='PNG')
imgByteArr = imgByteArr.getvalue()
with open(filePath, "wb") as f:
f.write(imgByteArr)
JPEG转PNG
def getJpegFromPng(source, target):
roiImg = Image.open(source)
roiImg = roiImg.convert('RGB')
roiImg.save(target, quality=95)
PNG转JPEG
def getPngFromJpeg(source, target):
roiImg = Image.open(source)
imgByteArr = io.BytesIO()
roiImg.save(imgByteArr, format='PNG')
imgByteArr = imgByteArr.getvalue()
with open(target, "wb") as f:
f.write(imgByteArr)