BMP图片格式学习笔记

        课堂上老师布置了一道题目:对一个 BMP 图像文件进行处理,使其高度缩短为原来的一半(相当于中间横切)。在查资料的过程中接触了 pillow 库,但不知为何安装之后无法导入,help('modules') 查询已安装的库也显示没有 pillow,只能够用 import PIL 中的 Image 类来对图片进行处理。通过这个方法可以简单的,用已经封装好的函数直接完成任务,但是不符合我们正在进行的课程内容,python 进行文件处理,我个人的理解是要去弄清楚 BMP 格式文件的编码方式,如果从里面的二进制码获取图片的像素信息,然后截取一半高度。我目前猜想的,我们可以知道长宽,然后知道像素点信息的排列是从左到右从上到下,那么就可以删去后一半的数据,大致就可以得到符合题目要求的图片了。不过具体实施,就没那么简单,首先要解决的就是如何把 BMP 的图片转化为二进制。

       根据查到的资料,BMP 格式是没有经过压缩的图片格式,保存了最完整的图片信息,其中包含了四个内容:文件头,位图信息头,颜色信息以及图形数据。现在网上找一张 BMP 图片,通过属性可以看到我所找的,分辨率是 2551*2612,宽度是 2551 像素,长度是 2612 像素。然后我通过如下的代码,这段代码应该是在tensorflow 教程中,在进行图片识别时,需要将图片文件转化成二进制文件时中间过程的一段代码。网址为https://blog.csdn.net/code_better/article/details/53242943#commentsedit

import numpy as np
from PIL import Image

pic_path = 'C:\\Users\\60214\\Desktop\\python_work\\practice_in_Yueqian\\pic1.bmp'
pic = Image.open(pic_path)
arr = np.array(pic)
print(len(arr),len(arr[0]))

返回的结果也是2612,2551,跟我们所看到的分辨率信息一致。似乎也可以看出,我们用 PIL 中的 Image 类来打开图片,得到的内容中只包含图片的像素信息,文件头和位图信息头等已经被省去了。

       那么如果要从中间切开,不就是把一半的像素点去掉去掉就可以吗?从切片的方式,可以看出,的确是从上向下排列的。代码中的 convert 我还没弄清楚是什么意思,但根据上文给出的链接中的用法,以及在底层代码中的备注:

      Returns a converted copy of this image. For the "P" mode, this method translates pixels through the palette.  If mode is omitted, a mode is chosen so that all information in the image and the palette can be represented without a palette.返回一个图片的转化版本,如果是 P 模式,就是从调色板翻译像素点;如果这个 mode 的参数被省略,就是返回所有的信息,也就是没有调色板。The current version supports all possible conversions between "L", "RGB" and "CMYK." The **matrix** argument only supports "L" and "RGB".现行版本支持在 L 和 RGB 以及 CMYK,L就是黑白,RGB就是红绿蓝,CMYK是印刷模式的四原色,也就是可供选择的调色模式啦~

        一开始不加convert,没办法经过 matplotlib 打印到屏幕上。我猜想应该是 fromarray 这一部所生成的结果还不足以输出,加上了 convert 之后就没问题了。

import numpy as np
from PIL import Image
import matplotlib.pyplot as plt

pic_path = 'C:\\Users\\60214\\Desktop\\python_work\\practice_in_Yueqian\\pic1.bmp'
pic = Image.open(pic_path)
arr = np.array(pic)
length, width = len(arr),len(arr[0])
new_arr = arr[: int(length/2)] 
new_pic = Image.fromarray(new_arr).convert('RGB')
plt.imshow(new_pic)
plt.show()
new_pic.save('C:\\Users\\60214\\Desktop\\python_work\\practice_in_Yueqian\\new_pic.bmp','bmp')

           但是,避开了文件头有点可惜,所以还想另外寻找方法来再打开这个图片文件。一时找不到别的方法,等老师课堂上补充了他的方法之后我再补充。

猜你喜欢

转载自blog.csdn.net/baidu_41902768/article/details/81324182
今日推荐