C++读取和存储一幅BMP图像
转载请注明出处
之前写过一篇介绍BMP格式的文章,这是C++处理数字图像的基础,只有知道了BMP文件在计算机里的存储结构,才能谈之后的图像处理。这里是连接地址:http://blog.csdn.net/carvin_zh/article/details/45875277
C++源码:
#include<iostream> #include<Windows.h> #include<malloc.h> #include<stdlib.h> #include<stdio.h> #include<string.h> using namespace std; void main () { char fileName[30]; //定义打开图像名字 char *buf; //定义文件读取缓冲区 char *p; int r,g,b,pix; HWND wnd; //窗口句柄 HDC dc; //绘图设备环境句柄 FILE *fp; //定义文件指针 FILE *fpw; //定义保存文件指针 DWORD w,h; //定义读取图像的长和宽 DWORD bitCorlorUsed; //定义 DWORD bitSize; //定义图像的大小 BITMAPFILEHEADER bf; //图像文件头 BITMAPINFOHEADER bi; //图像文件头信息 cout<<"请输入要打开文件的名字:"; cin>>fileName; if((fp=fopen(fileName,"rb"))==NULL) { cout<<"文件未找到!"; exit(0); } fread(&bf,sizeof(BITMAPFILEHEADER),1,fp);//读取BMP文件头文件 fread(&bi,sizeof(BITMAPINFOHEADER),1,fp);//读取BMP文件头文件信息 w=bi.biWidth; //获取图像的宽 h=bi.biHeight; //获取图像的高 bitSize=bi.biSizeImage; //获取图像的size buf=(char*)malloc(w*h*3); //分配缓冲区大小 fseek(fp,long(sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)),0);//定位到像素起始位置 fread(buf,1,w*h*3,fp); //开始读取数据 wnd=GetForegroundWindow(); //获取窗口句柄 dc=GetDC(wnd); //获取绘图设备 int x=40; int y=40; p=buf; for(int j=0;j<h;j++) { for(int i=0;i<w;i++) { b=*p++;g=*p++;r=*p++; pix=RGB(r,g,b); SetPixel(dc,x+i,y+h-j,pix); } } fpw=fopen("LenaSaved.bmp","wb"); fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fpw); //写入文件头 fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fpw); //写入文件头信息 p=buf; for(int j=0;j<h;j++) { for(int i=0;i<w*3;i++) { fwrite(p++,1,1,fpw); } } fclose(fpw); fclose(fp); //return fp; }
输入文件名:
显示图片:
存储的文件:
原文地址:http://blog.csdn.net/carvin_zh/article/details/45891923