Bitmap文件格式+生成一个BMP文件
Bitmap的文件格式:
#define UINT16 unsigned short
#define DWORD unsigned int
#define WORD short
#define LONG int // Bitmap File Header ( 14 Bytes )
typedef struct tagBITMAPFILEHEADER
{
UINT16 bfType; // same as BM in ASCII.
DWORD bfSize; // the size of the BMP file in bytes
UINT16 bfReserved1;
UINT16 bfReserved2;
DWORD bfOffBits; // starting address, of the byte where the bitmap image data (Pixel Array) can be found.
} BITMAPFILEHEADER, *PBITMAPFILEHEADER; // DIB头描述bitmap的信息,包括大小、压缩类型、颜色格式等,DIB头的大小根据版本不同,大小也不同。
typedef struct tagBITMAPINFOHEADER
{
DWORD biSize; // 4, the size of this header (40 bytes)
LONG biWidth; // 4, the bitmap width in pixels (signed integer).
LONG biHeight; // 4, the bitmap height in pixels (signed integer).
WORD biPlanes; // 2, the number of color planes being used. Must be set to 1.
WORD biBitCount; // 2, the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32.
DWORD biCompression; // 4, the compression method being used.
DWORD biSizeImage; // 4, the image size. This is the size of the raw bitmap data, and should not be confused with the file size.
LONG biXPelsPerMeter; // 4, the horizontal resolution of the image.
LONG biYPelsPerMeter; // 4, the vertical resolution of the image.
DWORD biClrUsed; // 4, the number of colors in the color palette, or 0 to default to 2^n.
DWORD biClrImportant; // 4, the number of important colors used, or 0 when every color is important; generally ignored.
} BITMAPINFOHEADER;
生成一个BMP文件:
int bitmap_file_generate( char *name, int width, int height )
{
FILE *fp = NULL;
unsigned char *pData;
unsigned char *pp;
int i, j;
int iFileSize; unsigned char bfType1, bfType2;
unsigned int bfSize;
unsigned short bfReserved1, bfReserved2;
unsigned int bfOffBits;
unsigned int biSize;
int biWidth, biHeight;
unsigned short biPlanes;
unsigned short biBitCount;
unsigned int biCompression;
unsigned int biSizeImage;
unsigned int biXPelsPerMeter;
unsigned int biYPelsPerMeter;
unsigned int biClrUsed;
unsigned int biClrImportant; // offset[0:1]
bfType1 = 'B';
bfType2 = 'M';
// offset[2:5]
bfSize = width * height * + ;
// offset[6:7]
bfReserved1 = ;
// offsset[8:9]
bfReserved2 = ;
// offset[10:13]
bfOffBits = ;
// offset[14:17]
biSize = ;
// offset[18:21]
biWidth = width;
// offset[22:25]
biHeight = height;
// offset[26:27]
biPlanes = ;
// offset[28:29]
biBitCount = ;
// offset[30:33]
biCompression = ;
// offset[34:37]
biSizeImage = width * height * ;
// offset[38:41]
biXPelsPerMeter = ;
// offset[42:45]
biYPelsPerMeter = ;
// offset[46:49]
biClrUsed = ;
// offset[50:53]
biClrImportant = ; fp = fopen(name, "wb+");
if( fp == NULL )
{
printf("create file err, fopen: %p\n", fp);
return -;
} pData = (unsigned char *)malloc(biWidth*biHeight*+);//malloc(iFileSize);
if(pData == NULL)
{
printf("pData malloc err\n");
return -;
} // same as BM in ASCII.
pData[] = bfType1;
pData[] = bfType2; // the size of the BMP file in bytes. bmp文件的实际大小
pData[] = (unsigned char)((bfSize>>) & 0xff);
pData[] = (unsigned char)((bfSize>>) & 0xff);
pData[] = (unsigned char)((bfSize>>) & 0xff);
pData[] = (unsigned char)((bfSize>>) & 0xff); // reserved
pData[] = (unsigned char)((bfReserved1>>) & 0xff);
pData[] = (unsigned char)((bfReserved1>>) & 0xff);
// reserved
pData[] = (unsigned char)((bfReserved2>>) & 0xff);
pData[] = (unsigned char)((bfReserved2>>) & 0xff); // the offset, i.e. starting address, of the byte where the bitmap image data (Pixel Array) can be found.
// 颜色数据的偏移地址,实际为:54 = 14 + 40
pData[] = (unsigned char)((bfOffBits>>) & 0xff);
pData[] = (unsigned char)((bfOffBits>>) & 0xff);
pData[] = (unsigned char)((bfOffBits>>) & 0xff);
pData[] = (unsigned char)((bfOffBits>>) & 0xff); // the size of this header (40 bytes)
pData[] = (unsigned char)((biSize>>) & 0xff);
pData[] = (unsigned char)((biSize>>) & 0xff);
pData[] = (unsigned char)((biSize>>) & 0xff);
pData[] = (unsigned char)((biSize>>) & 0xff); // the bitmap width in pixels (signed integer).
pData[] = (unsigned char)((biWidth>>) & 0xff);
pData[] = (unsigned char)((biWidth>>) & 0xff);
pData[] = (unsigned char)((biWidth>>) & 0xff);
pData[] = (unsigned char)((biWidth>>) & 0xff); // the bitmap height in pixels (signed integer).
pData[] = (unsigned char)((biHeight>>) & 0xff);
pData[] = (unsigned char)((biHeight>>) & 0xff);
pData[] = (unsigned char)((biHeight>>) & 0xff);
pData[] = (unsigned char)((biHeight>>) & 0xff); // the number of color planes being used. Must be set to 1.
pData[] = (unsigned char)((biPlanes>>) & 0xff);
pData[] = (unsigned char)((biPlanes>>) & 0xff); // the number of bits per pixel, which is the color depth of the image. Typical values are 1, 4, 8, 16, 24 and 32.
pData[] = (unsigned char)((biBitCount>>) & 0xff);
pData[] = (unsigned char)((biBitCount>>) & 0xff); // the compression method being used. See the next table for a list of possible values.
pData[] = (unsigned char)((biCompression>>) & 0xff);
pData[] = (unsigned char)((biCompression>>) & 0xff);
pData[] = (unsigned char)((biCompression>>) & 0xff);
pData[] = (unsigned char)((biCompression>>) & 0xff); // the image size. This is the size of the raw bitmap data, and should not be confused with the file size.
pData[] = (unsigned char)((biSizeImage>>) & 0xff);
pData[] = (unsigned char)((biSizeImage>>) & 0xff);
pData[] = (unsigned char)((biSizeImage>>) & 0xff);
pData[] = (unsigned char)((biSizeImage>>) & 0xff); // the horizontal resolution of the image. (pixel per meter, signed integer)
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biXPelsPerMeter>>) & 0xff); // the vertical resolution of the image. (pixel per meter, signed integer)
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff);
pData[] = (unsigned char)((biYPelsPerMeter>>) & 0xff); // the number of colors in the color palette, or 0 to default to 2^n.
pData[] = (unsigned char)((biClrUsed>>) & 0xff);
pData[] = (unsigned char)((biClrUsed>>) & 0xff);
pData[] = (unsigned char)((biClrUsed>>) & 0xff);
pData[] = (unsigned char)((biClrUsed>>) & 0xff); // the number of important colors used, or 0 when every color is important; generally ignored.
pData[] = (unsigned char)((biClrImportant>>) & 0xff);
pData[] = (unsigned char)((biClrImportant>>) & 0xff);
pData[] = (unsigned char)((biClrImportant>>) & 0xff);
pData[] = (unsigned char)((biClrImportant>>) & 0xff); pp = &pData[];
for(i = ; i < biHeight; i++)
{
for(j = ; j < biWidth; j++)
{
set_color(pp, biWidth, biHeight, i, j, i+j, i, j); // 随便填有点颜色
}
} iFileSize = fwrite(pData, , bfSize, fp);
printf("generate file iFileSize: %d\n", iFileSize); free(pData); fclose(fp); return ;
}
以上生成的BMP,坐标起始位置(0,0)为左下角,填充颜色:
void set_color( unsigned char *pp, int w, int h,
int x, int y, unsigned char r, unsigned char g, unsigned char b )
{
pp[y*w*+x*+] = (unsigned char)r;
pp[y*w*+x*+] = (unsigned char)g;
pp[y*w*+x*+] = (unsigned char)b;
}
生成一个,~~~~(>_<)~~~~:
int main(int argc, char *argv[])
{
int ret;
char *file_name; if( argc != )
{
printf("please input bitmap file_name\n");
printf("usage: %s bitmap_file_name\n", argv[]);
return ;
} file_name = argv[]; ret = bitmap_file_generate(file_name, *, *); printf("bitmap_file_generate, ret: %d\n", ret); return ;
}
Bitmap文件格式+生成一个BMP文件的更多相关文章
- 用php生成一个excel文件(原理)
1.我们用php来生成一个excel文档来讲述其原理: excel2007里面的文档目录组成部分为: 2.我们使用ZipArchive()方法来生成一个简易的excel文件. 使用方法: 3.代码如下 ...
- Log4j使用笔记:每天生成一个日志文件、按日志大小生成文件
其中TestLog4j.java如下: package cn.zhoucy.test; import org.apache.log4j.Logger; public class TestLog4j { ...
- 非正常关闭vi编辑器时会生成一个.swp文件
非正常关闭vi编辑器时会生成一个.swp文件 关于swp文件 使用vi,经常可以看到swp这个文件,那这个文件是怎么产生的呢,当你打开一个文件,vi就会生成这么一个.(filename)swp文件以备 ...
- python excel操作 练习:#生成一个excel文件,生成3个sheet,每个sheet的a1写一下sheet的名称。每个sheet有个底色
练习:#生成一个excel文件,生成3个sheet,每个sheet的a1写一下sheet的名称.每个sheet有个底色 #coding=utf-8 from openpyxl import Workb ...
- 原创:无错版!让DEDE只生成一个RSS文件,不分栏目
DEDE为每一个栏目都独立创建一个rss文件, 如果用户要整站订阅相当不方便. 所以需要修改让dede只生成一个rss. 网上大部分帖子要么是抄, 要么是有问题少了步骤. 今天特意整理下. 分享.. ...
- Visual Studio 2012网站如何只生成一个DLL文件
简介: 在Visual Studio 2005,2008,2010版本中,都有Web Deployment工具将网站进行发布,所有代码文件和库文件发布,生成为一个动态链接库文件,而在Visual St ...
- salesforce 零基础学习(五十三)多个文件生成一个zip文件(使用git上封装的代码)
此篇参考git代码:https://github.com/pdalcol/Zippex 学习salesforce可以访问一个朋友的网站:https://www.xgeek.net 首先感谢git上提供 ...
- logback配置每天生成一个日志文件,保存30天的日志文件
<?xml version="1.0" encoding="UTF-8"?> <configuration> <!-- 文件输出格 ...
- log4j配置每天生成一个日志文件
首先需要配置web.xml里面: <servlet-name>log4j-init</servlet-name> <servlet-class>com.free.c ...
随机推荐
- Jmeter性能测试入门(转)
出处:http://www.cnblogs.com/by-dream/p/5611555.html Jmeter性能测试步骤 1. 添加线程组之后,先设置这两项: 2. 添加一个http请求 被测的u ...
- [SHTSC 2014] 信号增幅仪
最小覆盖圆算法.看着题解半蒙半抄的搞过去了… 主要参考以下http://blog.csdn.net/acdreamers/article/details/9406735http://blog.csdn ...
- 一个无聊的python + opencv 示例
opencv不用多说,先推荐一个给力的教程: https://opencv-python-tutroals.readthedocs.io/en/latest/py_tutorials/py_tutor ...
- jdbc执行预处理,批处理,LOB字段处理,调用存储过程
(1)jdbc执行预处理 PreparedStatment预备语句 eg:String sql="insert into user(id,name,birthday,money) value ...
- web开发流程(传智播客-方立勋老师)
1.搭建开发环境 1.1 导入项目所需的开发包 dom4j-1.6.1.jar jaxen-1.1-beta-6.jar commons-beanutils-1.8.0.jar commons-log ...
- JS 跑马灯
利用jquery 来实现图片切换.文字转换移动的工具. MSClass 连接 http://www.popub.net/script/MSClass.html Mark 用
- JAVA第三周作业(从键盘输入若干数求和)
JAVA第三周作业(从键盘输入若干数求和) 在新的一周,我学习了JAVA的IO编程.下面的代码实现了从键盘输入若干数求和的目标.import java.util.Scanner; public cla ...
- PHP 关于SQL注入的防范措施。
最近在使用框架的时候还是有点不安,不知道框架的设计者有没有考虑到SQL-Injection的问题,我在顶层需不需要做一些必要的过滤等等,由 此我特意的去StackOverflow看了下,真是获益良多, ...
- 北大poj-1081
You Who? Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 801 Accepted: 273 Descriptio ...
- JS总结 循环 退出循环 函数
while循环 while(条件){条件成立就执行的代码} *一般条件变量需要递增,否则会进入死循环(无限循环),浏览器会崩溃甚至电脑死机 例如,逐行输出1-100的数字 var i = 1; whi ...