| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2227 人关注过本帖
标题:256色显示的疑惑(继续求助)!
取消只看楼主 加入收藏
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
 问题点数:0 回复次数:9 
256色显示的疑惑(继续求助)!

我最近看了一本书,书上有一个硬件无关屏幕初始化程序(代码如下),能看256色的位图!
疑惑的是,在我电脑上运行后只得到一堆乱条!
左思右想,好几天都找不出原因,一直陷于迷惑!
#include <dos.h>
#include <stdio.h>
#include <process.h>
#include <bios.h>

/* 换页函数 */
void selectpage(register char page)
{
union REGS r;
r.x.ax=0x4f05;
r.x.bx=0;
r.x.dx=page;
int86(0x10,&r,&r);
}
/* 设置SVG屏幕模式 */
unsigned char set_SVGA_mode(int vmode)
{
union REGS r;
r.x.ax=0x4f02;
r.x.bx=vmode;
int86(0x10,&r,&r);
return r.h.ah;
}
/* 获取当前SVGA屏幕模式 */
unsigned int get_SVGA_mode()
{
union REGS r;
r.x.ax=0x4f03;
int86(0x10,&r,&r);
return r.x.bx;
}
void main()
{
char buffer[640],filename[64],page_new=0,page_old=0;
int i,j,k,r,g,b,savemode;
long position,width,length;
FILE *fp;
puts("This is a 256 color bmp viewer!Author:WuJin");
puts("Input filename:");
gets(filename);
if((fp=fopen(filename,"rb"))==NULL)
{
printf("Can't open file: %s",buffer);
return;
}
fseek(fp,28,SEEK_SET);
fread(&i,2,1,fp);
/* 检查是否为256色位图 */
if(i!=8)
{
puts("Not a 256 color bitmap!");
fclose(fp);
exit(0);
}
fseek(fp,18,SEEK_SET);
/* 获得位图的宽度 */
fread(&width,4,1,fp);
/* 获得位图的高度 */
fread(&length,4,1,fp);
/* 保存原来的屏幕模式 */
savemode=get_SVGA_mode();
/* 硬件无关初始化屏幕为640*480 256色模式 */
set_SVGA_mode(0x101);
fseek(fp,54,SEEK_SET);
/* 根据位图的RGB信息设置显示器的DAC色彩寄存器 */
for(i=0;i<256;i++)
{
b=fgetc(fp);
g=fgetc(fp);
r=fgetc(fp);
outportb(968u,i);
outportb(969u,r>>2);
outportb(969u,g>>2);
outportb(969u,b>>2);
fgetc(fp);
}
/* 宽度修正值 */
k=(width%4)?(4-width%4):0;
for(j=length-1;j>=0;j--)
{
fread(buffer,width,1,fp);
for(i=0;i<width;i++)
{
/* 计算要显示点的显存位置 */
position=j*640l+i;
/* 计算显示页 */
page_new=position/65536l;
/* 必要时更换界面 */
if(page_new!=page_old)
{
selectpage(page_new);
page_old=page_new;
}
/* 写入显存 */
pokeb(0xA000,position%65536l,buffer[i]);
}
fseek(fp,k,SEEK_CUR);
}
fclose(fp);
bioskey(0);
/* 恢复屏幕 */
set_SVGA_mode(savemode);
}
得到乱条的位图:

图片附件: 游客没有浏览图片的权限,请 登录注册

另外,如果查看下面的图形(因此图片的256色位图格式大于1M,故不能上传,请将下面的jpg图片改成256色位图)是,程序结束后,整个桌面全变成256色的,只有重启才能解决!
图片附件: 游客没有浏览图片的权限,请 登录注册

[此贴子已经被作者于2007-7-25 17:24:10编辑过]

搜索更多相关主题的帖子: 天都 
2007-07-24 17:51
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 
难道是我电脑的配置的问题?
系统是昨天重装的番茄花园!

真诚结交各路好友!
2007-07-24 21:07
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 

Intel(R) 82865G Graphics Controller


真诚结交各路好友!
2007-07-24 21:41
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 
对了,难道你运行得很正常吗?

真诚结交各路好友!
2007-07-24 21:42
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 
这些都是显卡的
:
内存范围 F0000000 - F7FFFFFF
内存范围 FE780000 - FE7FFFFF
输入/输出范围 EC00 - EC07
中断请求 16
输入/输出范围 03B0 - 03BB
输入/输出范围 03C0 - 03DF
内存范围 000A0000 - 000BFFFF

真诚结交各路好友!
2007-07-24 22:03
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 
0xA000估计是段地址,后面的0000估计是偏移量,而函数void pokeb(int segment,int offset,char value)中的segment即为段地址,而offset为偏移量!

真诚结交各路好友!
2007-07-24 23:23
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 
对的,1个小时以前我也找到了这个问题!
显示这张图片就出问题!
图片附件: 游客没有浏览图片的权限,请 登录注册

而这张就不出问题!
图片附件: 游客没有浏览图片的权限,请 登录注册


同样,显示这张出现问题!
图片附件: 游客没有浏览图片的权限,请 登录注册



[此贴子已经被作者于2007-7-25 10:17:29编辑过]


真诚结交各路好友!
2007-07-25 10:12
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 
而这张就OK!
图片附件: 游客没有浏览图片的权限,请 登录注册

[此贴子已经被作者于2007-7-25 10:21:49编辑过]


真诚结交各路好友!
2007-07-25 10:18
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 

我总结了一下产生错误的那类图片的生成步骤:
1,先用ie打开图片;
2,再保存为位图;
3,再另存为256色位图(直接打开,即用“画图”打开)。
而得到TC运行正确的图片的生成步骤:
1,用“图像处理”打开图片,并将其保存为位图文件;
2,然后再用“画图比第二类图片小很多!


[此贴子已经被作者于2007-7-25 10:33:06编辑过]


真诚结交各路好友!
2007-07-25 10:26
gaohaidong
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-6-8
收藏
得分:0 

其实,程序没有任何问题!
问题是我原来的256色位图有错误!
和我电脑的显卡有问题!

其实,今天早上是在机房的电脑上运行出来结果的!
我电脑上显卡的问题还没有找出来!

我的电脑的显卡信息:
Intel(R) 82865G Graphics Controller
制造商:Intel Corporation
位 置:PCI 总线 0、设备 2、功能 0
内存范围 F0000000 - F7FFFFFF
内存范围 FE780000 - FE7FFFFF
输入/输出范围 EC00 - EC07
中断请求 16
输入/输出范围 03B0 - 03BB
输入/输出范围 03C0 - 03DF
内存范围 000A0000 - 000BFFFF

机房的电脑的显卡信息:
Intel Corporation 810 Graphics Controller Hub
制造商:Intel Corporation
位 置:PCI 总线 0、设备 2、功能 0
机房电脑的显卡的类型:
内存范围:E0000000 - E3FFFFFF
内存范围:E6000000 - E607FFFF
输入输出范围:03B0 - 03BB
输入输出范围:03C0 - 03DF
内存范围:000A0000 - 000BFFFF


真诚结交各路好友!
2007-07-25 12:06
快速回复:256色显示的疑惑(继续求助)!
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035369 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved