您的位置:IT教程网首页>操作系统教程>dos>DOS下看真彩BMP位图的小程序

DOS下看真彩BMP位图的小程序



您正在看的DOS教程是:DOS下看真彩BMP位图的小程序。
  很久以前编的DOS看真彩BMP位图的小程序给贴上来了,有兴趣的就自己编译着玩玩,里边还有我写的一个画直线的算法,不过很笨拙。初学者可以试着看看源码挺简单的,看到有不少人看这个贴子我就给注释了,不过画直线的函数就不用看了,很乱我自己都懒得看所以就没有注释
另外几个函数的功能在后面的跟贴我简单的介绍了一下

A.cmain文件

[code:1:9253783525]
#includelttdio.hgt;
#includelt;conio.hgt;
#include"a.h"

/*externvoidprint();
*externvoidinit(int);
*externvoidvinfo(int)
*externvoiddemo(int,int,int);
*externvoidPixel16HiC(int,int,int);
*externvoidPixel24TrC(uignedlongint,int,int);
*externvoidPixel256C(char,int,int);

*#defineHi15(R,G,B)
*#defineHiColor(R,G,B)R*2048 G*32 B
*#defineTrColor(R,G,B)R*65536 G*256 B
*#defineTr_HColor(R,G,B)
*#defineH_TColor(RGB)
*#defineT_HColor(RGB)
*/



main()
{
uignedinti,j,x,y;
FILE*f

if((fp=fopen("d:\\BC4\\Ship\\24.jpg","rb"))==NULL)/*自己选择路径*/
printf("Can'topen256.jpg\n");

init(Tr800_600);/*初始化显示模式为24位真彩色,800*600分辨率*/

readpic(fp);/*主函数*/
fclose(fp);

/*for(i=0;ilt;=767;i )
*line(i,i,1023,0,TrC(i,i*3,i/2));/*这里是画直线函数*/
*/
getch();
retur
}

[/code:1:9253783525]



BMP.C主文件,里边有画直线函数
[code:1:9253783525]
#includelttdio.hgt;
#includelt;alloc.hgt;
#includelt;dos.hgt;
#include"a.h"



uignedfar*readpic(FILE*fp)
{

structbmp_headfar*bhead;
intx,y;
uignedlongsize,length,width;
voidfar*farmem;
uignedcharfar*RG
chartemp[30],over;


fread(temp,30L,1,fp);/*读BMP文件头信息*/

bhead=(charfar*)tem

over=bhead-gt;width%4;/*BMP格式每行多出的位,我也不清楚为什么要多出这几位,当时我这里让我很头痛费了好大劲才查出来*/

width=bhead-gt;width*3 over;/*位图宽*/

if((farmem=farmalloc(width*10 10))==NULL)/*分配缓冲区因为DOS最大可分配内存是一个段64K字节这里我分配了位图宽度*10 10*/
printf("NotenoughMemory\n");

fseek(fp,bhead-gt;offset,0);/*读指针跳到位图数据起点*/

fread(farmem,width,10,fp);/*读位图数据到缓冲区*/

RGB=farmem;/*RGB画像素用的指针,每像素3个字节*/

for(y=bhead-gt;hight;ygt;=0;y--)/*bhead-gt;hight位图高度*/
{
for(x=0;xlthead-gt;width;x )/*bhead-gt;width位图宽度*/
{
Pixel24TrC(TrC(*(RGB 2),*(RGB 1),*RGB),x,y);/*画点*/
RGB=RGB 3;/*一个像素点3个字节*/
if(FP_OFF(RGB)==width*10 FP_OFF(farmem)||FP_OFF(RGB)==width*10 FP_OFF(farmem) 3)/*FP_OFF取远指针偏移,这个条件语句判断画完一个缓冲区*/
{
fread(farmem,width,10,fp);
RGB=farmem;
}/*把BMP位图分成缓冲区大小的段*/
}
RGB=RGB over;/*每行最后多出over个字节*/
}
farfree(farmem);


returnfarmem;

}


/*画直线函数*/

voidline(uignedlongleft_x,uignedlongleft_y,uignedlongright_x,uignedlongright_y,uignedlongcolor)
{

uignedlongx=left_x,y=left_y;
if(left_xgt;right_x)
if(left_ygt;right_y)
{
while(left_x-right_xgt;left_x-x)
{
Pixel24TrC(color,x,y);
if((left_x-right_x)gt;(left_y-right_y))
while((left_y-right_y)*(left_x-x)lt;(left_x-right_x)*(left_y-y))
{
x--;
Pixel24TrC(color,x,y);
}
x--;
if(ylt;=right_y)
continue;
if((left_y-right_y)gt;(left_x-right_x))
while((left_y-right_y)*(left_x-x)gt;(left_x-right_x)*(left_y-y))
{
y--;
Pixel24TrC(color,x,y);
}
y--;
};
while(ygt;right_y)
{
Pixel24TrC(color,x,y);
y--;


您正在看的DOS教程是:DOS下看真彩BMP位图的小程序。 };

}
else
{
while(xgt;right_x)
{
Pixel24TrC(color,x,y);
if((left_x-right_x)gt;(right_y-left_y))
while((right_y-left_y)*(left_x-x)lt;(left_x-right_x)*(y-left_y))
{
x--;
Pixel24TrC(color,x,y);
}
x--;
if(!(ylt;right_y))
continue;
if((right_y-left_y)gt;(left_x-right_x))
while((right_y-left_y)*(left_x-x)gt;(left_x-right_x)*(y-left_y))
{
y ;
Pixel24TrC(color,x,y);
}
y ;
};

while(ylt;=right_y)
{
Pixel24TrC(color,x,y);
y ;
};
}

else
if(left_ygt;right_y)
{
while(xlt;right_x)
{
Pixel24TrC(color,x,y);
if((right_x-left_x)gt;(left_y-right_y))
while((left_y-right_y)*(x-left_x)lt;(right_x-left_x)*(left_y-y))
{
x ;
Pixel24TrC(color,x,y);
}
x ;
if(left_y-ygt;left_y-right_y)
continue;
if((left_y-right_y)gt;(right_x-left_x))
while((left_y-right_y)*(x-left_x)gt;(right_x-left_x)*(left_y-y))
{
y--;
Pixel24TrC(color,x,y);
}
y--;
};

while(left_y-ylt;=left_y-right_y)
{
Pixel24TrC(color,x,y);
y--;
};
共4页: 上一页 1 [2] [3] [4] 下一页