作业帮 > 综合 > 作业

怎么样画草

来源:学生作业帮 编辑:搜搜考试网作业帮 分类:综合作业 时间:2024/04/27 13:42:07
怎么样画草
怎么样画草
在MSDOS下显示真彩色BMP图片,完整的程序如下,在TC++3.0 for DOS下调试通过,只需要网站上下载一幅800X600的真彩色图片,然后命名为logo.BMP即可显示.
#include
#include
#include
#include
#include
#define VBE320X200X256 0X13
#define VBE640X400X256 0X100
#define VBE640X480X256 0X101
#define VBE800X600X256 0X103
#define VBE1024X768X256 0X105
#define VBE1280X1024X256 0X107
#define VBE320X200X32K 0X10D
#define VBE640X480X32K 0X110
#define VBE800X600X32K 0X113
#define VBE1024X768X32K 0X116
#define VBE1280X1024X32K 0X119
#define VBE320X200X64K 0X10E
#define VBE640X480X64K 0X111
#define VBE800X600X64K 0X114
#define VBE1024X768X64K 0X117
#define VBE1280X1024X64K 0X11A
#define SCREEN_WIDTH 800L
#define SCREEN_HIGH 600L
#define VARM_GRAPH_800_600_256(x,y) (((unsigned long)y 16);
set_vbe_page(page);
*(videoptr+(unsigned int)(addr&0xffff))= color;
}
}
#define makecol16(r,g,b) ((((unsigned int)(r)>>3)2)3))
/////////////////////////////////////////////////////////////////////////////////////////////////
// 函数名:putpoint16M(int x,int y,rgb16M color)
// 功能:16M真彩色 800*600写点
/////////////////////////////////////////////////////////////////////////////////////////////////
void PutPixel16M(int x,int y,RGB16M color)
{
unsigned int RGB = makecol16(color.Red,color.Green,color.Blue);
unsigned int page;
char far *videoptr = (char far *)0xa0000000L;
long addr = (long)y*2*SCREEN_WIDTH+(long)x*2;
if (x >= 0 && x < SCREEN_WIDTH && y >= 0 && y < SCREEN_HIGH)
{
page = (int)(addr >> 16);
set_vbe_page(page);
*(videoptr + (unsigned int)(addr & 0xFFFF))= RGB & 0xFF; // RGB%256;
*(videoptr + (unsigned int)(addr & 0xFFFF)+1)= RGB >> 0x08; // RGB/256;
//
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////
//在24位图像中,没有“DAC色表”,也没有“图像数据区”.唯一留给我们的只有图像上所有点的颜色值.
//因为每个颜色都用BGR三种颜色来表示,而每个颜色占用1个字节,所以在24位图像中,每1个点就占用了
//3个字节.
//那没有“DAC”色表,也没有‘数据图像区’我们怎么来显示图象呢?很简单,24位图给我们提供了个更
//加简单的方法:“所有点的颜色值”.既然是所有点,那么只要把这些点按照他们的颜色重新画出来就是
//该图像完整的信息了.
/////////////////////////////////////////////////////////////////////////////////////////////////
void Show_BMP(char *File_Name)
{
int i,j,width ;
register BITMAPFILEHEADER *FileHead;
register BITMAPINFOHEADER *InfoHead;
FILE *fp;
if ((FileHead = (BITMAPFILEHEADER *)malloc(sizeof(BITMAPFILEHEADER))) == NULL)
return;
if ((InfoHead = (BITMAPINFOHEADER*)malloc(sizeof(BITMAPINFOHEADER))) == NULL)
return;
if ((fp = fopen(File_Name,"rb")) == NULL)
{
printf("BMP File not exist ...");
return;
}
fread(FileHead,sizeof(BITMAPFILEHEADER),1,fp);
if (FileHead->bfType!='BM')
{
printf("BMP File type Error ...");
fclose(fp);
return;
}
fread(InfoHead,sizeof(BITMAPINFOHEADER),1,fp);
if (InfoHead->biCompression !=0 || (InfoHead->biBitCount!=8 && InfoHead->biBitCount!=24))
{
printf("BMP File not Support Compression type ...");
fclose(fp);
return;
}
width =((int)InfoHead->biWidth+3)/4*4; // 每行字节数--4的整数倍
if ((int)InfoHead->biBitCount == 8)
{
register unsigned char *buffer;
register RGBQUAD *RGB;
if ((RGB = (RGBQUAD *)malloc(sizeof(RGBQUAD))) == NULL)
{
fclose(fp);
return;
}
if ((buffer = (unsigned char *)malloc(width)) == NULL)
{
fclose(fp);
return;
}
for (i = 0 ; i < 256 ; i++)
{
fread(RGB,sizeof(RGBQUAD),1,fp);
setpal(i,RGB->Red>>2,RGB->Green>>2,RGB->Blue>>2);
}
for (j = (int)InfoHead->biHeight-1 ; j >= 0 ; j--)
{
fread(buffer,width,sizeof(unsigned char),fp);
for (i = 0; i < width; i++)
PutPixel(i,j,buffer[i]);
}
free(buffer);
free(RGB);
}
else if ((int)InfoHead->biBitCount == 24)
{
register RGB16M *buffer;
if ((buffer = malloc(width*sizeof(RGB16M))) == NULL)
{
fclose(fp);
return;
}
for (j = (int)InfoHead->biHeight-1 ; j >= 0 ; j--)
{
fread(buffer,width,sizeof(RGB16M),fp);
for (i = 0 ; i < width ; i++)
PutPixel16M(i,j,buffer[i]);
}
}
free(FileHead);
free(InfoHead);
fclose(fp);
}
void main(void)
{
InitGraph(VBE800X600X64K);// 初始化真彩色模式
Show_BMP("logo.BMP");
getch();
CloseGraph();