c语言编码改变分辨率,Turbo C下编程设置屏幕分辨率为1024*768,24位模式,BMP图片显示有有关问题...

当前位置:我的异常网» 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);

文章评论

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值