码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-05-21 15:38:06      阅读:2131      评论:0      收藏:0      [点我收藏+]

标签:bmp   图像处理   源码   c++   bmp文件   

             

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


输入文件名:

技术分享


显示图片:

技术分享


存储的文件:

技术分享

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

标签:bmp   图像处理   源码   c++   bmp文件   

原文地址:http://blog.csdn.net/carvin_zh/article/details/45891923

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!