| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1483 人关注过本帖, 1 人收藏
标题:[请教]tc 320X200 X256色模式下bmp图片显色与原图颜色不符!
只看楼主 加入收藏
yaonai2003
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-9-17
收藏(1)
 问题点数:0 回复次数:5 
[请教]tc 320X200 X256色模式下bmp图片显色与原图颜色不符!
下面这个是我根据网上bmp的格式,在win-tc下写的bmp图片显示程序,程序输出的图片和原图片颜色严重不同,我怀疑是调色板寄存器方面的设置不当,但是又不知道怎么处理,网上也查过相关资料,还是搞不定!
望达人来助!小生在这有礼了!

320X200X256色图片可以用绘图板做一个,名称为256.bmp,和源文件在同一个目录下就可以了,我没有写检测256bmp的代码!

#include<io.h>
#include<stdio.h>
#include<dos.h>
#include<string.h>
#include<math.h>
#include<stdio.h>
#include<bios.h>
#include<mem.h>
#include<fcntl.h>
#include<stdlib.h>
#include<conio.h>

#define RED 0
#define GREEN 1
#define BLUE 2

#define SCREEN_HEIGHT 200
#define SCREEN_WIDTH 320

#define PALETTE_MASK 0x3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA 0x3c9

#define VGA256 0x13
#define TEXT_MODE 0x03

unsigned char far *video_buffer=(char far *)0xa0000000L;

/* bmp图片格式  */
/*
typedef struct BMP_file
{
    unsigned int bfType;
    unsigned long bfSize;
    unsigned int Reserved1;
    unsigned int reserved2;
    unsigned long bfOffset;
}
bitmapfile;

typedef struct BMP_info
{
    unsigned long biSize;
    unsigned long biWidth;
    unsigned long biHeight;
    unsigned int biPlanes;
    unsigned int biBitCount;
    unsigned long biCompression;
    unsigned long biSizeImage;
    unsigned long biXpolsPerMeter;
    unsigned long biYpelsPerMeter;
    unsigned long biClrUsed;
    unsigned long biClrImportant;
}
bitmapinfo;


typedef struct RGB_BMP_typ
{
    unsigned char blue;
    unsigned char green;
    unsigned char red;
    unsigned char reserved;
}RGB_BMP,*RGB_BMP_ptr;

typedef struct bmp_picture_typ
    {
    bitmapfile file;
    bitmapinfo info;
    RGB_BMP palette[256];
    char far *buffer;

    } bmp_picture, *bmp_picture_ptr;
*/
/*
void Set_BMP_Palette_Register(int index,RGB_BMP_ptr color)
{
    outp(PALETTE_MASK,0xff);
    outp(PALETTE_REGISTER_WR,index);
    outp(PALETTE_DATA,color->red);
    outp(PALETTE_DATA,color->green);
    outp(PALETTE_DATA,color->blue);
}

  */

void BMP_Load_Screen(char *bmp)
{
 int i,j;
 unsigned int k=0;
 unsigned char *p=NULL;
 FILE *fp;

  char b[4];

 if ((fp=fopen(bmp,"r"))==NULL)
    {
     printf("can't open!") ;
     getch();
   exit(0);
   }

 for (i=0;i<256;i++)         /*读取bmp颜色到调色板寄存器*/
 {
   fread(&b[BLUE],1,1,fp);
   fread(&b[GREEN],1,1,fp);
   fread(&b[RED],1,1,fp);
   fread(&b[3],1,1,fp);
  b[RED]=b[RED]>>2;
  b[GREEN]=b[GREEN]>>2;
  b[BLUE]=b[BLUE]>>2;
  outp(PALETTE_MASK,0xff);
  outp(PALETTE_REGISTER_WR,i);
  outp(PALETTE_DATA,b[RED]);
  outp(PALETTE_DATA,b[GREEN]);
  outp(PALETTE_DATA,b[BLUE]);
   }

 for(i=SCREEN_HEIGHT-1;i>=0;i--)  /*读取bmp颜色到显存*/

 {
   fseek(fp,1078+(unsigned)i*SCREEN_WIDTH,SEEK_SET);
    for(j=0;j<SCREEN_WIDTH;j++)
     {
       fread(p,1,1,fp);
       video_buffer[k++]= *p;
     }
  }
 fclose(fp);

}

void Set_Video_Mode(int mode)    /*设置视频模式320X200X256色*/
{
    union REGS inregs,outregs;
    inregs.h.ah=0;
    inregs.h.al=(unsigned char)mode;
    int86(0x10,&inregs,&outregs);
}

int main()
{
    Set_Video_Mode(VGA256);
    BMP_Load_Screen("256.bmp");
    getch();
    Set_Video_Mode(TEXT_MODE);

}

[[it] 本帖最后由 yaonai2003 于 2008-4-25 12:14 编辑 [/it]]
搜索更多相关主题的帖子: bmp 显色 模式 颜色 
2008-04-25 11:40
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
就是,就是,我也曾经遇到这个问题
郁闷了一段时间之后 就不用这个 tc了
2008-04-25 13:44
yaonai2003
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-9-17
收藏
得分:0 
搞定了呵呵!
原来我向调色板中写的数据不对!在对颜色信息时加上对文件的定位就行了,呵呵!
问题解决了,心情倍好!

结贴!
2008-04-25 17:36
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
哈哈,向你学习,很敬业呀!!
哪里写 调色板 数据呢 ?
2008-04-25 18:20
yaonai2003
Rank: 1
等 级:新手上路
帖 子:22
专家分:0
注 册:2005-9-17
收藏
得分:0 
for (i=0;i<256;i++)         /*读取bmp颜色到调色板寄存器*/
{
   fread(&b[BLUE],1,1,fp);
   fread(&b[GREEN],1,1,fp);
   fread(&b[RED],1,1,fp);
   fread(&b[3],1,1,fp);
.......

前面加上 fseek(fp,54,SEEK_SET);就可以了!
2008-04-25 19:18
快速回复:[请教]tc 320X200 X256色模式下bmp图片显色与原图颜色不符!
数据加载中...
 
   



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

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