图形显示问题
这是一个BMP图片显示C程序,它要先按照BMP文件头中的调色板信息置调色板,然后再读取文件中的颜色索引号画图。但是由于每个图片中的调色板信息都不一样,每画一幅图都要置一次调色板,但是这样其他图片的显示就会因为调色板的改变而显示不正常。比如该程序中:
显示0.bmp (正常)
显示1.bmp (1.bmp显示正常,0.bmp显示异常)
再显示0.bmp (两张0.bmp显示都正常,1.bmp显示异常)
因为这个原因,编程中用到的图像都得放在同一个图片中,如果图像都一样大还比较简单,图像不一样大的时候就相当麻烦了。所以我想知道如何可以不用更改调色板就能正常显示BMP图片(比如把BMP图片中的调色板信息和颜色索引号转换成系统默认的调色板信息)或者可以置调色板后只影响该图片的显示,而屏幕其他部分不受影响。
麻烦王老师给一个解决办法,最好有源程序,谢谢啦。
还有我对JPG和GIF的显示也挺感兴趣,不过一直没有弄明白这两种文件结构,希望高手可以解释一下,重点是对显示有影响的部分,比如类似BMP中的宽度高度和调色板信息等,好像这两种文件格式比较复杂,压缩方式也比较多,我不知道自己现在能不能完全理解解压缩问题,不过还是希望老师能给出一种现在比较标准的或者说通用的JPG和GIF文件的结构、压缩方式和显示方法。
我的邮箱:YISUFUYOU@163.COM
#include "graphics.h"
#include "Svga256.h"
#include "stdio.h"
#include "fcntl.h"
#include "malloc.h"
#include "io.h"
int huge Return_SVGA256(void)
{
return(SVGA640x400x256); /* 返回各种分辨率的对应编号 0~6 宏定义参见 Svga256.h */
}
int bmp_main(char*bmpname,int x0,int y0)
{
int width, height,i,j,fp;
unsigned char fix, *buffer, pix24b[4];
DacPalette256 dac256;
if((fp = open(bmpname, O_RDONLY | O_BINARY)) == -1)
{
printf("Can't find file:%s ",bmpname);
getch();
return 1;
}
lseek(fp, 18, SEEK_SET);
read(fp, &width, 4);
read(fp, &height, 4);
fix = (width % 4) ? (4 - width % 4) : 0;
lseek(fp, 54, SEEK_SET);
for(i = 0; i < 256; i++) /* 按照该图片的DAC色表设置色彩寄存器 */
{
read(fp, pix24b, 4); /* 读取DAC分量信息 */
/* 设置调色板 */
dac256[i][0] = pix24b[2] >> 2;
dac256[i][1] = pix24b[1] >> 2;
dac256[i][2] = pix24b[0] >> 2;
}
setvgapalette256(&dac256); /* 应用调色板, 定义参见 Svga256.h */
buffer = (unsigned char *)malloc(width);
for(j = height - 1; j >= 0; j--)
{
read(fp, buffer, width);
lseek(fp, fix, SEEK_CUR);
for(i = 0; i < width; i++)
putpixel(x0+i, y0+j, buffer[i]);
}
free(buffer);
close(fp);
}
main()
{
int i=DETECT, j=0;
installuserdriver("Svga256", Return_SVGA256); /* 对于svga256必需执行该函数以安装BGI驱动 */
initgraph(&i, &j, ""); /* 执行TC默认的BGI初始化函数 */
bmp_main("0.bmp",1,1);
getch();
bmp_main("1.bmp",50,50);
getch();
bmp_main("0.bmp",50,1);
getch();
closegraph();
}
显示0.bmp (正常)
显示1.bmp (1.bmp显示正常,0.bmp显示异常)
再显示0.bmp (两张0.bmp显示都正常,1.bmp显示异常)
因为这个原因,编程中用到的图像都得放在同一个图片中,如果图像都一样大还比较简单,图像不一样大的时候就相当麻烦了。所以我想知道如何可以不用更改调色板就能正常显示BMP图片(比如把BMP图片中的调色板信息和颜色索引号转换成系统默认的调色板信息)或者可以置调色板后只影响该图片的显示,而屏幕其他部分不受影响。
麻烦王老师给一个解决办法,最好有源程序,谢谢啦。
还有我对JPG和GIF的显示也挺感兴趣,不过一直没有弄明白这两种文件结构,希望高手可以解释一下,重点是对显示有影响的部分,比如类似BMP中的宽度高度和调色板信息等,好像这两种文件格式比较复杂,压缩方式也比较多,我不知道自己现在能不能完全理解解压缩问题,不过还是希望老师能给出一种现在比较标准的或者说通用的JPG和GIF文件的结构、压缩方式和显示方法。
我的邮箱:YISUFUYOU@163.COM
#include "graphics.h"
#include "Svga256.h"
#include "stdio.h"
#include "fcntl.h"
#include "malloc.h"
#include "io.h"
int huge Return_SVGA256(void)
{
return(SVGA640x400x256); /* 返回各种分辨率的对应编号 0~6 宏定义参见 Svga256.h */
}
int bmp_main(char*bmpname,int x0,int y0)
{
int width, height,i,j,fp;
unsigned char fix, *buffer, pix24b[4];
DacPalette256 dac256;
if((fp = open(bmpname, O_RDONLY | O_BINARY)) == -1)
{
printf("Can't find file:%s ",bmpname);
getch();
return 1;
}
lseek(fp, 18, SEEK_SET);
read(fp, &width, 4);
read(fp, &height, 4);
fix = (width % 4) ? (4 - width % 4) : 0;
lseek(fp, 54, SEEK_SET);
for(i = 0; i < 256; i++) /* 按照该图片的DAC色表设置色彩寄存器 */
{
read(fp, pix24b, 4); /* 读取DAC分量信息 */
/* 设置调色板 */
dac256[i][0] = pix24b[2] >> 2;
dac256[i][1] = pix24b[1] >> 2;
dac256[i][2] = pix24b[0] >> 2;
}
setvgapalette256(&dac256); /* 应用调色板, 定义参见 Svga256.h */
buffer = (unsigned char *)malloc(width);
for(j = height - 1; j >= 0; j--)
{
read(fp, buffer, width);
lseek(fp, fix, SEEK_CUR);
for(i = 0; i < width; i++)
putpixel(x0+i, y0+j, buffer[i]);
}
free(buffer);
close(fp);
}
main()
{
int i=DETECT, j=0;
installuserdriver("Svga256", Return_SVGA256); /* 对于svga256必需执行该函数以安装BGI驱动 */
initgraph(&i, &j, ""); /* 执行TC默认的BGI初始化函数 */
bmp_main("0.bmp",1,1);
getch();
bmp_main("1.bmp",50,50);
getch();
bmp_main("0.bmp",50,1);
getch();
closegraph();
}
...全文
相关推荐
基于Qt的图形显示蚁群算法求解TSP问题
**基于Qt的图形显示蚁群算法求解TSP问题****一、背景介绍**旅行商问题(Traveling Salesman Problem, TSP)是图论中的一个经典问题,它描述了一个旅行商如何在访问每个城市一次并返回起点的情况下
12864字符液晶图形显示方法
**初始化问题**:当使用USBISP烧写器为实验板供电时,显示正常;但改用USB供电后,出现第一个字符消失的问题。这可能是因为USB供电不稳定导致液晶初始化时间延长。 2.
哲学家就餐问题java swing图形显示
哲学家就餐问题java swing演示版,直观演示哲学家进餐情况。基于 java 1.6, eclipse kepler书写直接运行压缩包内:DiningPhilosophers.jar文件,或者把项
基于Qt图形显示的模拟退火法求解TSP问题
本文介绍了一个基于Qt框架的旅行商问题(TSP)求解器,采用模拟退火算法进行优化。代码实现了City和Thermo类,分别表示城市点及退火过程,并利用多线程确保数据安全。程序提供了图形界面,可显示城市
FEM 中的 3D 桁架分析\用户界面:提供任何 3D 桁架问题的简单用户界面、分析和图形显示。-matlab开发
**图形显示**:分析完成后,用户可以直观地看到结构的变形形状、应力分布、安全系数等关键信息。


