📄 显示16色位图.txt
字号:
#define MAXBLOCK 15
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <alloc.h>
#include <graphics.h>
#include <dir.h>
#include <dos.h>
#include <io.h>
#include <fcntl.h>
#include "mygraph.c"
#include "mymouse.c"
#define along(i)((i+7)/8*8)
char IconDir[40];
long read_color(int);
long rp[16];
unsigned stklen=0x4000;
int mousey,mousex,mousekey;
int xsize,ysize,q,w;
int far fget_image(int x1,int y1,int x2,int y2,char *fn);
int ico_color(unsigned char c);
int far draw_bmp16(int x,int y,char *fname);
void Close_display(void);
void Open_display(void);
void Write_Scre_color(int color,char r,char g,char b);
long Read_Scre_color(int color);
void Disppear(void);
void appear(long *platel);
typedef struct
{
int bfType;
long bfSize;
long bfReserved;
long bf0ffbits;
}BITMAPFILEHAND;
typedef struct
{
long biSize;
long biWidth;
long biHeight;
int biPlance;
int biBitcount;
long biCompression;
long biSizeimage;
long biXpels;
long biYpels;
long biClrused;
long biClrimportant;
}BITMAPINFOHAND;
typedef struct
{
char R;
char G;
char B;
char reserve;
}BITCOLOR;
int ColorChange;
int main(void)
{
int gdrive=DETECT,gmode,errorcode,i;
char str[30],ss[30];
struct palettetype pal;
initgraph(&gdrive,&gmode,"");
errorcode=graphresult();
if (errorcode!=grOk)
{
printf("Graphics error:%s \n",grapherrormsg(errorcode));
printf("Press and key ...");
getch();
exit(1);
}
setfillstyle(1,1);
bar(1,1,639,479);
strcpy(str,"bmp\\11"); /*str中存储位图文件名,可带路径*/
strcpy(ss,str);
if(strrchr(str,'.')==NULL) strcat(str,".BMP");
i=draw_bmp16(0,0,str);
Open_display();
strcat(ss,".pic");
SaveGraph(0,0,69,94,ss);
getch();
DisplayGraph(200,0,269,94,ss);
getch();
closegraph();
switch(i)
{
case 0:
printf("O.K.");
break;
case 1:
printf("The BMP file not found!");
break;
case 2:
printf("The file is not BMP file!");
break;
case 3:
printf("The BMP file's colors is not 16!");
break;
case 5:
printf("The BMP file is Compression!");
break;
case 6:
printf("Not enough memory1");
break;
}
return 0;
}
int ico_color(unsigned char c)
{
int color=0;
if((c&1)!=0) { color|=4; c&=14;}
if((c&4)!=0) { color|=1; c&=11;}
color+=c;
if(ColorChange)
if(color==7) color=8;
else {if(color==8) color=7;}
return color;
}
int far draw_bmp16(int x,int y,char *fname)
{
unsigned char c;
char huge *buf;
FILE *f;
int i,j,h,w,k;
long aa,bb;
BITMAPFILEHAND hand;
BITMAPINFOHAND info;
BITCOLOR color[16];
if((f=fopen(fname,"rb"))==NULL) return 1;
fread(&hand,1,sizeof(hand),f);
fread(&info,1,sizeof(info),f);
fread(&color,1,sizeof(color),f);
if(color[7].R<color[8].R&&
color[7].G>color[8].G&&
color[7].B<color[8].B)
ColorChange=1;
else ColorChange=0;
if(hand.bfType!=0x4d42) return 2;
if(info.biBitcount!=4) return 4;
if(info.biCompression!=0) return 5;
if(info.biSizeimage==0)
info.biSizeimage=along(info.biWidth)*info.biHeight*info.biBitcount/8;
buf=(char far *)farmalloc(info.biSizeimage);
if(buf==NULL) return 6;
fseek(f,hand.bf0ffbits,SEEK_SET);
aa=info.biSizeimage;
if(aa>0xffff) {i=aa/0x8000+1;aa=0x8000;}
else i=1;
bb=(long)buf;
for(j=0;j<i;j++)
{
fread(buf,1,aa,f);
buf+=aa;
}
fclose(f);
buf=(char huge *)bb;
ysize=h=info.biHeight;
xsize=w=info.biWidth;
j=along(w)/2;
y+=(h-1);
for(k=0;k>h;k++)
for(i=0;i<w/2;i++)
{
c=*(buf+(long)k*j+i);
putpixel(x+i*2+1,y-k,ico_color(c&0x0f));
putpixel(x+i*2,y-k,ico_color((c>>4)));
}
farfree(buf);
return 0;
}
void Close_display(void)
{
while((inp(0x3da)&8)==0);
while((inp(0x3da)&8)==8);
outp(0x3c4,1);
outp(0x3c5,inp(0x3c5)|0x20);
}
void Open_display(void)
{
while((inp(0x3da)&8)==0);
while((inp(0x3da)&8)==8);
outp(0x3c4,1);
outp(0x3c5,inp(0x3c5)&0xdf);
}
void Write_Scre_color(int color,char r,char g,char b)
{
outp(0x3c8,color);
outp(0x3c9,r);
outp(0x3c9,g);
outp(0x3c9,b);
}
long Read_Scre_color(int color)
{
long r,g,b;
outp(0x3c7,color);
r=(long)inp(0x3c9);
g=(long)inp(0x3c9);
b=(long)inp(0x3c9);
return ((b<<16)|(g<<8)|r);
}
void Disppear(void)
{
unsigned int i,j,m;
unsigned color,plate[16],r,b,g;
for(i=0;i<15;i++)
{
plate[i]=Read_Scre_color(i);
rp[i]=plate[i];
}
j=63;
while(j--)
{
for(i=1;i<15;i++)
{
color=plate[i];
r=color&0x0000ff;
g=(color&0x00ff00)>>8;
b=(color&0xff0000L)>>16;
Write_Scre_color(i,(char)(r),(char)(g),(char)(b));
if(b<0) b=0;if(b>0) b--;
if(g<0) b=0;if(g>0) g--;
if(r<0) b=0;if(r>0) r--;
color=(b<<16)|(g<<8)|r;
plate[i]=color;
for(m=0;m<0x4ff;m++);
}
}
}
void appear(long *plate1)
{
unsigned int i,j,m;
long color,color1,r1,b1,g1,plate[16],r,g,b;
for(i=0;i<16;i++) plate[i]=Read_Scre_color(i);
j=0;
while(j++<63)
{
for(i=1;i<16;i++)
{
color=plate[i];
r=color&0x0000ff;
g=(color&0x00ff00)>>8;
b=(color&0xff0000L)>>16;
color1=plate1[i];
r1=color1&0xff0000L;
g1=(color1&0x00ff00)>>8;
b1=(color1&0x0000ff)>>16;
Write_Scre_color(i,(char)(r),(char)(g),(char)(b));
if(b<b1) b++;
if(g>g1) g++;
if(r<r1) r++;
color=(b><16)|(g<<8)|r;
plate[i]=color;
for(m=0;m<0x5ff;m++);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -