c语言像素排列坐标,tc 如何在指定坐标处 输出bmp图片??

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

/*获取当前SVGA屏幕模式*/

unsigned int get_SVGA_mode()

{

union REGS r;

r.x.ax=0x4f03;

int86(0x10,&r,&r);

return(r.x.bx);

}

/*设置调色板*/

void set_SVGA_palette(unsigned char r[], unsigned char g[], unsigned char b[])

{

int k;

for (k = 0; k < 256; k++) {

outportb(0x03C8,k);

outportb(0x03C9,r[k]>>2);

outportb(0x03C9,g[k]>>2);

outportb(0x03C9,b[k]>>2);

}

}

void main()

{

BITMAPFILEHEADER FileHeader;

BITMAPINFOHEADER bmiHeader;

RGBQUAD bmiColors[256];

unsigned char buffer[1024], r[256], g[256], b[256];

unsigned int width, height, linebytes;

long offset, position;

char page_new=0,page_old=0;

int i,j,k,n,savemode;

FILE *fp;

printf("Input filename:"); /*输入要显示的BMP文件路径*/

gets(buffer);

if((fp=fopen(buffer,"rb"))==NULL) /*判断打开文件是否正确*/

{

printf("Can't open file: %s",buffer);

return;

}

if (fread((char *)&FileHeader, sizeof(FileHeader), 1, fp) != 1) {

printf("Can't read file header !\n"); /* 读文件头 */

return;

}

if (FileHeader.bfType != 0X4D42) { /* BM */

fprintf(stderr, "Not a BMP file !\n");

return;

}

if (fread((char *)&bmiHeader, sizeof(bmiHeader), 1, fp) != 1) {

fprintf(stderr, "Can't read bmiHeader !\n"); /* 读信息头 */

return;

}

if (bmiHeader.biBitCount > 8) { /* 不能显示真彩色图像 */

fprintf(stderr, "Can not display ture color image !\n");

return;

}

if (bmiHeader.biCompression != 0) { /* 不能处理压缩图像 */

fprintf(stderr, "Not non-compressed image !\n");

return;

}

width = (unsigned int)bmiHeader.biWidth;

height = (unsigned int)bmiHeader.biHeight;

linebytes = ((width*(long)bmiHeader.biBitCount+31)/32)*4; /* 每行字节数--4的整数倍 */

if (fread((char *)&bmiColors[0], 4, 256, fp) != 256) { /* 读调色板数据 */

fprintf(stderr, "Can't get palette !\n");

return;

}

savemode=get_SVGA_mode(); /*先保存原来的屏幕模式*/

set_SVGA_mode(0x101); /*硬件无关性初始化屏幕为256色640*480模式*/

COLS=640;ROWS=480;

for (i = 0; i < 256; i++) {

r[i] = bmiColors[i].rgbRed;

g[i] = bmiColors[i].rgbGreen;

b[i] = bmiColors[i].rgbBlue;

}

set_SVGA_palette(r, g, b); /* 设置调色板 */

offset = FileHeader.bfOffBits;

fseek(fp, offset, SEEK_SET); /* 跳到位图数据的起始位置 */

for(j=height-1;j>=0;j--) {

fread(buffer,linebytes,1,fp);

for(i=0,n=0;i

position=j*(long)COLS+i; /*计算要显示点的显存位置*/

page_new=position/65536l; /*计算显示页*/

if(page_new!=page_old) /*当显示页不同时更换页面,提高一定的输出速度*/

{

selectpage(page_new);

page_old=page_new;

}

pokeb(0xa000,position%65536l,buffer[n]); /*写到显存位置*/

}

}

fclose(fp);

bioskey(0);

set_SVGA_mode(savemode); /*恢复屏幕*/

}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值