主题:256色位图渐隐,怎样做
lezy
[专家分:0] 发布于 2006-05-16 16:44:00
在256色的图中,改变调色板,可实现渐隐效果。我用CreateDIBSection创建内存位图后,用bitblt显示出来。但是不知怎样改调色板,请指教
回复列表 (共5个回复)
沙发
lisypro [专家分:240] 发布于 2006-06-02 07:50:00
建议使用MS的DIBAPI库
它改调色板挺方便的
如果不明白的可以问我
板凳
zzg831 [专家分:0] 发布于 2006-06-04 23:08:00
我给你写一个函数:
void SetRegister(int index,RGBColor *ptr)
{
outp(0x3c6,0FF);
outp(0x3c8,index);
outp(0x3c9,ptr->red);
outp(0x3c9,ptr->green);
outp(0x3c9,ptr->blue);
}
index是颜色寄存器号,共有256个。
用上面的函数就可以改写颜色寄存器了。
3 楼
zzg831 [专家分:0] 发布于 2006-06-04 23:21:00
我以前写的一个程序:
#include <stdio.h>
#include <bios.h>
#include <dos.h>
#include <stdlib.h>
#define VGA256 0x13
#define PALETTE_MASK 0X3c6
#define PALETTE_REGISTER_RD 0x3c7
#define PALETTE_REGISTER_WR 0x3c8
#define PALETTE_DATA 0x3c9
typedef struct RGB_TYPE
{
unsigned char red;
unsigned char green;
unsigned char blue;
}RGBColor,*RGBColorPtr;
void Set_Mode_Asm(int mode)
{
asm mov ah,0
asm mov al,byte ptr mode
asm int 10h
}
void Set_Mode(int mode)
{
union REGS inregs,outregs;
inregs.h.ah=0;
inregs.h.al=(unsigned char)mode;
int86(0x10,&inregs,&outregs);
}
void Set_Palette_Register(int index,RGBColorPtr color)
{
outp(0x3c6,0xff);
outp(0x3c8,index);
outp(0x3c9,color->red);
outp(0x3c9,color->green);
outp(0x3c9,color->blue);
}
void LoadPcx(char *name,char far *pcx_buffer)
{
unsigned char far *image_buffer;
int count=0,end=320*200;
}
int main(void)
{ FILE *fp,*fp1,*fp2;
unsigned char far *video_buffer = (char far *)0xA0000000L;
unsigned char far *pcx_buffer;
unsigned char pcx_data;
int count=0,end=320*200;
int num_bytes;
int index;
RGBColor palette[256];
char ch;
int i;
Set_Mode_Asm(VGA256);
if((fp=fopen("c:/pic/71.pcx","rb"))==NULL)
{
printf("Cannot open the file\n");
getch();
exit(0);
}
fseek(fp,128L,SEEK_SET);
while(count<=(unsigned int)end)
{
pcx_data=fgetc(fp);
if(pcx_data>=192&&pcx_data<=255)
{
num_bytes=pcx_data-192;
pcx_data=fgetc(fp);
while(num_bytes-->0)
{
video_buffer[count++]=pcx_data;
}
}
else
{
video_buffer[count++]=pcx_data;
}
}
fseek(fp,-768L,SEEK_END);
for(index=0;index<256;index++)
{
palette[index].red =(fgetc(fp)>>2);
palette[index].green=(fgetc(fp)>>2);
palette[index].blue =(fgetc(fp)>>2);
}
fclose(fp);
/*if((fp1=fopen("c:\\zhang.bat","wb"))==NULL)
{
printf("cannot open the file zhang.bat!\n");
getch();
return -1;
} */
for(index=0;index<256;index++)
{
Set_Palette_Register(index,(RGBColorPtr)&palette[index]);
/*fputc(palette[index].red<<2,fp1);
fputc(palette[index].green<<2,fp1);
fputc(palette[index].blue<<2,fp1);
*/
}
//printf("hell0\n");
getch();
for(i=0;i<192;i++)
{
for(index=0;index<256;index++)
{
if(palette[index].red)palette[index].red-=1;
if(palette[index].green)palette[index].green-=1;
if(palette[index].blue)palette[index].blue-=1;
}
for(index=0;index<256;index++)
{
Set_Palette_Register(index,(RGBColorPtr)&palette[index]);
}
delay(50);
}
//printf("please pay any key\n");
//getch();
return 0;
}
用Windows画图软件把320*200的bmp图像转换为256色的pcx图片,上面的程序就可以用了,带渐隐效果的!
4 楼
acetuo [专家分:0] 发布于 2009-10-27 12:37:00
运行不了!!!!!!!!!!
5 楼
xu0xiang0 [专家分:90] 发布于 2009-11-02 00:12:00
<<windows程序设计>>中有这个例子,你可以自己去下载随书光盘,是第16章的FADER程序。
我来回复