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

📄 bmpfmt.cpp

📁 convert bitmap for vxworks use format
💻 CPP
字号:
#include "stdafx.h"
#include "bmpfmt.h"

int	bmpState ;
int	bmpDesired ;
int	indexFile;
int	nbBmpColor ;
BMP_FMT bmpGlobal;
int dataCount;
BYTE bmpOutput;
int  pixelCount;
extern char filename[256];
extern char fullname[256];
BYTE *pImageData;
int indexImageData;
int newWidth;

int bmpInit (void)
{
	bmpState  = BMPSTATE_FILE_HDR;
	bmpDesired = 2;
	memset ((BYTE*)&bmpGlobal, 0, sizeof(bmpGlobal));
	indexFile = 0;
	nbBmpColor = 0;
	dataCount = -1;
	pixelCount = 0;
	indexImageData = 0;
	pImageData = (BYTE*)NULL;
	return 0;
}

int bmpProcessFileHdr (BYTE inp)
{
	switch (indexFile)
	{
	case 0:	case 1:
		bmpGlobal.filehdr.type >>= 8;
		bmpGlobal.filehdr.type |= inp<<8;
		break;
	case 2: case 3: case 4: case 5:
		bmpGlobal.filehdr.fileSize >>= 8;
		bmpGlobal.filehdr.fileSize |= inp<<24;
		break;
	case 6: case 7: case 8: case 9:
		break;
	case 10: case 11: case 12: case 13:
		bmpGlobal.filehdr.offset >>= 8;
		bmpGlobal.filehdr.offset |= inp<<24;
		if(indexFile==13) bmpState = BMPSTATE_INFO_HDR;
	}
	return 0;
}

int bmpProcessInfoHdr (BYTE inp)
{
	switch (indexFile)
	{
	case 14: case 15: case 16: case 17:
		bmpGlobal.infohdr.infoSize >>= 8;;
		bmpGlobal.infohdr.infoSize |= inp<<24;
		break;
	case 18: case 19: case 20: case 21:
		bmpGlobal.infohdr.width >>= 8;
		bmpGlobal.infohdr.width |= inp<<24;
#if 0
		if ((bmpGlobal.infohdr.width%16))
		{
			newWidth = ((bmpGlobal.infohdr.width/16)+1)*16;
			printf ("Round Off Error %d\n", newWidth);
		}
		else
			newWidth = bmpGlobal.infohdr.width;
#endif
		break;
	case 22: case 23: case 24: case 25:
		bmpGlobal.infohdr.height >>= 8;
		bmpGlobal.infohdr.height |= inp<<24;
		break;
	case 26: case 27: 
		bmpGlobal.infohdr.planes >>= 8;
		bmpGlobal.infohdr.planes |= inp<<24;
		break;
	case 28: case 29:
		bmpGlobal.infohdr.bitCount >>= 8;
		bmpGlobal.infohdr.bitCount |= inp<<8;
		break;
	case 30: case 31: case 32: case 33:
		bmpGlobal.infohdr.compression >>= 8;
		bmpGlobal.infohdr.compression |= inp<<24;
		break;
	case 34: case 35: case 36: case 37:
		bmpGlobal.infohdr.sizeImage >>= 8;
		bmpGlobal.infohdr.sizeImage |= inp<<24;
		newWidth = (bmpGlobal.infohdr.sizeImage * 8)/bmpGlobal.infohdr.height
					/bmpGlobal.infohdr.bitCount;
		break;
	case 38: case 39: case 40: case 41:
		bmpGlobal.infohdr.xResolution >>= 8;
		bmpGlobal.infohdr.xResolution |= inp<<24;
		break;
	case 42: case 43: case 44: case 45:
		bmpGlobal.infohdr.yResolution >>= 8;
		bmpGlobal.infohdr.yResolution |= inp<<24;
		break;
	case 46: case 47: case 48: case 49:
		bmpGlobal.infohdr.colorUsed >>= 8;
		bmpGlobal.infohdr.colorUsed |= inp<<24;
		break;
	case 50: case 51: case 52: case 53:
		bmpGlobal.infohdr.colorImportant >>= 8;
		bmpGlobal.infohdr.colorImportant |= inp<<24;
		if (indexFile==53) bmpState = BMPSTATE_RGB;
		break;	
	}
	return 0;
}

int bmpProcessRgb (BYTE inp, int index, int color)
{
	switch (index)
	{
	case 0:
		bmpGlobal.rgb[color].blue = inp;
		break;
	case 1:
		bmpGlobal.rgb[color].green = inp;
		break;
	case 2:
		bmpGlobal.rgb[color].red = inp;
		break;
	case 3:
		bmpGlobal.rgb[color].reserved = inp;
		break;
	}
	return 0;
}

int bmpStore (BYTE color)
{
	int row, col;

	//row = bmpGlobal.infohdr.height - 1 - (indexImageData)/(bmpGlobal.infohdr.width);
	//col = (indexImageData)%(bmpGlobal.infohdr.width);
	row = bmpGlobal.infohdr.height - 1 - (indexImageData)/(newWidth);
	col = (indexImageData)%(newWidth);
	//printf ("(%d:%d:%d:%d:%d)\n",indexImageData,row,col,color,row*(newWidth)+col);
	indexImageData++;
	pImageData[row*(newWidth)+col] = color;	//bmpOutput;
#if 0
	switch (pixelCount++)
	{
	case 0:
		bmpOutput = color;
		break;
	case 1:
		bmpOutput <<= 2;
		bmpOutput |= color;
		break;
	case 2:
		bmpOutput <<= 2;
		bmpOutput |= color;
		break;
	case 3:
		bmpOutput <<= 2;
		bmpOutput |= color;
		pixelCount = 0;
		/**
	    if(++dataCount == 8)
	    {
			dataCount = 0;
			printf ("\n");
	    }
		**/
		row = bmpGlobal.infohdr.height - 1 - (indexImageData*4)/(bmpGlobal.infohdr.width);
		col = (indexImageData*4)%(bmpGlobal.infohdr.width);
		//printf ("(%d:%d:%d)",row,col,indexImageData);
		indexImageData++;
		pImageData[row*(bmpGlobal.infohdr.width)+col] = color;	//bmpOutput;
		//printf ("%d:",indexFile);
		/**
		if ((bmpGlobal.filehdr.fileSize-1) == (indexFile))
			printf ("0x%.2X", bmpOutput);
		else
			printf ("0x%.2X, ", bmpOutput);
		/**/
		//break;
	}
#endif
	return 0;
}

BYTE color4Convert (BYTE color)
{
	BYTE result;
	int phycolor;

	phycolor = bmpGlobal.rgb[color].blue + bmpGlobal.rgb[color].green +
				bmpGlobal.rgb[color].red;

	//printf ("%2X %2X %2x\n",bmpGlobal.rgb[color].blue,bmpGlobal.rgb[color].green,
		//bmpGlobal.rgb[color].red);
	if (phycolor == 0 ) result = 3;
	else if (phycolor == 0x2fD) result = 0;
	else if (phycolor > 0x1E0) result = 1;
	else result = 2;
	//printf ("phycolor = %4x %d\n",phycolor, result);

#if 0
	switch (color)
	{
	case 0: // black
		result = 3;
		break;
	case 1: case 2: case 3: case 4: case 5: case 6: case 7:
		result = 2;
		break;
	case 8: case 9: case 10: case 11: case 12: case 13: case 14:
		result = 1;
		break;
	case 15:
		result = 0;
		break;
	}
#endif
	return result;
}

int bmpProcessData (BYTE inp)
{
	BYTE color;
	
	switch (bmpGlobal.infohdr.bitCount)
	{
	case 4:
		//printf ("%d:", indexFile-118);
		color = color4Convert ((inp & 0xf0)>>4);
		bmpStore (color);
		color = color4Convert ((inp & 0x0f));
		bmpStore (color);
		break;
	}
	return 0;
}

int bmpPrint1 (FILE *fpo)
{
#if 0
	int diff;
	printf ("Nb bits per pixel= %d\n",bmpGlobal.infohdr.bitCount);
	printf ("Image Width= %d\n",bmpGlobal.infohdr.width);
	printf ("Image Height= %d\n",bmpGlobal.infohdr.height);
	printf ("File Size= %d\n",bmpGlobal.filehdr.fileSize);
	printf ("Image Size= %d\n",bmpGlobal.infohdr.sizeImage);
	diff = bmpGlobal.filehdr.fileSize - bmpGlobal.infohdr.sizeImage;
	printf ("Data Start= %d\n",diff);
#endif
	fprintf (fpo,"#include <ugl/ugl.h>\n");
	fprintf (fpo,"#include <ugl/ugldib.h>\n");
	fprintf (fpo,"UGL_LOCAL UGL_UINT8 imageData%s [] = \n{\n",filename);
	return 0;
}

#if 0
int bmpPrintData (FILE *fpo)
{
	int i, col;
	int nb;
	col = -1;
	nb= bmpGlobal.infohdr.width*bmpGlobal.infohdr.height*2/8 -1;
	for (i=0; i<nb;i++)
	{
		if (++col >= (int)(bmpGlobal.infohdr.width/4))
		{
			fprintf (fpo,"\n");
			col = 0;
		}
		fprintf (fpo,"0x%.2X, ", pImageData[i]);
	}
	fprintf (fpo,"0x%.2X", pImageData[i]);
	return 0;
}
#else
int bmpPrintData (FILE *fpo)
{
	int i, j;
	int nbrow, nbcol;
	int count;
	BYTE bmpOutput;
	int  actualCol;
	int  nbbyte;

	nbrow = bmpGlobal.infohdr.height;
	nbcol = bmpGlobal.infohdr.width;
	nbbyte = 0;
	//printf ("%d:%d\n",nbrow,nbcol);
	actualCol = newWidth;
	count = 0;
	for (i=0; i<nbrow;i++)
	{
		for (j=0; j<nbcol; j++)
		{
			//printf ("cnt=%d (%d,%d)\n",count,i*actualCol+j,pImageData[i*actualCol+j]);
			switch (count)
			{
			case 0:
				bmpOutput = pImageData[i*actualCol+j];
				break;
			case 1:
				bmpOutput <<= 2;
				bmpOutput |= pImageData[i*actualCol+j];
				break;
			case 2:
				bmpOutput <<= 2;
				bmpOutput |= pImageData[i*actualCol+j];
				break;
			case 3:
				bmpOutput <<= 2;
				bmpOutput |= pImageData[i*actualCol+j];
				if (++nbbyte >= 8)
				{
					fprintf (fpo,"0x%.2X,\n", bmpOutput);
					nbbyte = 0;
				}
				else
					fprintf (fpo,"0x%.2X, ", bmpOutput);
				count=-1;
				break;
			}
			count++;
		}
	}
	switch (count)
	{
	case 0:
		// alreay output, do nothing
		break;
	case 1:
		bmpOutput <<= 6;
		break;
	case 2:
		bmpOutput <<= 4;
		break;
	case 3:
		bmpOutput <<= 2;
		break;
	}
	fprintf (fpo,"0x%.2X", bmpOutput);
	return 0;
}
#endif

int bmpPrint2 (FILE *fpo)
{
	fprintf (fpo,"\n};\n");
	fprintf (fpo,"UGL_DIB imageDib%s = \n{\n",filename);
	fprintf (fpo,"%d,\n", bmpGlobal.infohdr.width);
	fprintf (fpo,"%d,\n",bmpGlobal.infohdr.height);
	fprintf (fpo,"%d,\n", bmpGlobal.infohdr.width);
	fprintf (fpo,"UGL_DIB_DIRECT,\n");
	fprintf (fpo,"UGL_DEVICE_COLOR,\n");
	fprintf (fpo,"0,\n");
	fprintf (fpo,"0,\n");
	fprintf (fpo,"imageData%s,\n",filename);
	fprintf (fpo,"0\n");
	fprintf (fpo,"};\n");

	return 0;
}

int bmpDecode (FILE *fpi, FILE *fpo)
{
	int index;
	int inp;
	int count;

	if (fpi == NULL) return -1;

	while ((inp=fgetc(fpi)) != EOF)
	{
		switch (bmpState)
		{
		case BMPSTATE_FILE_HDR:
			bmpProcessFileHdr (inp);
			break;
		case BMPSTATE_INFO_HDR:
			bmpProcessInfoHdr (inp);
			break;
		case BMPSTATE_RGB:
			if (pImageData == (BYTE*)NULL)
			{
				//pImageData = (BYTE*) malloc (bmpGlobal.infohdr.width*bmpGlobal.infohdr.height*2/8);
				pImageData = (BYTE*) malloc (newWidth*bmpGlobal.infohdr.height);
				//indexImageData = bmpGlobal.infohdr.width*bmpGlobal.infohdr.height*2/8;
				indexImageData = 0;
			}
			index = (indexFile - FILEINDEX_RGB)%4;
			count = (indexFile - FILEINDEX_RGB)/4;
			//printf ("index= %d count= %d\n", index,count);
			if (count == (bmpGlobal.infohdr.bitCount*bmpGlobal.infohdr.bitCount-1) &&
				index == 3) 
			{
				bmpState = BMPSTATE_DATA;
				bmpPrint1 (fpo);
			}
			else
				bmpProcessRgb (inp, index, count);
			break;
		case BMPSTATE_DATA:
			bmpProcessData (inp);
			break;
		}
		indexFile++;
	}
	bmpPrintData(fpo);
	bmpPrint2 (fpo);
	return 0;
}

⌨️ 快捷键说明

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