`
feng88724
  • 浏览: 172596 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

C语言读取BMP图像,颜色反白,图像拷贝(兼容24位)

阅读更多
#include <windows.h> 
#include <stdio.h> 
#include <stdlib.h> 
#include <ctype.h> 
#include <string.h> 
#include <malloc.h> 

#define WIDTHBYTES(i) ((i+31)/32*4) 
//#pragma warning(disable: 4996) 
int main() 
{
	BITMAPFILEHEADER bf; //BMP文件头结构体
	BITMAPINFOHEADER bi; //BMP信息头结构体
	
	FILE* fp;			//指向文件的指针
	RGBQUAD *ipRGB;		//
	DWORD LineByte,ImgSize; 
	DWORD NumColors; 
	unsigned char * * Imgdata; 
	int i,j; 
	char fileName[256]; 
	
	//打开文件
	printf("please enter filename:"); 
	scanf("%s",fileName); 
	fp=fopen(fileName,"rb"); 
	if(fp == NULL){
		printf("Open file error!");
		exit(0);
	}

	//读取信息头、文件头
	fread(&bf,sizeof(BITMAPFILEHEADER),1,fp); //把指针fp所指向的文件的头信息写入bf(地址)
	fread(&bi,sizeof(BITMAPINFOHEADER),1,fp); 


	LineByte=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); //计算位图的实际宽度并确保它为32的倍数
	ImgSize=(DWORD)LineByte*bi.biHeight; 			

if (bi.biClrUsed != 0 ) 
	NumColors=(DWORD)bi.biClrUsed; 
else 
	switch (bi.biBitCount) 
	{	
		case 1:NumColors=2;break; 
		case 4:NumColors=16;break; 
		case 8:NumColors=256;break; 
		case 24:NumColors=0;break; 
	} 
//分配调色板内存
if(bi.biBitCount!=24){
	ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD)); 
	fread(ipRGB,sizeof(RGBQUAD),NumColors,fp); 
}

Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组
if(bi.biBitCount==24){
	fseek(fp, 4, SEEK_CUR);//sizeof(RGBQUAD)

	for ( i=(bi.biHeight)-1;i>=0;i--) 
		Imgdata[i]=new unsigned char[bi.biWidth*3]; //每个数组元素也是一个指针数组

	for ( i=(bi.biHeight)-1;i>=0;i--) 
		for(j=0;j<bi.biWidth*3;j++) 
			fread(&Imgdata[i][j],1,1,fp);//每次只读取一个1字节,存入数组 
} else {

	for ( i=(bi.biHeight)-1;i>=0;i--) 
		Imgdata[i]=new unsigned char[bi.biWidth]; //每个数组元素也是一个指针数组

	for ( i=(bi.biHeight)-1;i>=0;i--) 
		for(j=0;j<bi.biWidth;j++) 
			fread(&Imgdata[i][j],1,1,fp);//每次只读取一个1字节,存入数组
}

fclose(fp); 
//写入另一个文件
fp=fopen("mybmp.bmp","wb"); 
fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fp); 
fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fp); 

if(bi.biBitCount!=24){
	fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);

	for (i=(bi.biHeight)-1 ;i>=0;i--) 
	for (j=0 ;j<bi.biWidth;j++) {
		Imgdata[i][j] = 255 - Imgdata[i][j];
		fwrite(&Imgdata[i][j],1,1,fp); 
	}
}else{
	for (i=(bi.biHeight)-1 ;i>=0;i--) 
		for (j=0 ;j<bi.biWidth*3;j++) {
			Imgdata[i][j] = 255 - Imgdata[i][j];
			fwrite(&Imgdata[i][j],1,1,fp); 
	}
}
free(Imgdata); 
fclose(fp); 
return 0; 

} 
  • aaa.zip (2.1 MB)
  • 下载次数: 31
  • aaa.zip (2.9 MB)
  • 下载次数: 27
分享到:
评论

相关推荐

    bmp位图的简单处理(灰度化,拷贝,左右旋转)(C语言)

    在VS2010环境下,你可以创建一个C语言项目,包含这些函数,并读取BMP文件,执行相应的处理,然后将结果写入新的BMP文件。这个项目文件包含了完整的源代码和资源,方便你学习和实践。 总结来说,通过理解和操作BMP...

    把真彩色BMP位图转化为二维数组

    - **位图信息头**:包括位图的宽度和高度、颜色平面数、位每像素、压缩方法、图像大小、水平分辨率、垂直分辨率以及使用的颜色数和重要的颜色数。 - **像素数据**:图像的实际像素值,按照从下到上的顺序存储。 ###...

    simplified image processing in C_图像处理c_

    C语言处理图像时,需要读取和写入这些格式的数据。例如,BMP文件格式相对简单,可以直接按像素数组读取和写入,而JPEG和PNG则需要解码和编码算法。 3. 图像读取与写入: 使用C语言,可以使用库函数如libpng或jpeg...

    gif2bmp(2).rar_gif2bmp

    - BMP文件以固定格式的文件头开始,包括文件大小、图像偏移量、DIB(Device Independent Bitmap)头大小、宽度、高度、颜色位深度等信息。 - 根据GIF的色彩信息,确定BMP文件的颜色位深度,可能是8位(256色)或更...

    基于OPENCV和CVui的智能车图像处理

    本项目通过OPENCV读取bmp文件为mat数据,并利用mat数据进行显示和存储 在imageDeal和imagePreDeal文件中,对由mat结构数据转换而来的二值化数组进行访问和处理。这些文件全部使用C语言编程,其中的程序可以直接...

    用Visual C++设计屏幕抓图程序

    在Windows中,当用户按下PrintScreen键时,系统会将当前屏幕的图像拷贝到系统剪贴板。通过编程的方式,我们可以直接从屏幕缓冲区读取这些像素数据,而不必通过剪贴板,从而实现自动化保存图像文件的功能。 现在,让...

    CA24064B (T6963c)keilc51示例程序

    - `CheckScreen()`: 检测屏读/屏拷贝错误状态,如果液晶模块的某个状态位为1,则表示存在错误,否则为正常。 - `LcmWriteData()`: 写入单个数据到液晶模块的数据显示端口。 - `LcmReadData()`: 从液晶模块读取...

    C++MFC教程

    而且C++本身所具备的超越C语言的特性都可以使开发者编写出更易用,更灵活的代码。 在MFC中对消息的处理利用了消息映射的方法,该方法的基础是宏定义实现,通过宏定义将消息分派到不同的成员函数进行处理。下面简单...

Global site tag (gtag.js) - Google Analytics