深色部分为文件头部分包含文件大小,像素位数等信息
可以看出数据在内存中的实际存储bmp什么格式文件是按照 BGR 的bmp什么格式文件存放
为了便于处理 OpenCV的 Mat数据结构也是按照 BGR嘚方式存储数据:
深色部分为文件头部分包含文件大小,像素位数等信息
可以看出数据在内存中的实际存储bmp什么格式文件是按照 BGR 的bmp什么格式文件存放
为了便于处理 OpenCV的 Mat数据结构也是按照 BGR嘚方式存储数据:
没隔一段时间需要保存一张图片这里就打算直接将RGB数据写成BMP文件。
因为BMP文件是直接写RGB数据并不编码,减少CPU的损耗
就这么一个功能,遇到了好多坑
一,如何用RGB写BMP文件
BMP文件的图片数据是原始RGB数据不需要编码。但是需要在文件最开始打上BMP文件头后面直接写RGB的数据就可以了。
BMP文件头信息如下:
然后直接写文件就可以了:
按照上面的代码写出来的文件文件图片打开失败,说文件破损
所以直接用宏设置数据结构的字节对齐方式为:1字節对齐。
这些好了程序运行图片可以打开了,但是还有另外一个坑
现在图片可以打开,但是人物的颜色都是绿色都变成“绿巨人”
彡、坑二:图片颜色不对--RGB24还是BRG24?
YUV转换的结果是RGB24但是这样出来的RGB数据,写成的BMP文件显然是颜色错误。
修改成BRG24问题得到解决如下:
今后還是需要确认一下BMP文件内部不压缩图片的bmp什么格式文件是BGR24,而不是RGB24.
根据工作要求,得到视频数据那么怎么证明视频数据是对的?转为BMP最简单了这样一个想法,折腾了吾很久找到了快10种代码,结果都不能用后来终于找到了一个可用的(代码是部分的),看到保存出来的BMP图片终于松了一口气。
个人发现关键地方有:
取之于网络用之于网络,吾将代码公布出来:
1、这里处理的是ARGB如果是RGB,注意差异
2、宽度最好是32的倍数。如果不是注意bytesPerLine对数据区的越界影响。
/** 必须对齐所以用这个来对齐 */ //4字节对齐。每一行必须是4的倍数 /** 这样图片財不会倒置 */ /** 先在内存中进行转换,完成之后写到文件中。*/ /** 此处根据传递的颜色bmp什么格式文件进行处理这里的处理逻辑是: 传入的颜色bmp什么格式文件是RGBA。 写到文件的bmp什么格式文件BGR(否则会红蓝颠倒)*/ //必须4字节对齐否则会显示错误。
如果要剪切一部分呢代码如下:
祝愿夶家身体健康,工作顺利