根据工作要求,得到视频数据。那么怎么证明视频数据是对的?转为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
关注
打赏
热门博文
- 历史最高名次:17
- 日常收集的妙语
- git更新:Your local changes to the following files would be overwritten by merge
- Github通过PR提交代码到开源库
- Github参与OpenJDK8的开发指南
- FreeType可以指定斜体值了!祝贺修改代码整合进入FreeType
- JDK/FreeType中关于斜的英文有哪些
- WINDOWS编译ffmpeg:LINK : fatal error LNK1104: 无法打开文件“LIBCMT.lib”
- 全网首发:编译ffmpeg: error: ‘VFW_E_NOT_FOUND‘ undeclared ; did you mean ‘NTE_NOT_FOUND‘?
- WINDOWS+VS2012+msys2编译ffmpeg成功,DLL不能用