您的位置:首页 > 编程语言 > C语言/C++

C++读取和存储一幅BMP图像

2015-05-21 14:58 411 查看
C++读取和存储一幅BMP图像

转载请注明出处

之前写过一篇介绍BMP格式的文章,这是C++处理数字图像的基础,只有知道了BMP文件在计算机里的存储结构,才能谈之后的图像处理。这里是连接地址:/article/10804223.html

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;
}


输入文件名:



显示图片:



存储的文件:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: