2

如何在 vc++ 6.0 和 vc++ 2005 中获得 GIF Transparency 颜色?

4

2 回答 2

1

请参阅GIF 规范。GIF 有多达 256 种可能颜色的调色板。背景颜色的调色板索引位于文件开头的偏移量 11 处,由一个字节组成(值 0-255)。要找到它对应的实际颜色,请在全局颜色表中查找该颜色。有关如何解析全局颜色表的更多信息,请参阅规范。

于 2008-12-04T06:43:52.153 回答
0

我刚刚实现了 GIF 解码器。以下是详细信息 - 万一

if(Graphics_Render_Block->transperencyflag) FrameInfo->transperencyindex=Graph_Renderblk.Transp_Clr_Index; 否则 FrameInfo->transperencyindex='\0';

逻辑很简单。在渲染到显示器上时,如果 transperencyindex == 该点的颜色,则不要渲染它。在面对,移动到下一个位置。

这是我的显示代码片段——我使用的是 Linux Framebuffer,但该逻辑也适用于 Microsoft VC。注意,这里我忽略了逻辑屏幕描述符。

void Display(FrameData *FrameInfo)
{

    /*short int ImageStartX = 0;
    short int ImageStartY = 0; */
    unsigned int ImageStartX = 0;
    unsigned int ImageStartY = 0;
    int Index = 0;

    printf("\r\n INFO: Display Called.\r\n");

    while(1)
    {

        Index = 0;
        ImageStartX = (FrameInfo->frameScreenInfo.LeftPosition);
        ImageStartY = (FrameInfo->frameScreenInfo.TopPosition);


        while(ImageStartY < ((FrameInfo->frameScreenInfo.ImageHeight)+(FrameInfo->frameScreenInfo.TopPosition)))
        {

            while(ImageStartX < ((FrameInfo->frameScreenInfo.ImageWidth)+(FrameInfo->frameScreenInfo.LeftPosition)))
            {
                if(FrameInfo->frame[Index] != FrameInfo->transperencyindex)
                {
                  #ifndef __DISPLAY_DISABLE
                  SetPixel(local_display_mem,ImageStartX,ImageStartY,((FrameInfo->CMAP)+(FrameInfo->frame[Index]))->Red,((FrameInfo->CMAP)+(FrameInfo->frame[Index]))->Green,((FrameInfo->CMAP)+(FrameInfo->frame[Index]))->Blue);
                  #endif

                   #ifdef DEBUG
                   count++;
                   #endif

                }


                Index++;
                ImageStartX++;
            }


            ImageStartY++;


            ImageStartX=(FrameInfo->frameScreenInfo.LeftPosition);


        }

        #ifdef DEBUG
        printf("INFO:..Dumping Framebuffer\r\n");
        printf("Pixel hit=%d\r\n",count);
        count = 0;
        printf("the Frameinfo.leftposition=%d FrameInfo->frameScreenInfo.topposition=%d\r\n",FrameInfo->frameScreenInfo.LeftPosition,FrameInfo->frameScreenInfo.TopPosition);
        printf("the Frameinfo.ImageWidth=%d FrameInfo->frameScreenInfo.ImageHeight=%d\r\n",FrameInfo->frameScreenInfo.ImageWidth,FrameInfo->frameScreenInfo.ImageHeight);
        #endif


       #ifndef __DISPLAY_DISABLE
       memcpy(fbp,local_display_mem,screensize);
       #endif

        /** Tune this multiplication to meet the right output on the display **/
        usleep((FrameInfo->InterFrameDelay)*10000);

        if( FrameInfo->DisposalMethod == 2)
        {
            printf("set the Background\r\n");
            #ifndef __DISPLAY_DISABLE
            SetBackground(FrameInfo);
            #endif
        }
        FrameInfo = FrameInfo->Next;

     }


}

我使用的设计是解码所有帧,并制作一个单循环链接列表。现在,继续显示帧。您可以从以下链接下载解码器逻辑和详细信息 - http://www.tune2wizard.com/gif-decoder/

于 2014-04-10T11:24:21.863 回答