c++图像处理:24位真彩图颜色变换

原创 2015年11月20日 16:07:57


#include<iostream>
#include<Windows.h>
using namespace std;

bool isred(BYTE r,BYTE g,byte b){
	if(r>g&&r>b) return true;
	else return false;
}
void red2green(BYTE& r,BYTE& g,BYTE& b){
	BYTE tmp=r;
	r=g;
	g=tmp;
}

int main(){
	FILE *fpin=fopen("flo.bmp","rb+");
	if(fpin==NULL){
		cout<<"目录里没有输入图"<<endl;
		system("pause");
		return 0;
	}
	BITMAPFILEHEADER bitmapfileheader;
	BITMAPINFOHEADER bitmapinfoheader;
	fread(&bitmapfileheader,sizeof(bitmapfileheader),1,fpin);
	fread(&bitmapinfoheader,sizeof(bitmapinfoheader),1,fpin);

	if(bitmapfileheader.bfType!='B'+'M'*256){
		cout<<"不是bmp格式"<<endl;
		fclose(fpin);
		system("pause");
		return 0;
	}
	if(bitmapinfoheader.biBitCount!=24){
		cout<<"不是24位bmp"<<endl;
		fclose(fpin);
		system("pause");
		return 0;
	}


	//设置fpout
	FILE *fpout=fopen("output.bmp","wb+");

	//BITMAPFILEHEADER bitmapfileheader2;
	//BITMAPINFOHEADER bitmapinfoheader2;
	//bitmapfileheader2=bitmapfileheader;
	//bitmapinfoheader2=bitmapinfoheader;
	fwrite(&bitmapfileheader,sizeof(bitmapfileheader),1,fpout);
	fwrite(&bitmapinfoheader,sizeof(bitmapinfoheader),1,fpout);



	if(bitmapinfoheader.biClrUsed!=0){
		cout<<"是索引图"<<endl;
		system("pause");
		return 0;
	}
	if(bitmapinfoheader.biBitCount==24){
		cout<<"24位真彩图"<<endl;
		//int line_width=((bitmapinfoheader.biWidth*bitmapinfoheader.biBitCount+24)/32)*4;
		int line_width=bitmapinfoheader.biWidth*3;
		BYTE *line_buf=new BYTE[line_width];
		for(int i=0;i<bitmapinfoheader.biHeight;i++){
			fread(line_buf,line_width,1,fpin);			
			for(int j=0;j<bitmapinfoheader.biWidth;j++){
				BYTE b=line_buf[3*j];
				BYTE g=line_buf[3*j+1];
				BYTE r=line_buf[3*j+2];
				if(isred(r,g,b)){
					red2green(line_buf[3*j+2],line_buf[3*j+1],line_buf[3*j]);
				}
			}	
			fwrite(line_buf,line_width,1,fpout);
		}
		fclose(fpin);
		fclose(fpout);
		delete []line_buf;
		cout<<"红变绿完成"<<endl;
	}
	
	system("pause");
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

【数字图像】C++8位和24位BMP位图的平滑、锐化、二值化处理,以及24位真彩图的灰度化

由于8位和24位BMP的像素存储方式不同,所以不能用相同的函数对位图进行处理,因此我设计了两个类分别处理8位和24位BMP。 程序运行时,首先提示输入位图深度。 然后输入位图名称。 程序会...

C++8位和24位bmp位图平滑、锐化和二值处理,24位真彩图的灰度化

BMP头文件: [cpp] view plain copy   #ifndef BMP_H//预处理器   #define BMP_H      ...

C/C++ BMP(24位真彩色)图像处理(5)------图像の线性变换

图像的线性变换,是比较容易理解的。由线性变换公式y=kx+b知道,图像的像素点灰度值为x,经由线性变换输出y再替换掉原像素点的灰度值x实现映射。其作用是当图像像素的灰度值集中在一定范围如[a,b]时,...

C/C++ BMP(24位真彩色)图像处理(5)------图像の线性变换

在图像的像素点灰度值基本集中在一个段落的时候,图像中物体与物体之间的区别是很不明显的(也就是说图像的对比度比较低)。这种情况可以采用“线性变换”来对图像加以处理。 图像的线性变换,是比较容易理解的。由...

24位真彩图分离三通道以及分解位平面 c-c++实现

1.将24bit Lena图分离出红、绿、蓝三通道 2.将真彩图的8个位平面分别提取出来 #include #include #include #include using nam...

24位真彩图转8位灰度图并分解位平面 c-c++实现

上一篇博客里写到了24位真彩图转八位灰度图的方法,这一篇博客是在上个代码的基础上,添加了分解灰度图8个位平面的功能。 #include #include #include #include #...

C/C++ BMP(24位真彩色)图像处理(3)------图像の放大缩小(双线性插值)

原文链接:http://blog.csdn.net/weixinhum/article/details/38963705     图像的放大缩小其实是一回事,都是先创建一张空白目标图像(放大缩小...

C/C++ BMP(24位真彩色)图像处理(3)------图像の放大缩小(双线性插值)

图像的放大缩小其实是一回事,都是先创建一张空白目标图像(放大缩小后的图像),其大小就是想要放大缩小后所得到的图像大小。创建图像后我们并不知道这张图像里面的各个像素点RGB(或灰度)值是多少,这个时候就...

C/C++ BMP(24位真彩色)图像处理(2)------图像の截取

对上一篇博客《图像处理模板---针对bmp图像数据区的操作和输出处理完成图像》...

C/C++ BMP(24位真彩色)图像处理(4)------图像の旋转

历经一个多月,CSDN貌似终于好像把文章列表阅读量信息归零BUG给修好了,于是乎放篇做期末大作业时写的文章上来测测效果,可别又像上次一样一发文章就又坑爹了啊!     本篇谈的是图像的旋转,不算是什...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:c++图像处理:24位真彩图颜色变换
举报原因:
原因补充:

(最多只允许输入30个字)