(图像处理)图片文件与位图

为什么要理解这个问题?
也许,您认为你打开的图片只有几十kb,为什么做图像处理时间很长?推理时间长或是http传输时间长?
不排除程序有bug,或是待优化的地方,比如编码问题,或是算法问题等。
但这里说的是您可能并不了解你说的图片的大小真的是您理解的那样子?
 
图片文件,例如jpg、png等格式,用于储存在硬盘中,它们的大小,并不一定代表该图片在内存中的大小,内存中图片数据将以位图的形式打开;
其位图的大小基本等于保存为bmp格式的图片的大小(因为bmp图片需要另外增加54字节的信息头(文件信息头14字节、位图信息头40字节))
位图即BMP:Bitmap(位图)的简写,它是Windows操作系统中的标准图像文件格式,
这种格式的特点是包含的图像信息较丰富,几乎不进行压缩,但由此导致了它与生俱生来的缺点--占用磁盘空间过大。
 
在Windows下,任何各式的图片文件(包括视频播放)都要转化为位图个时候才能显示出来,
各种格式的图片文件也都是在位图格式的基础上采用不同的压缩算法生成的(Flash中使用了适量图,是按相同颜色区域存储的)。
 
 
一、下面我们来看看位图文件(*.BMP)的格式。
位图文件主要分为如下3个部分:
块名称
对应Windows结构体定义
大小(Byte)
文件信息头
BITMAPFILEHEADER
14
位图信息头
BITMAPINFOHEADER
40
RGB颜色阵列
BYTE*
由图像长宽尺寸决定
 
下面查看一张jpg图片的
一张草莓的图片:2.jpg

(图像处理)图片文件与位图_第1张图片

(图像处理)图片文件与位图_第2张图片

(图像处理)图片文件与位图_第3张图片

###

通过python版的opencv读取2.jpg(246KB)图片,并打印读取到内存中的数据大小;

然后将内存中的图片数据存到硬盘中去。

import cv2
img=cv2.imread("2.jpg")
print("图片数据大小为:%s MB"%str(img.size/1024/1024))
# 图片数据大小为:3.0 MB
cv2.imwrite("2.bmp",img)

下面查看保存的2.bmp属性:

(图像处理)图片文件与位图_第4张图片

分析:

图片的长宽并没有变,为什么bmp图片大这么多?是因为jpg图片是压缩格式,将bmp图片转成jpg图片是有损失的!

计算BMP图片大致:1024(图片宽)*1024(图片高)*3(RGB彩图有三个通道)=3145728字节(因为每个数采用8bit,即一个字节进行存储的)

对应的就是1024*1024*3/1024=1024*3(KB)

                 1024*1024*3/1024/1024=3(MB)

为啥查看属性是3145782字节呢?因为bmp图片有信息头的存在!

3,145,782-3,145,728=54字节对应的信息头文件的大小。

你可能感兴趣的:(图像处理)