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图片格式及读取的更多相关文章

  1. c语言数字图像处理(一):bmp图片格式及灰度图片转换

    本篇文章首先介绍了bmp图片格式,主要参考wiki上的内容,包括bmp文件的存储方式,对于一些常见的bmp文件格式都给了例子,并且对8位 16位RGB555 16位RGB565格式的bmp文件进行了简 ...

  2. BMP图片格式

    BMP图片 BMP采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大.BMP文件的图像深度可选lbit.4bit.8bit及24bit和32bit.BMP文 ...

  3. BMP图片格式模型(2)

    因为公司的主要业务是图像识别相关的,因此对图像处理.识别是我学习的重点.虽然写程序也不少年了,但是对于图像处理领域,我还是一个新兵.对很多基础的概念也还是存在盲区,所以想在边学边做的过程中,对一些概念 ...

  4. BMP图片格式模型

    BMP BMP(全称Bitmap)是Window操作系统中的标准图像文件格式 可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广. 它采用位映射存储格式,除了图像深度可选以外,不 ...

  5. BMP 图片格式

     BMP根据颜色深度,可以分为2(1位).16(4位).256(8位).65536(16位)和1670万(24位)以及32位含有alpha通道.8位图像可以是 索引彩色图像外,也可以是灰阶图像,而索引 ...

  6. VC++使用CImage在内存中Jpeg转换Bmp图片

    VC++中Jpeg与Bmp图片格式互转应该是会经常遇到,Jpeg相比Bmp在图片大小上有很大优势. 本文重点介绍使用现有的CImage类在内存中进行转换,不需要保存为文件,也不需要引入第三方库. Li ...

  7. BMP图片解析

    本博客参考:https://www.cnblogs.com/l2rf/p/5643352.html 一.简介 BMP(Bitmap-File)图形文件是Windows采用的图形文件格式,在Window ...

  8. linu下C语言之BMP图片操作编程(上)

    BMP文件格式,也被称为位图图像文件或与设备无关的位图文件格式(DIB)或者只是一个位图,是 一个光栅图形 图像文件格式使用 来存储位图,数字,图片,独立的显示设备. 微软已经定义了一个特定的表示颜色 ...

  9. OPENGL 显示BMP图片+旋转

    VS2010/Windows 7/ 1. 需包含头文件 stdio.h, glaux.h, glut.h.需要对应的lib,并添加包含路径 2. 窗口显示用glut库的函数 3. bmp图片从本地读取 ...

随机推荐

  1. 用nodejs实现读取文件操作

    //如果不是全局就得引入fs成员 const fs = require("fs"); //fs 核心模块中提供了一个 fs.readFile方法,来读取指定目录下的文件 //fs. ...

  2. JavaWeb CSS

    1. CSS介绍 1.1. 什么是CSS CSS全称为Cascading Style Sheets,译为层叠样式表. 样式定义如何显示HTML元素. 样式通常存储在样式表中. 1.2. 百度百科 CS ...

  3. ASP.NET MVC 5 访问在views文件夹中的JS文件。 ASP.NET MVC html与JS分离

    修改VIEWS文件夹下的web.config文件, 加入下面红色字标识的内容:    <system.webServer>     <handlers>       <r ...

  4. MongoDB快速入门(六)- 更新文档

    更新文档 MongoDB的update()和save()方法用于更新文档到一个集合. update()方法将现有的文档中的值更新,而save()方法使用传递到save()方法的文档替换现有的文档. M ...

  5. VMware ESXI 6.5安装教程

    设置从IPMI Virtual Disk 3000启动,出现如下界面: 默认选择第一项,回车安装 安装程序正在检测服务器硬件信息,如果不满足系统安装条件会跳出错误提示. 检测完成之后会出现下面界面 回 ...

  6. CCNA 课程 七

    WAN(Wide Area Network)广域网 运行在OSI模型的数据链路层.物理层. 数据链路层的协议主要有: HDLC  (High-Level Data Link Control 高级数据链 ...

  7. window.open、window.showModalDialog和window.showModelessDialog 的区别[转]

    一.前言 要打开一个可以载入页面的子窗口有三种方法,分别是window.open.window.showModalDialog和window.showModelessDialog. open方法就是打 ...

  8. nginx 反向代理配置之---可配置多域名请求

    配置文件如下: server { listen 80; server_name ngin服务器所对应的的域名; error_log /data/logs/nginx/mainsite.error.lo ...

  9. Django中间件的总结

    一.中间件 --中间件是一个轻量级.底层的插件系统,可以加入Django的请求和响应过程,修改Django的输入和输出 --每一个中间件组件是一个独立的Python类,可以定义下面方法中的一个和多个 ...

  10. Python-flask中数据库连接池DBUtils

    一.DBUtils DBUtils是Python的一个用于实现数据库连接池的模块. 连接池的三种模式: 第一种模式:             它的缺点:每一次请求反复创建数据库的链接,链接的次数太多 ...