当前位置:我的异常网» C语言 » Turbo C下编程设置屏幕分辨率为1024*768,24位模式,
Turbo C下编程设置屏幕分辨率为1024*768,24位模式,BMP图片显示有有关问题
www.myexceptions.net 网友分享于:2015-09-07 浏览:0次
Turbo C下编程设置屏幕分辨率为1024*768,24位模式,BMP图片显示有问题
本帖最后由 zhangjunsheng18520 于 2013-10-03 18:03:37 编辑
这是源代码
#include
#include
/*定义一些结构,以获取BMP图片的信息*/
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;
long biWidth;
long biHeight;
unsigned int biPanes;
unsigned int biBitCount;
unsigned long biCompression;
unsigned long biSizeImage;
long biXPelsPerMeter;
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;
extern int b[10][10];
extern void SetVGAPalette(FILE *fp);
extern void ResumeVGAPalette();
extern int ShowBMP16(FILE *fp, int winLeft, int winTop, int winWidth, int winHeight, unsigned char TranColor);
extern int ShowBMP16Ex(FILE *fp, int winLeft, int winTop, int bmpLeft, int bmpTop, int bmpWidth, int bmpHeight, unsigned char TranColor);
void Set_Video_Mode(int mode);
void selectpage(char page);
unsigned char set_SVGA_mode(int vmode);
void Load_bmp_64(char *p,int x,int y);//文件地址,开始显示的X,y坐标
void Load_bmp_24(char *p,int x,int y);//文件地址,开始显示的X,y坐标
void Load_bmp_256(char *p,int x,int y);//文件地址,开始显示的X,y坐标
void Load_bmp_16(char *p);
void Set_Video_Mode(int mode)
{
union REGS inregs,outregs;
inregs.h.ah=0;
inregs.h.al=(unsigned char)mode;
int86(0x10,&inregs,&outregs);
}
void selectpage(char page) /*换页函数*/
{
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page; /*选择页面*/
int86(0x10,&r,&r);
}
unsigned char set_SVGA_mode(int vmode) /*设置SVGA屏幕模式*/
{
union REGS r;
r.x.ax=0x4f02;
r.x.bx=vmode;
int86(0x10,&r,&r);
return(r.h.ah);
}
void Load_bmp_24(char *p,int x,int y)
{
unsigned char page_new=0,page_old=0;
int i,j,k;
int b;
unsigned long position,length,width;
FILE *fp;
unsigned char write;
if((fp=fopen(p,"rb"))==NULL)
{
printf("Can't open file: %s",p);
return;
}
fseek(fp,18,SEEK_SET);
fread(&width,4,1,fp);
fread(&length,4,1,fp);
fseek(fp,28,SEEK_SET);
fread(&i,2,1,fp);
if(i!=24)
{
puts("Not a 24 color bitmap!");
fclose(fp);
exit(0);
}
set_SVGA_mode(0x118); /*硬件无关性初始化屏幕为1024*768 24模式*/
fseek(fp,54,SEEK_SET);
for(j = length-1;j >= 0;j--)
{
for(i=0;i
{
for(k=0;k<3;k++)
{
write=fgetc(fp);
position = 4*((j+y)*1024l+(i+x))+k; /*计算要显示点的显存位置*/
/*if((j=MS.y0)&&(i>=MS.x0)&&(i
{
b[j-MS.y0][i-MS.x0]=peek(0xa000,position%65536l);//用以保存鼠标器位置的背景
} */
page_new = position/65536L; /*计算显示页*/
if(page_new != page_old) /*当显示页不同时更换页面。*/
{
selectpage(page_new);
page_old = page_new;
}
pokeb(0xa0000000,position%65536L,write); /*写到显存位置*/
//pokeb(0xa000,position%65536l,b);
}
}
}
//show_mouse_24();
fclose(fp);
}
这是主函数
#include
#include
#include
#include
#include"c:\\tc30\\file\\BMPprint2.h"
int main(void)
{
Load_bmp_24("c:\\tc30\\file\\sinook.bmp",0,0);
getch();
closegraph();
return 0;
}
------解决思路----------------------
pokeb(0xa0000000,position%65536L,write); /*写到显存位置*/
这个会不会有问题
当数据超过65536L应该,修改段的位置,不应该换页吧
64k/16 = 2k 每16字节对应一个段偏移
每增加 64k
段地址增加64k/16 = 2k
段地址是 0xa000 + (position /65536L) *(65536L /16)
------解决思路----------------------
pokeb(0xa0000000,position%65536L,write); /*写到显存位置*/
改成pokeb(0xa0000000+(position /65536L) *(2048)* 16*16*16 ,position%65536L,write);
文章评论