bmp图片格式及读取
C++读取bmp图片的例子
- #include <windows.h>
- #include <stdio.h>
- #include <stdlib.h>
- #include <malloc.h>
- #define WIDTHBYTES(x) ((x+31)/32*4)
- #define my(x) ( ( (x + 31) & ~31) / 8)
- BITMAPFILEHEADER bf; //BMP文件头结构体
- BITMAPINFOHEADER bi; //BMP信息头结构体
- int i,j;
- RGBQUAD *ipRGB; //颜色表
- DWORD NumColors; //颜色表数目
- unsigned char ** Imgdata;
- void read(char*);
- void display();
- void org(char*);
- void gray(char*);
- void test()
- {
- DWORD LineByte;
- DWORD ImgSize;
- LineByte=(DWORD)my(bi.biWidth*bi.biBitCount); //计算位图的实际宽度并确保它为32的倍数
- ImgSize=(DWORD)LineByte*bi.biHeight;
- printf("LineByte is %d. \n", LineByte);
- printf("ImgSize is %d. \n", ImgSize);
- }
- int main()
- {
- char *filename;
- filename="U616.bmp";
- read(filename);
- display();
- test();
- org("123.bmp");
- free(Imgdata);
- // printf("<2>");
- // display();
- free(ipRGB);
- system("pause");
- return ;
- }
- void read(char* filename)
- {
- FILE* fp;
- fp=fopen(filename,"rb");
- if(fp == NULL)
- {
- printf("Open file error!");
- exit();
- }
- //读取信息头、文件头
- fread(&bf,sizeof(BITMAPFILEHEADER),,fp);
- fread(&bi,sizeof(BITMAPINFOHEADER),,fp);
- if (bi.biClrUsed != )
- NumColors=(DWORD)bi.biClrUsed;
- else
- switch (bi.biBitCount)
- {
- case : NumColors=; break;
- case : NumColors=; break;
- case : NumColors=; break;
- case : NumColors=; break;
- }
- //分配调色板内存
- ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));
- fread(ipRGB,sizeof(RGBQUAD),NumColors,fp);
- Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组
- if(bi.biBitCount==)
- {
- for ( i=(bi.biHeight)-;i>=;i--)
- Imgdata[i]=new unsigned char[bi.biWidth*]; //每个数组元素也是一个指针数组
- for ( i=(bi.biHeight)-;i>=;i--)
- for(j=;j<bi.biWidth*;j++)
- fread(&Imgdata[i][j],,,fp);//每次只读取一个1字节,存入数组
- }
- else
- {
- for ( i=(bi.biHeight)-;i>=;i--)
- Imgdata[i]=new unsigned char[bi.biWidth];
- for ( i=(bi.biHeight)-;i>=;i--)
- for(j=;j<bi.biWidth;j++)
- fread(&Imgdata[i][j],,,fp);
- }
- fclose(fp);
- }
- void org(char *filename)
- {
- FILE* fp;
- fp=fopen(filename,"wb");
- fwrite(&bf,sizeof(BITMAPFILEHEADER),,fp); //写文件头
- fwrite(&bi,sizeof(BITMAPINFOHEADER),,fp); //写信息头
- fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);//写颜色头
- if(bi.biBitCount==)
- for (i=(bi.biHeight)- ;i>=;i--)
- for (j= ;j<my(bi.biWidth*);j++)
- fwrite(&Imgdata[i][j],,,fp);
- else
- for (i=(bi.biHeight)- ;i>=;i--)
- for (j= ;j<bi.biWidth;j++)
- fwrite(&Imgdata[i][j],,,fp);
- fclose(fp);
- }
- void gray(char *filename)
- {
- FILE* fp;
- fp=fopen(filename,"wb");
- /*
- bf.bfOffBits=(DWORD)1078;
- bi.biSizeImage=(DWORD)(bi.biWidth*bi.biHeight);
- bf.bfSize=bi.biSizeImage+bf.bfOffBits;
- bi.biBitCount=(WORD)8;
- bi.biClrUsed=(DWORD)256;
- bi.biClrImportant=(DWORD)256;
- bi.biXPelsPerMeter=(LONG)0;
- bi.biYPelsPerMeter=(LONG)0;
- NumColors=(DWORD)bi.biClrUsed;
- ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));
- */
- fwrite(&bf,sizeof(BITMAPFILEHEADER),,fp); //写文件头
- fwrite(&bi,sizeof(BITMAPINFOHEADER),,fp); //写信息头
- fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);//写颜色头
- char temp;
- for (i=(bi.biHeight)- ;i>=;i--)
- for (j= ;j<bi.biWidth*;j++)
- if(j%==)
- {
- temp=(Imgdata[i][j]*+Imgdata[i][j+]*+Imgdata[i][j+]*)>>;
- fwrite(&temp,,,fp);
- }
- else
- {
- fwrite(&temp,,,fp);
- }
- fclose(fp);
- }
- void display()
- {
- printf("tagBITMAPFILEHEADER info is: %d\n",sizeof(BITMAPFILEHEADER));
- printf("bfType is %d.\n", bf.bfType);
- printf("bfSize is %d.\n", bf.bfSize);
- printf("bfReserved1 is %d.\n", bf.bfReserved1);
- printf("bfReserved2 is %d.\n", bf.bfReserved2);
- printf("bfOffBits is %d.\n", bf.bfOffBits);
- printf("\ntagBITMAPINFOHEADER info is: %d\n",sizeof(BITMAPINFOHEADER));
- printf("biSize is %d. \n", bi.biSize);
- printf("biWidth is %ld.\n", bi.biWidth);
- printf("biHeight is %ld.\n", bi.biHeight);
- printf("biPlanes is %d. \n", bi.biPlanes);
- printf("biBitCount is %d. \n", bi.biBitCount); //每像素所需位数
- printf("biCompression is %d. \n", bi.biCompression);
- printf("biSizeImage is %d. \n", bi.biSizeImage);
- printf("biXPelsPerMerer is %ld.\n", bi.biXPelsPerMeter); //每米像素数
- printf("biYPelsPerMerer is %ld.\n", bi.biYPelsPerMeter);
- printf("biClrUsed is %d. \n", bi.biClrUsed);
- printf("biClrImportant is %d. \n", bi.biClrImportant);
- printf("\nNum of colors is %d. \n", NumColors);
- }
bmp图片格式及读取的更多相关文章
- c语言数字图像处理(一):bmp图片格式及灰度图片转换
本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...
- BMP图片格式
BMP图片 BMP采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit和32bit.BMP文 ...
- BMP图片格式模型(2)
因为公司的主要业务是图像识别相关的,因此对图像处理.识别是我学习的重点.虽然写程序也不少年了,但是对于图像处理领域,我还是一个新兵.对很多基础的概念也还是存在盲区,所以想在边学边做的过程中,对一些概念 ...
- BMP图片格式模型
BMP BMP(全称Bitmap)是Window操作系统中的标准图像文件格式 可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广. 它采用位映射存储格式,除了图像深度可选以外,不 ...
- BMP 图片格式
BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...
- VC++使用CImage在内存中Jpeg转换Bmp图片
VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...
- BMP图片解析
本博客参考:https://www.cnblogs.com/l2rf/p/5643352.html 一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Window ...
- linu下C语言之BMP图片操作编程(上)
BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备. 微软已经定义了一个特定的表示颜色 ...
- OPENGL 显示BMP图片+旋转
VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...
随机推荐
- MATLAB常用指令记录
help + 'command name' % 查询指令用法 Ctrl + Break % 强制终止程序运行 Shift + Enter % command window下换行不运行指令 M'; % ...
- 高通LCD驱动调试
本文转载自:http://www.itgo.me/a/x6305658852004979994/lcd%20qcom 来自 :http://blog.csdn.net/dacaozuo/article ...
- poj 2186 Popular Cows 【强连通分量Tarjan算法 + 树问题】
题目地址:http://poj.org/problem?id=2186 Popular Cows Time Limit: 2000MS Memory Limit: 65536K Total Sub ...
- linux运维面试题1
一.填空题 1. 在Linux 系统 中,以文件方式访问设备 . 2. Linux 内核引导时,从文件/etc/fstab中读取要加载的文件系统 . 3. Linux 文件系统中每个文件用indoe节 ...
- MyEclipse Could not create the view: An unexpected exception was thrown解决方案
问题:电脑突然断电,myeclipse非正常关闭,“Package Explorer”非正常显示,出现错误“Could not create the view: An unexpected excep ...
- setup in xunit
https://xunit.github.io/docs/shared-context Shared Context between Tests It is common for unit test ...
- R语言学习笔记(4)
第四章:基本数据管理 一 贯穿整章的示例 二 变量的创建.重编码和重命名 三 日期值与缺失值 四 数据类型和类型转换 五 数据集的排序.合并与取子集 一 贯穿整章的示例(leadership) ,, ...
- Windows 安装Mysql8.0 绿色包
〇.准备: MySQL8.0 Windows zip包下载地址:https://cdn.mysql.com//Downloads/MySQL-8.0/mysql-8.0.11-winx64.zip 环 ...
- 天地图OGC WMTS服务规则
图层名称 服务地址 投影类型 矢量底图 http://t0.tianditu.gov.cn/vec_c/wmts?tk=您的密钥 经纬度投影 http://t0.tianditu.gov.cn/vec ...
- cell 配置
Cells Cell configuration options Configure the API (top-level) cell Configure the child cells Config ...