📄 bmpfmt.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 + -