c图片问题 亟待解决 急急急!!!
这是一个BMP图片显示C程序,它要先按照BMP文件头中的调色板信息置调色板,然后再读取文件中的颜色索引号画图。但是由于每个图片中的调色板信息都不一样,每画一幅图都要置一次调色板,但是这样其他图片的显示就会因为调色板的改变而显示不正常。比如该程序中:
显示0.bmp (正常)
显示1.bmp (1.bmp显示正常,0.bmp显示异常)
再显示0.bmp (两张0.bmp显示都正常,1.bmp显示异常)
因为这个原因,编程中用到的图像都得放在同一个图片中,如果图像都一样大还比较简单,图像不一样大的时候就相当麻烦了。所以我想知道如何可以不用更改调色板就能正常显示BMP图片(比如把BMP图片中的调色板信息和颜色索引号转换成系统默认的调色板信息)或者可以置调色板后只影响该图片的显示,而屏幕其他部分不受影响。
麻烦高手给一个解决办法,谢谢啦。
还有我对JPG和GIF的显示也挺感兴趣,不过一直没有弄明白这两种文件结构,希望高手可以解释一下,重点是对显示有影响的部分,比如类似BMP中的宽度高度和调色板信息等,好像这两种文件格式比较复杂,压缩方式也比较多,我不知道自己现在能不能完全理解解压缩问题,不过还是希望老师能给出一种现在比较标准的或者说通用的JPG和GIF文件的结构、压缩方式和显示方法。
#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();
}