bmp.c
#include <stdio.h>
#include "bmp.h"
void savebmp(unsigned char * pdata, char * bmp_file, int width, int height )
{
// Define BMP Size
const int size = height * width * 3;
FILE * output;
// Part.1 Create Bitmap File Header
BITMAPFILEHEADER fileHeader;
fileHeader.bfType = 0x4D42;
fileHeader.bfReserved1 = 0;
fileHeader.bfReserved2 = 0;
fileHeader.bfSize = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + size;
fileHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);
// Part.2 Create Bitmap Info Header
BITMAPINFOHEADER bitmapHeader = {0};
bitmapHeader.biSize = sizeof(BITMAPINFOHEADER);
bitmapHeader.biHeight = height;
bitmapHeader.biWidth = width;
bitmapHeader.biPlanes = 3;
bitmapHeader.biBitCount = 24;
bitmapHeader.biSizeImage = size;
bitmapHeader.biCompression = 0; //BI_RGB
// Write to file
output = fopen( bmp_file,"wb" );
if( !output )
return;
else
{
fwrite(&fileHeader, sizeof(BITMAPFILEHEADER), 1, output);
fwrite(&bitmapHeader, sizeof(BITMAPINFOHEADER), 1, output);
fwrite(pdata, size, 1, output);
fclose(output);
}
}
unsigned char buf[1920*1080*3];
int main()
{
FILE * fp;
int len = 0;
fp= fopen("bmpdata.bin","wb+");
if(fp == NULL)
return 0;
fseek(fp,0L,SEEK_END);
len = ftell(fp);
fread(buf, len, 1, fp);
savebmp(buf, "Bmp.bmp", 1920, 1080);
print("Hello World\n\r");
fclose(fp);
return 0;
}
bmp.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
typedef long LONG;
// TODO: 在此处引用程序需要的其他头文件
#pragma pack(2)
typedef struct {
WORD bfType;
DWORD bfSize;
WORD bfReserved1;
WORD bfReserved2;
DWORD bfOffBits;
} BITMAPFILEHEADER;
typedef struct {
DWORD biSize;
LONG biWidth;
LONG biHeight;
WORD biPlanes;
WORD biBitCount;
DWORD biCompression;
DWORD biSizeImage;
LONG biXPelsPerMeter;
LONG biYPelsPerMeter;
DWORD biClrUsed;
DWORD biClrImportant;
} BITMAPINFOHEADER;
/********************************************************************************
1.BMP文件由四个部分组成,除了以上的文件头,信息头,还有一个调色板(可选),然后才是
真正的数据。
2.调色板在文件中的存在形式就是一个二维数组palette[N][4]。每行的四个元素分别表示该索
引对应的B、G、R和Alpha的值,每个分量占一个字节。如不设透明通道时,Alpha为0。
3.当启用了调色板以后,位图文件数据区的像素就是索引了。根据索引查询调色板,就得到相应
的颜色了。是否启动调色板,由信息头最后的两个参数:biClrUsed,BiClrImportant决定。
4.本例中,没有使用调色板,因此这两个参数为0,表示使用全部颜色(调色板)。数据区的像
素就是实际的颜色。
*********************************************************************************/
BMP文件格式详解 - 红魔&皮卡丘 - 博客频道 - CSDN.NET
http://blog.csdn.net/o_sun_o/article/details/8351037