方舟生存进化买哪个:BMP格式位图TC语言显示

来源:百度文库 编辑:神马品牌网 时间:2024/04/30 03:43:16
悬赏!!!!!!!!!!!!!!
课程设计编俄罗斯方块,如何在WIN-TC中或TC++3.0中把一张BMP格式的图片显示出来?
谢谢谢谢!!!!万分感谢!!!
错了哈,不是WIN_TC,就是用TC++3.0,是老师布置的课题啊!!

下面的是<<C & C++编程实例>>随书光盘上的代码,我在TC2.0下编译通过.
它是利用了抖动技术显示了8bit和24bit的位图(也就是256色和16M色位图),应该能满足你的需要.
不过,我想问下,你老师教过抖动显示吗?

#include <stdio.h>
#include <dos.h>
#include <stdio.h>
#include <conio.h>

#define NoError 0
#define ErrorFileOpen 1
#define ErrorFileType 2
#define ErrorImageColor 3

typedef struct tagBITMAPFILEHEADER
{
unsigned int bfType;
unsigned long bfSize;
unsigned int bfReserved1;
unsigned int bfReserved2;
unsigned long bfoffBits;
}BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER
{
unsigned long biSize;
unsigned long biWidth;
unsigned long biHeight;
unsigned int biPlanes;
unsigned int biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
unsigned long biXPelsPerMeter;
unsigned long biYPelsPerMeter;
unsigned long biClrUsed;
unsigned long biClrImportant;
} BITMAPINFOHEADER;

typedef struct tagRGBQUAD
{
unsigned char rgbBlue;
unsigned char rgbGreen;
unsigned char rgbRed;
unsigned char rgbReserved;
} RGBQUAD;

unsigned char PalReg[17]= { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
unsigned char StandardPal[48]= {
0, 0, 0, 32, 0, 0, 0,32, 0, 32,32, 0, 0, 0,32, 32, 0,32, 0,32,32, 32,32, 32,
48, 48,48, 63, 0, 0, 0,63, 0, 63,63, 0, 0, 0,63, 63, 0,63, 0,63,63, 63,63,63,
};
unsigned char LightnessMatrix [16][16]= {
{ 0,235,59,219,15,231,55,215,2,232,56,217,12,229,52,213},
{128,64,187,123,143,79,183,119,130,66,184,120,140,76,180,116},
{33,192,16,251,47,207,31,247,34,194,18,248,44,204,28,244},
{161,97,144,80,175,111,159,95,162,98,146,82,172,108,156,92},
{8,225,48,208,5,239,63,223,10,226,50,210,6,236,60,220},
{136,72,176,112,133,69,191,127,138,74,178,114,134,70,188,124},
{41,200,24,240,36,197,20,255,42,202,26,242,38,198,22,252},
{169,105,152,88,164,100,148,84,170,106,154,90,166,102,150,86},
{3,233,57,216,13,228,53,212,1,234,58,218,14,230,54,214},
{131,67,185,121,141,77,181,117,129,65,186,122,142,78,182,118},
{35,195,19,249,45,205,29,245,32,193,17,250,46,206,30,246},
{163,99,147,83,173,109,157,93,160,96,145,81,174,110,158,94},
{11,227,51,211,7,237,61,221,9,224,49,209,4,238,62,222},
{139,75,179,115,135,71,189,125,137,73,177,113,132,68,190,126},
{43,203,27,243,39,199,23,253,40,201,25,241,37,196,21,254},
{171,107,155,91,167,103,151,87,168,104,153,89,165,101,149,85},
};
unsigned char ColorTable[2][2][2]= {{{0,12},{10,14}},{{9,13},{11,15}}};
unsigned char ColorMap[256][3];

int ShowBmp(char *FileName);
int GetColor(unsigned char R,unsigned char G, unsigned char B,int X,int Y);
void SetVideoMode(unsigned char Mode);
void SetPalReg(unsigned char *palReg);
void SetDacReg(unsigned char *DacReg, int Color, int Count);
void PutPixel(int X, int Y, unsigned char Color);

/* 主函数 */
void main (int argc, char *argv[])
{
if(argc!=2)
{
printf("Usage:\tSHOW Filename.BMP\n");
exit(1);
}
ShowBmp(argv[1]);
}

/* 根据图像文件名,读取图像内容并利用抖动技术进行显示 */
int ShowBmp(char *FileName)
{
FILE *Fp;
BITMAPFILEHEADER FileHead;
BITMAPINFOHEADER InfoHead;
RGBQUAD RGB;
int N, W,Y,X,C,Color;
unsigned char Buffer[4096];

Fp=fopen(FileName,"rb");
if (Fp==NULL)
return(ErrorFileOpen);

fread(&FileHead,sizeof(BITMAPFILEHEADER),1,Fp);
if(FileHead.bfType!='BM')
{
fclose(Fp);
return(ErrorFileType);
}

fread(&InfoHead,sizeof(BITMAPINFOHEADER),1,Fp);
if(InfoHead.biBitCount!=8 && InfoHead.biBitCount!=24)
{
fclose(Fp);
return(ErrorImageColor);
}

/* 设置显示模式和显示区域 */
SetVideoMode(0x12);
SetPalReg(PalReg);
SetDacReg(StandardPal,0,16);

/* 对两种不同色彩数的图像分别进行处理 */
if(InfoHead.biBitCount==8) /* 256色 */
{
for (N=0;N<256;N++)
{
fread(&RGB, sizeof(RGBQUAD),1,Fp);
ColorMap[N][0]=RGB.rgbRed;
ColorMap[N][1]=RGB.rgbGreen;
ColorMap[N][2]=RGB.rgbBlue;
}
W=(InfoHead.biWidth+3)/4*4;
for(Y=InfoHead.biHeight-1;Y>=480;Y--)
fread(Buffer,sizeof(unsigned char),W,Fp);
for(;Y>0;Y--)
{
fread(Buffer,sizeof(unsigned char),W,Fp);
for (X=0;X<InfoHead.biWidth && X<640;X++)
{
C=Buffer[X];
Color=GetColor(ColorMap[C][0],ColorMap[C][1],ColorMap[C][2],X,Y);
PutPixel (X,Y,Color);
}
}
}
else /* 24bits真彩色 */
{
W=(InfoHead.biWidth*3+3)/4*4;
for(Y=InfoHead.biHeight-1;Y>639;Y--)
fread(Buffer,sizeof(unsigned char),W,Fp);
for(;Y>=0;Y--)
{
fread(Buffer,sizeof(unsigned char),W,Fp);
for(X=0;X<InfoHead.biWidth && X<640;X++)
{
C=X*3;
Color=GetColor(Buffer[C+2],Buffer[C+1],Buffer[C],X,Y);
PutPixel(X,Y,Color);
}
}
}

getch();
fclose(Fp);
SetVideoMode(0x03);
return(NoError);
}

int GetColor(unsigned char R, unsigned char G, unsigned char B, int X, int Y)
{
unsigned int L=LightnessMatrix[Y & 0x0F][X & 0x0F];
return(ColorTable[(unsigned int)R*256/255>L][(unsigned int)G*256/255>L][(unsigned int)B*256/255>L]);
}

void SetVideoMode(unsigned char Mode)
{
_AH=0x00;
_AL=Mode;
geninterrupt(0x10);
}

void SetPalReg(unsigned char *PalReg)
{
_ES=FP_SEG((unsigned char far*)PalReg);
_DX=FP_OFF((unsigned char far*)PalReg);
_AX=0x1002;
geninterrupt(0x10);
}

void SetDacReg(unsigned char *DacReg,int Color,int Count)
{
_ES=FP_SEG((unsigned char far*)DacReg);
_DX=FP_OFF((unsigned char far*)DacReg);
_AX=0x1012;
_BX=Color;
_CX=Count;
geninterrupt(0x10);
}

/* 在对应位置显示像素色彩 */
void PutPixel(int X, int Y, unsigned char Color)
{
_AH=0x0C;
_AL=Color;
_CX=X;
_DX=Y;
geninterrupt(0x10);
}

===

再给个实例链接,刚找到的:
http://www.turinger.com/article_view.asp?id=3

晕,为什么非要用这些编译器啊。。。