⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 imgbmpprocess.c

📁 用纯C写的读RGB文件格式的代码
💻 C
字号:
/*
  *	Filename:		ImgReadBMP.c
  *
  *	Read bmp file using standard C.
  *
  *	Author:		gomo
  *	Date:		2007-05-16
  */


#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "ImgBMPProcess.h"


//#define DEBUG_FLAG 

int
DhReadBMPImgInfo(
							IN char *pFileName, 
							OUT BmpFileHeader *pBmpFH,
							OUT BmpInfoHeader *pBmpIH
							)
{

	FILE* fp = 0;

	fp = fopen(pFileName,"rb");
	if(!fp)
	{
		fprintf(stderr,"can't open image file: %s\n",pFileName);
		fflush(stderr);
		return -1;
	}
 
	#ifdef DEBUG_FLAG
	printf("file header size=%d\n",sizeof(BmpFileHeader));
	printf("info header size=%d\n",sizeof(BmpInfoHeader));
	printf("header size=%d\n",sizeof(BmpFileHeader)+sizeof(BmpInfoHeader));
	#endif
	 
	BmpFileHeader* fileHeader = (BmpFileHeader*)calloc(1,sizeof(BmpFileHeader));

	if(!fileHeader)
	{
		fprintf(stderr,"Not enough memory.\n");
		fflush(stderr);
		return -2;
	}
	 
	if(fread(fileHeader, sizeof(BmpFileHeader), 1, fp) <=0)//读文件头
	{
		fprintf(stderr, "Read bmp file header failed.\n");
		return -3;

	}

	if(fileHeader->bfType != DIB_HEADER_MARKER)
	{
		fprintf(stderr, "Invalid image format.\n");
		fflush(stderr);
		free(fileHeader);
		return -4;
	}

	BmpInfoHeader* infoHeader = (BmpInfoHeader*)calloc(1,sizeof(BmpInfoHeader));
	if(!infoHeader) 
	{
		fprintf(stderr,"Not enough memory.\n");
		fflush(stderr);
		return -2;
	}
	 
	if(fread(infoHeader, sizeof(BmpInfoHeader), 1, fp) <=0)//读信息头
	{
		fprintf(stderr, "Read bmp file information failed.\n");
		return -5;
	}

	RGBQuad* palette = NULL;//调色板
	int numColors = 0;

	if(infoHeader->biClrUsed != 0)
	{
		numColors = infoHeader->biClrUsed;
//		printf("numcolors = %d.\n",numColors );
	}
	else 
	{
//		printf("numcolors = %d.\n",infoHeader->biBitCount );
		switch (infoHeader->biBitCount)
		{
			case 1:
				numColors = 2;
				break;
			case 4:
				numColors = 16;
				break;
			case 8:
				numColors = 256;
				break;
			case 24:
				numColors = 0;
				break;
			default:
				free(fileHeader);
				free(infoHeader);
				return -6;
		break;
	  }
	 }

	//验证图象数据
	if(fileHeader->bfOffBits != 
			 (sizeof(BmpInfoHeader)+sizeof(BmpFileHeader)+numColors*sizeof(RGBQuad)))
	{
		printf("color table (RGBQUAD list) error!\n");
		return -7;
	}
	if(numColors != 0)
	{
		palette = (RGBQuad*)calloc(numColors, sizeof(RGBQuad));
		if(!palette) 
		{
			fprintf(stderr,"Not enough memory.\n");
			fflush(stderr);
			return -2;
		}

		
		if(fread(palette, sizeof(RGBQuad) * numColors, 1, fp) <=0)//读调色板
		{
			fprintf(stderr, "Read color palette failed.\n");
			fflush(stderr);
			return -8;
		}


#ifdef DEBUG_FLAG
		int i = 0;
		for(i = 0; i<numColors; i++)
		{
			printf("%x %x %x %x\n",palette[i].rgbBlue,palette[i].rgbGreen,
				  palette[i].rgbRed,palette[i].rgbReserved);
		} 
#endif
	}

 
	#ifdef DEBUG_FLAG//打印信息
	printf("fileHeader->bfType=%d\n",fileHeader->bfType);
	printf("fileHeader->bfSize=%d\n",fileHeader->bfSize);
	printf("fileHeader->bfReserved1=%d\n",fileHeader->bfReserved1);
	printf("fileHeader->bfReserved2=%d\n",fileHeader->bfReserved2);
	printf("fileHeader->bfOffBits=%d\n",fileHeader->bfOffBits);
	 
	printf("infoHeader->biSize=%d\n",infoHeader->biSize);
	printf("infoHeader->biWidth=%d\n",infoHeader->biWidth);
	printf("infoHeader->biHeight=%d\n",infoHeader->biHeight);
	printf("infoHeader->biPlanes=%d\n",infoHeader->biPlanes);
	printf("infoHeader->biBitCount=%d\n",infoHeader->biBitCount);
	printf("infoHeader->biCompression=%d\n",infoHeader->biCompression);
	printf("infoHeader->biSizeImage=%d\n",infoHeader->biSizeImage);
	printf("infoHeader->biXPelsPerMeter=%d\n",infoHeader->biXPelsPerMeter);
	printf("infoHeader->biYPelsPerMeter=%d\n",infoHeader->biYPelsPerMeter);
	printf("infoHeader->biClrUsed=%d\n",infoHeader->biClrUsed);
	printf("infoHeader->biClrImportant=%d\n",infoHeader->biClrImportant);
	#endif
	 
	memcpy(pBmpFH, fileHeader, sizeof(BmpFileHeader));
	memcpy(pBmpIH, infoHeader, sizeof(BmpInfoHeader));
		 
	fclose(fp);
	free(palette);
	palette = NULL;
	free(infoHeader);
	infoHeader = NULL;
	free(fileHeader);
	fileHeader = NULL;

	return 0;
 }

int RGB2BGR(unsigned char *PBuf, int iWidthPix, int iHeightPix)
{
	if (PBuf==NULL)
		return -1;

	int col, row;
	unsigned char tmp;
	unsigned char *pRed, *pGrn, *pBlu;
	for (row=0;row<iHeightPix;++row) 
	{
		for (col=0;col<iWidthPix;++col) 
		{
			pRed = PBuf + row * iWidthPix * 3 + col * 3;
			pGrn = PBuf + row * iWidthPix * 3 + col * 3 + 1;
			pBlu = PBuf + row * iWidthPix * 3 + col * 3 + 2;

			// swap red and blue
			tmp = *pRed;
			*pRed = *pBlu;
			*pBlu = tmp;
		}
	}
	return 0;
}



int BGR2RGB(unsigned char *PBuf, int iWidthPix, int iHeightPix)
{
	if (PBuf==NULL)
		return -1;

	int col, row;
	unsigned char tmp;
	unsigned char *pRed, *pGrn, *pBlu;
	for (row=0;row<iHeightPix;++row) 
	{
		for (col=0;col<iWidthPix;++col) 
		{
			pBlu = PBuf + row * iWidthPix * 3 + col * 3;
			pGrn = PBuf + row * iWidthPix * 3 + col * 3 + 1;
			pRed = PBuf + row * iWidthPix * 3 + col * 3 + 2;

			// swap red and blue
			tmp = *pBlu;
			*pBlu = *pRed;
			*pRed = tmp;
		}
	}
	return 0;
}

/*
  *	Parameters:
  *	
  *	iBuffer:	BMP image file data buffer;
  *	iWidth:	image width;
  *	iHeight:	image height;
  *	iBits:	bitscount, such as 8,24
  *
  */
int BMPBufBottomToUp(unsigned char* pBuffer, int iWidth, int iHeight, int iBits)
{
	int i = 0; 
	int j = 0;
	
	int iImgWidth = iWidth * iBits  /8;
	unsigned char temp = 0;

	if (pBuffer==NULL)
		return -1;

	for(i = 0; i < iHeight /2; ++i)
	{
		for(j = 0; j <iImgWidth; ++j )
		{
			temp = pBuffer[i*iImgWidth + j];
			pBuffer[i*iImgWidth + j] = pBuffer[(iHeight-1-i) * iImgWidth +j];
			pBuffer[(iHeight-1-i) * iImgWidth +j]  = temp;	
		}
	}	
	return 0;
}



⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -