根据工作要求,得到视频数据。那么怎么证明视频数据是对的?转为BMP最简单了。这样一个想法,折腾了吾很久,找到了快10种代码,结果都不能用。后来终于找到了一个可用的(代码是部分的),看到保存出来的BMP图片,终于松了一口气。
想直接用的朋友,去这里:https://github.com/quantum6/RgbToBmp
个人发现关键地方有:
- 文件头。
- 文件头的对齐。
- 每行数据的对齐。
取之于网络,用之于网络,吾将代码公布出来:
1、这里处理的是ARGB,如果是RGB,注意差异。
2、宽度最好是32的倍数。如果不是,注意bytesPerLine对数据区的越界影响。
- 主代码
看着这么整齐的代码,是不是赏心悦目?这么好的做法,阁下应该学习使用。
#include
#include
#include
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned int DWORD;
typedef int LONG;
#define BITS_PER_PIXCEL 24
#define FORMAT_RGBA 4
#define FORMAT_RGB 3
/** must needed. pack */
#pragma pack(1)
typedef struct
{
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BMP_FILE_HEADER;
typedef struct{
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BMP_INFO_HEADER;
#pragma pack()
int rgbaToBmpFile(const char *pFileName, const char* pRgbaData, const int nWidth, const int nHeight, const int format)
{
BMP_FILE_HEADER bmpHeader;
BMP_INFO_HEADER bmpInfo;
FILE* fp = NULL;
char* pBmpSource = NULL;
char* pBmpData = NULL;
int i = 0, j=0;
//4 bytes pack. must be 4 times per line。
int bytesPerLine = (nWidth*BITS_PER_PIXCEL+31)/32*4;
int pixcelBytes = bytesPerLine*nHeight;
bmpHeader.bfType = 0x4D42;
bmpHeader.bfReserved1 = 0;
bmpHeader.bfReserved2 = 0;
bmpHeader.bfOffBits = sizeof(BMP_FILE_HEADER) + sizeof(BMP_INFO_HEADER);
bmpHeader.bfSize = bmpHeader.bfOffBits + pixcelBytes;
bmpInfo.biSize = sizeof(BMP_INFO_HEADER);
bmpInfo.biWidth = nWidth;
/** 这样图片才不会倒置 */
bmpInfo.biHeight = -nHeight;
bmpInfo.biPlanes = 1;
bmpInfo.biBitCount = BITS_PER_PIXCEL;
bmpInfo.biCompression = 0;
bmpInfo.biSizeImage = pixcelBytes;
bmpInfo.biXPelsPerMeter = 100;
bmpInfo.biYPelsPerMeter = 100;
bmpInfo.biClrUsed = 0;
bmpInfo.biClrImportant = 0;
/** convert in memort, then write to file. */
pBmpSource = (char*)malloc(pixcelBytes);
if (!pBmpSource)
{
return -1;
}
/** open file */
fp = fopen(pFileName,"wb+");
if (!fp)
{
return -1;
}
fwrite(&bmpHeader, sizeof(BMP_FILE_HEADER), 1, fp);
fwrite(&bmpInfo, sizeof(BMP_INFO_HEADER), 1, fp);
/** Here you should consider color format. RGBA ? RGB? BGR?
Param format is RGBA, format for file is BGR */
pBmpData = pBmpSource;
for (i=0; i
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?