回 帖 发 新 帖 刷新版面

主题:256色位图渐隐,怎样做

在256色的图中,改变调色板,可实现渐隐效果。我用CreateDIBSection创建内存位图后,用bitblt显示出来。但是不知怎样改调色板,请指教

回复列表 (共5个回复)

沙发

建议使用MS的DIBAPI库
它改调色板挺方便的
如果不明白的可以问我

板凳


我给你写一个函数:
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 楼


我以前写的一个程序:

#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 楼

运行不了!!!!!!!!!!

5 楼

<<windows程序设计>>中有这个例子,你可以自己去下载随书光盘,是第16章的FADER程序。

我来回复

您尚未登录,请登录后再回复。点此登录或注册