相信大家和我一样,对于.dat文件是感到十分陌生的。因此在刚接触到这个小任务的时候我实在花了一些时间来了解到底什么是.dat文件。这里我将我自己的认识分享给大家:
总体而言,对于.dat文件的定义,我认为最关键,同时也是最容易被忽略掉的就是“dat是一种流文件格式”。看了很多文章中对.dat格式的介绍,大多数局限在自己的领域中,例如有的人说这是一种“音频格式”,“这是一种vcd的格式”,“这是一种红外扫描格式”。我想大多数人和我一样,看到这么多不同的定义是要感到晕头转向的。
最后,让我们回到.dat文件的初始定义,也就是“流”这个关键字上来。相信大家对流的概念是“既陌生又熟悉”,那么别的理论性的东西我们就不谈了,究竟什么东西可以被表示为流呢?答案是,几乎所有数据收集设备采集到的数据,IO数据等等,在未加工状态下都可以被表达为流的形式。
.dat文件格式并不专指某种文件格式,他没有统一的标准。这也告诉了我们,在我们需要处理一个.dat文件的时候,我们的处理思路应该是这样的:
----1. 这个流文件的产生源头是哪里?举个很简单的例子,高德地图的数据可以被表示为流,那么高德地图如何定义它自己的流数据呢-----这也直接规范了我们接下来的处理操作
----2. 这个流文件到底存储的是什么数据呢?音频,视频,图像数据,不同的数据对应了不同的处理方式
----3. 实在没有什么可以参考的东西,最后才是依据我们的经验来处理这样一个文件
下面让我以一个具体的例子来进行说明,也就是本文的标题所指出的,将.dat文件转换为一个png图像
首先来进行一下简单的背景说明:这是我的“朋友”交给我的一个任务,对于这样一个.dat文件,他仅有的信息是“这里面保存了图片”(就这么简单)
刚拿到这个小题目的时候,我是有点懵的。首先,即使知道了这其中保存的是图像,那么图像的格式为何呢?简单来说,图像的张数,图像的宽度与高度,图像的色彩位深等等信息的缺失,为这个问题增添了难度。
可以看到,由于我们对这个流文件一无所知,所以第一种方法(也就是找到这个流文件的源头以及定义方式)是不那么容易,至少来说是不好确定的。因此我们可以从第二个方向入手,至少我们知道这是一个图像文件了对吧。接下来就是我们的经验发挥作用的时候。
一个保存有图像的流文件,注意,里面可能包含有不仅仅是一张图像,举个简单的例子:对于一个监控摄像头来说,它可以连续拍摄很多张图像并以一个流文件的形式输出;这样是不是感觉更加困难了?不要着急,我们是有地方入手的。打开.dat文件的属性我们来好好瞧瞧:
发现什么了吗?是的,这个文件是不是出奇地小呢?仅有256k,也就是262144字节…等等,你发现什么了吗?是的512 * 512==262144,这会不会是一张512 * 512的8位灰度图像呢!(一个字节是8位)。当然啦,这也有可能是1024 * 256的灰度图像,甚至可能是其他奇奇怪怪的组织形式,但无论怎么说我们的直觉告诉我们,很有可能是一张512*512的灰度图像!!
(所以说,数据科学也好,图像分析也罢,保持对数字的敏感度是很重要的噢)
既然想到了这儿了,我们何不来实现一下看看效果呢?如果不对我们可以再修正嘛:
下面是读取.dat文件并转换为png图像的python代码:
import cv2import numpy as npdef main():with open('./DAT/ex05.dat', 'rb') as f:img = np.frombuffer(f.read(), np.uint8).reshape(512, 512) // frombuffer,从IObuffer中读取// 第二个参数指定了读取的格式,np.uint8,因为我们认为是8位的灰度图像嘛。这需要你对图像处理有一定的理解哦,但是并不困难// 最后我们reshape一下,将图像组织为我们想要的宽度与高度cv2.imwrite('./DAT/img.png', img) // 保存图像为.png格式if __name__ == '__main__':main()
那么输出的结果为何呢?见证奇迹的时候到了!
怎么样?你要说这张图片是错误的,我还真不太信。果不其然,问了朋友,他说这是正确的!问题解决啦。
总结:
总体来说,本篇文章对.dat文件格式进行了一个简单的,但是应该能够帮助到你理解的一个介绍。其次我们对.dat文件的分析方法进行了一个简单的介绍,希望这个思路能够帮助到各位;最后,我们用一个简单python程序对.dat文件转换为png文件进行了实现,如果你的解决方案和我相同,直接自己写吧,太简单了有没有!
好了,感谢大家的阅读,请多多支持,点赞收藏噢!