bmp格式解析

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值